10 10 5
state 0
groupchange 2 9 7
state 9
groupchange 0 2 10
change 0 -5
0
7
7
3
-3
HINT
题意: 输入 :c n q ->给你初始[0,c)去为0的区间,q个操作,n是区间数的上限,即不能超过n
q次操作: state id 输出下标为id 的数
groupchange l r val 区间【l,r】上的每个数:val>0,加1 val次,如果有一个数==n,停止操作;
val<0,减1 val次,如果有一个数==0,停止操作;输出实际加或减的次数。
change l val 同上,改为单点操作
题解:线段树维护区间最大值计最小值。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> #include<cstdlib> #include<set> #include<queue> #include<stack> #include<vector> #include<map> #define N 4587530 #define Mod 10000007 #define lson l,mid,idx<<1 #define rson mid+1,r,idx<<1|1 #define lc idx<<1 #define rc idx<<1|1 const double EPS = 1e-11; const double PI = acos ( -1.0 ); const double E = 2.718281828; typedef long long ll; const int INF = 100010; using namespace std; struct node { int Max; int Min; int se; } tree[N<<2]; int n,c,q; int Max,Min; void push_up(int idx) { tree[idx].Max=max(tree[lc].Max,tree[rc].Max); tree[idx].Min=min(tree[lc].Min,tree[rc].Min); } void build(int l,int r,int idx) { tree[idx].se=0; if(l==r) { tree[idx].Max=0; tree[idx].Min=0; return; } int mid=(l+r)>>1; build(lson); build(rson); push_up(idx); } void push_down(int idx) { if(tree[idx].se) { tree[lc].se+=tree[idx].se; tree[rc].se+=tree[idx].se; tree[lc].Max+=tree[idx].se; tree[lc].Min+=tree[idx].se; tree[rc].Max+=tree[idx].se; tree[rc].Min+=tree[idx].se; tree[idx].se=0; } } void updata(int l,int r,int idx,int x,int y,int val) { if(l>=x&&r<=y) { tree[idx].Max+=val; tree[idx].Min+=val; tree[idx].se+=val; return; } push_down(idx); int mid=(l+r)>>1; if(x<=mid)updata(lson,x,y,val); if(y>mid)updata(rson,x,y,val); push_up(idx); } int query(int l,int r,int idx,int x,int y) { if(l>=x&&r<=y) { Min=min(tree[idx].Min,Min); return tree[idx].Max; } push_down(idx); int mid=(l+r)>>1; int res=0; if(x<=mid)res=max(res,query(lson,x,y)); if(y>mid)res=max(res,query(rson,x,y)); return res; } int main() { //freopen("in.txt","r",stdin); while(~scanf("%d%d%d",&c,&n,&q)) { char s[20]; int l,r,val; build(1,c,1); while(q--) { scanf("%s",s); if(s[0]=='s') { scanf("%d",&l); printf("%d\n",query(1,c,1,l+1,l+1)); } else if(s[0]=='g') { scanf("%d%d%d",&l,&r,&val); Min=INF; if(val==0) { printf("0\n"); continue; } int x=query(1,c,1,l+1,r+1); // printf("x=%d\n",x); if(val>0) { if(n-x>=val) { printf("%d\n",val); updata(1,c,1,l+1,r+1,val); } else { printf("%d\n",n-x); updata(1,c,1,l+1,r+1,n-x); } } else { int v=-val; if(Min>=v) { printf("%d\n",val); updata(1,c,1,l+1,r+1,val); } else { printf("%d\n",-1*Min); updata(1,c,1,l+1,r+1,-1*Min); } } } else { scanf("%d%d",&l,&val); if(val==0) { printf("0\n"); continue; } Min=INF; int x=query(1,c,1,l+1,l+1); if(val>0) { if(n-x>=val) { printf("%d\n",val); updata(1,c,1,l+1,l+1,val); } else { printf("%d\n",n-x); updata(1,c,1,l+1,l+1,n-x); } } else { int v=-val; if(Min>=v) { printf("%d\n",val); updata(1,c,1,l+1,l+1,val); } else { printf("%d\n",-1*Min); updata(1,c,1,l+1,l+1,-1*Min); } } } } } return 0; }
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/46369727