标签:
greedisland.in
输出文件:greedisland.out
简单对比随手打了一个区间最大值线段树,然而才发现......
维护两个bit c1区间开始和c2区间结束
对于[l,r]加操作,add(c1,l,1);add(c2,r,1);
然后查询就是r之间开始的区间-l之前结束的区间(不包括l这个点)
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int N=1e5+5; inline int read(){ char c=getchar();int x=0,f=1; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} return x*f; } int n,M,Q,l,r; int c1[N],c2[N]; inline int lowbit(int x){return x&-x;} void add(int c[],int x,int d){ for(int i=x;i<=n;i+=lowbit(i)) c[i]+=d; } int sum(int c[],int x){ int res=0; for(int i=x;i>0;i-=lowbit(i)) res+=c[i]; return res; } int main(int argc, const char * argv[]){ freopen("greedisland.in","r",stdin); freopen("greedisland.out","w",stdout); n=read();M=read(); while(M--){ Q=read();l=read();r=read(); if(Q==1){add(c1,l,1);add(c2,r,1);} else printf("%d\n",sum(c1,r)-sum(c2,l-1)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/candy99/p/5946425.html