1. 程式人生 > >luogu P2184 貪婪大陸

luogu P2184 貪婪大陸

題意:

有一個長度為n的序列,有不同種類的地雷,現在有兩個操作。

[1]:將x~y區間布上一種沒有出現過(對於整個序列來說)的新種類地雷;

[2]:求x~y區間地雷的種類數。

思路:

一種新穎的思路。

對於i,j(i<=j),考慮維護兩個樹狀陣列,一棵維護j之前有多少個線段(指操作1)的開頭,記作sum1,一棵維護i之前有多少個線段(指操作1)的結尾,記作sum2,sum1-sum2即為所求。

問題就變成了樹狀陣列改點求段,即可。

程式碼:

#include<cstdio>
#include<algorithm>
#define lowbit(x) ((x)&(-(x)))
using namespace std;
struct node
{
	int x,d;
	int c[100010];
	void add(int x,int y,int n)
	{
		while(x<=n)
		{
			c[x]+=y;
			x+=lowbit(x);
		}
	}
	int getsum(int x)
	{
		int sum=0;
		while(x>=1)
		{
			sum+=c[x];
			x-=lowbit(x);
		}
		return sum;
	}
} a,b;
	int n,m,tot=0;
int main()
{
	int t,x,y;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d %d",&t,&x,&y);
		if(t==1)
		{
			a.add(x,1,n);
			b.add(y,1,n);
			tot++;
		}
		else
		{
			printf("%d\n",a.getsum(y)-b.getsum(x-1));
		}
	}
}