luogu P2184 貪婪大陸
阿新 • • 發佈:2019-02-10
題意:
有一個長度為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)); } } }