洛谷 2184 贪婪大陆

【题解】

  这是一道区间覆盖的题目,我们可以用树状数组或者线段树来解决。显然,每个区间 [L,R] 被多少条线段覆盖这样计算:R左边的线段的左端点数-L左边的线段的右端点数

  这样,我们分别维护1~Pos位置上左端点、右端点的个数即可。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define lowbit (x&(-x))
 4 using namespace std;
 5 const int maxn=200010;
 6 int suml[maxn],sumr[maxn],n,m,opt,l,r;
 7 inline int read(){
 8     int k=0,f=1; char c=getchar();
 9     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
10     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
11     return k*f;
12 }
13 void add(int type,int x){
14     if(type==1) for(;x<=n;x+=lowbit) suml[x]++;
15     else for(;x<=n;x+=lowbit) sumr[x]++;
16 }
17 int query(int type,int x){
18     if(type==1){ int ret=0; for(;x;x-=lowbit) ret+=suml[x]; return ret;}
19     else{int ret=0; for(;x;x-=lowbit) ret+=sumr[x]; return ret;}
20 }
21 int main(){
22     n=read(); m=read();
23     while(m--){
24         if(read()==1){
25             l=read(); r=read(); 
26             add(1,l); add(2,r);
27         }
28         else{
29             l=read(); r=read();
30             printf("%d\n",query(1,r)-query(2,l-1));
31             //printf("QAQ%d %d\n",query(2,l-1),query(1,r));
32         }
33     }
34     return 0;
35 }
View Code

 

posted @ 2018-01-05 20:04  Driver_Lao  阅读(196)  评论(0编辑  收藏  举报