HDU ACM 4046 Panda 线段树或者树状数组

分析:该題可以用线段树做,也可以用树状数组做;感觉树状数组容易一些,这里就用树状数组了。这里保存字符数组的下标从1开始,树状数组初始化从3开始,因为只有大于等于3使才可能有符合要求的字串出现,最终计算L到R区间的个数时要用getsum(R)-getsum(L+1),因为可能有符合要求的str[L-1],str[L],str[l+1]也被算进去了,实际上他并不在区间L到R内。更新时要注意三种情况,POS,POS+1,POS+2处的都会受影响。

#include<iostream>
using namespace std;

int c[50010];
int n;
char str[50010];

int lowbit(int x)
{
	return x&(-x);
}

void update(int x,int v)
{
	int i;

	for(i=x;i<=n;i+=lowbit(i))
		c[i]+=v;
}

bool valid(char x,char y,char z)
{
	return x=='w' && y=='b' && z=='w';

}

void init()
{
	int i;

	memset(c,0,sizeof(c));
	for(i=3;i<=n;i++)
		if(valid(str[i-2],str[i-1],str[i]))
			update(i,1);

}

int getsum(int x)
{
	int sum,i;

	for(i=x,sum=0;i>0;i-=lowbit(i))
		sum+=c[i];
	return sum;
}

int main()
{

	int T,m,L,R,op,t;
	int pos,k;
	char r[4],ch;

	ios::sync_with_stdio(false);
	cin>>T;
	t=0;
	while(T--)
	{
		cin>>n>>m;
		cin>>(str+1);     //字符串从1开始编号
		init();

		cout<<"Case "<<++t<<":"<<endl;
		while(m--)
		{
			cin>>op;
			if(op==0)
			{
				cin>>L>>R;
				L++;
				R++;
				if(R-L<2)
					cout<<0<<endl;
				else //注意str[L-1],str[L],str[L+1]可能也符合要求,但不在区间范围内,所以减去L+1以便出去这种情况
					cout<<getsum(R)-getsum(L+1)<<endl;
			}
			else
			{
				cin>>pos>>ch;
				pos++;
				if(str[pos]==ch)
					continue;

				r[0]=str[pos-2];
				r[1]=str[pos-1];
				r[2]=ch;

				for(k=0;k<=2;k++)         //三种情况
				{
			    	if(pos>=3 && pos<=n)
					{
			    		if(valid(str[pos-2],str[pos-1],str[pos]) && !valid(r[0],r[1],r[2]))
			    			update(pos,-1);

			    		if(!valid(str[pos-2],str[pos-1],str[pos]) && valid(r[0],r[1],r[2]))
				    		update(pos,1);
					}
					pos++;
					if(k==0)
					{
						r[0]=str[pos-2];
			        	r[1]=ch;
			        	r[2]=str[pos];
					}
					else
					{
						r[0]=ch;
			        	r[1]=str[pos-1];
			        	r[2]=str[pos];
					}
				}
				str[pos-3]=ch;
			}
		}
	}
    return 0;
}
时间: 2024-10-13 16:00:16

HDU ACM 4046 Panda 线段树或者树状数组的相关文章

杭电 HDU ACM 1166 敌兵布阵(树状数组)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 55172    Accepted Submission(s): 23126 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU 4046 Panda(线段树)

题目大意:在一串字符串中某个区间查询wbw的数目,更新某个位置的字符 思路:线段树,每个枝结点记录以这个点为中心的字符是不是wbw,所以每次某个位置更新的时候,左右两个位置均要更新 而且查询的时候某个区间的wbw的个数,位于边界的字符的值不能算在内 //561MS 3400K 3373 B #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using names

HDU—4046 Panda (线段树)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4046 题意:给出一个字符串,统计这个字符串任意区间中"wbw"出现的次数. 规定两种操作,一是查询任意区间"wbw"出现次数:二是修改某一位置的字符. 分析:比较明显的线段树,单点更新,区间查询. 线段树记录的信息是区间中出现"wbw"字符的个数,线段树的叶子节点[i,i]记录字符串str中 str[i-2][i-1][i]是否是"wbw&qu

hdu 4046 Panda 树状数组

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4046 When I wrote down this letter, you may have been on the airplane to U.S. We have known for 15 years, which has exceeded one-fifth of my whole life. I still remember the first time we went to the mov

hdu acm 1166 敌兵布阵 (线段树)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 37903    Accepted Submission(s): 15985 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU ACM 4417 Super Mario 离线线段树

分析:离线线段树,把所有询问离线读入,然后按H从小到大排序.对于所有结点也按从小到大排序,然后根据查询的H,将比H小的点加入到线段树,最后就是一个区间求和.这题貌似也可以用划分树,树状数组等方法做. #include<iostream> #include<algorithm> using namespace std; #define N 100005 struct Tree { int left,right,cnt; } TREE[N<<2]; struct Query

当前插入的线段能完整覆盖存在的几条线段 树状数组 HDU 5372 Segment Game

http://acm.hdu.edu.cn/showproblem.php? pid=5372 Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1284    Accepted Submission(s): 375 Problem Description Lillian is a clever girl so

HDU 4217 Data Structure?(线段树 or 树状数组啊)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4217 Problem Description Data structure is one of the basic skills for Computer Science students, which is a particular way of storing and organizing data in a computer so that it can be used efficiently

HDU 1166 敌兵布阵 (线段树 &amp; 树状数组)

敌兵布阵 Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u SubmitStatus 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的