标签:please shu click can %s max push turn inpu
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Others)
Total Submission(s): 1791 Accepted Submission(s): 772
分析:线段树模板改一改,维护最大值最小值就好了。
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <deque> #include <map> #define range(i,a,b) for(auto i=a;i<=b;++i) #define LL long long #define itrange(i,a,b) for(auto i=a;i!=b;++i) #define rerange(i,a,b) for(auto i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; int b[int(1e5+5)],n,q; template <class T> class segtree{ private: T *add,*cnt,*minb,*maxa; void pushup(int rt){ minb[rt]=min(minb[rt<<1],minb[rt<<1|1]); cnt[rt]=cnt[rt<<1]+cnt[rt<<1|1]; maxa[rt]=max(maxa[rt<<1],maxa[rt<<1|1]); } void pushdown(int rt){ if(add[rt]){ int v=add[rt]; add[rt]=0; maxa[rt<<1]+=v; maxa[rt<<1|1]+=v; add[rt<<1]+=v; add[rt<<1|1]+=v; } } public: explicit segtree(int len=int(1e5+5)){ add=new T[len<<2];fill(add,0); cnt=new T[len<<2];fill(cnt,0); minb=new T[len<<2];fill(minb,0); maxa=new T[len<<2];fill(maxa,0); } void build(int l,int r,int rt){ add[rt]=0; if(l==r){ cnt[rt]=maxa[rt]=0; minb[rt]=b[l]; return; } int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); pushup(rt); } void update(int L,int R,T c,int l,int r,int rt){ if(L<=l&&r<=R){ maxa[rt]++; if(maxa[rt]<minb[rt]){ ++add[rt]; return; } if(l==r&&maxa[rt]>=minb[rt]){ ++cnt[rt]; minb[rt]+=b[l]; return; } } pushdown(rt); int m=(l+r)>>1; if(L<=m)update(L,R,0,l,m,rt<<1); if(m<R)update(L,R,0,m+1,r,rt<<1|1); pushup(rt); } T query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R)return cnt[rt]; int m=(l+r)>>1; pushdown(rt); T ret=0; if(L<=m)ret+=query(L,R,l,m,rt<<1); if(m<R)ret+=query(L,R,m+1,r,rt<<1|1); return ret; } }; segtree<int>tree; void init(){} void solve(){ while(cin>>n>>q){ range(i,1,n)scanf("%d",b+i); tree.build(1,n,1); char op[6];int l,r; while(q--){ scanf("%s%d%d",op,&l,&r); if(op[0]==‘a‘)tree.update(l,r,0,1,n,1); else printf("%d\n",tree.query(l,r,1,n,1)); } } } int main() { init(); solve(); return 0; }
标签:please shu click can %s max push turn inpu
原文地址:https://www.cnblogs.com/Rhythm-/p/9375066.html