@Alpacadh
2019-02-16T09:01:12.000000Z
字数 7623
阅读 854
ACM
#include<bits/stdc++.h>//#include<iostream>//#include<algorithm>//#include<cmath>//#include<cstring>//#include<stdio.h>//#include<cstdlib>//#include<cstdio>using namespace std;const int inf=0x3f3f3f3f;const int N=5e4+5;const double eps=1e-4;typedef long long ll;typedef pair<int,ll> pil;struct node{int l,r,w,f;int mi,ma;int ls,rs,all;}tree[4*N+1];void build(int k,int ll,int rr){tree[k].l=ll,tree[k].r=rr;tree[k].ls=tree[k].rs=tree[k].all=rr-ll+1;if(tree[k].l==tree[k].r){// scanf("%d",&tree[k].w);return;}int m=(ll+rr)/2;build(k*2,ll,m);build(k*2+1,m+1,rr);// tree[k].w=tree[k*2].w+tree[k*2+1].w;}void down(int k){tree[k*2].f+=tree[k].f;tree[k*2+1].f+=tree[k].f;tree[k*2].w+=tree[k].f*(tree[k*2].r-tree[k*2].l+1);tree[k*2+1].w+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1);tree[k].f=0;}void up(int k){// tree[k].w=tree[k*2].w+tree[k*2+1].w;tree[k].ls=tree[2*k].ls;if(tree[k].ls==tree[2*k].r-tree[2*k].l+1)tree[k].ls+=tree[2*k+1].ls;tree[k].rs=tree[2*k+1].rs;if(tree[k].rs==tree[2*k+1].r-tree[2*k+1].l+1)tree[k].rs+=tree[2*k].rs;tree[k].all=max(tree[2*k].rs+tree[2*k+1].ls,max(tree[2*k].all,tree[2*k+1].all));}int ask_point(int k,int x){if(tree[k].l==tree[k].r||tree[k].all==0||tree[k].all==tree[k].r-tree[k].l+1){return tree[k].all;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(x<=m){if(x>=tree[2*k].r-tree[2*k].rs+1)return tree[k*2].rs+tree[k*2+1].ls;elsereturn ask_point(k*2,x);}else{if(x<=tree[2*k+1].l+tree[2*k+1].ls-1)return tree[2*k+1].ls+tree[k*2].rs;elsereturn ask_point(k*2+1,x);}}void change_point(int k,int x,int y){if(tree[k].l==tree[k].r){// tree[k].w+=y;if(y==1)tree[k].ls=tree[k].rs=tree[k].all=1;elsetree[k].ls=tree[k].rs=tree[k].all=0;return;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(x<=m)change_point(k*2,x,y);elsechange_point(k*2+1,x,y);up(k);}int ask_interval(int k,int a,int b){if(tree[k].l>=a&&tree[k].r<=b){return tree[k].w;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(a<=m)return ask_interval(k*2,a,b);if(b>m)return ask_interval(k*2+1,a,b);up(k);}void change_interval(int k,int a,int b,int y){if(tree[k].l>=a&&tree[k].r<=b){tree[k].w+=(tree[k].r-tree[k].l+1)*y;tree[k].f+=y;return;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(a<=m)change_interval(k*2,a,b,y);if(b>m)change_interval(k*2+1,a,b,y);up(k);}char s[10];int main(){int n,m;while(~scanf("%d%d",&n,&m)){stack<int>q;memset(tree,0,sizeof(tree));build(1,1,n);while(m--){scanf("%s",s);if(s[0]=='D'){int x;scanf("%d",&x);q.push(x);change_point(1,x,0);}else if(s[0]=='Q'){int x;scanf("%d",&x);printf("%d\n",ask_point(1,x));}else{int top=q.top();q.pop();change_point(1,top,1);}}}return 0;}
//#include<bits/stdc++.h>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<stdio.h>#include<cstdlib>#include<cstdio>using namespace std;const int inf=0x3f3f3f3f;const int N=1e5+5;const double eps=1e-4;typedef long long ll;typedef pair<int,ll> pil;struct node{int l,r;ll w,f;int mi,ma;int ls,rs,all;}tree[4*N+1];void down(int k){tree[k*2].f+=tree[k].f;tree[k*2+1].f+=tree[k].f;tree[k*2].w+=tree[k].f*(tree[k*2].r-tree[k*2].l+1);tree[k*2+1].w+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1);tree[k].f=0;}void up(int k){tree[k].w=tree[k*2].w+tree[k*2+1].w;// tree[k].ls=tree[2*k].ls;// if(tree[k].ls==tree[2*k].r-tree[2*k].l+1)// tree[k].ls+=tree[2*k+1].ls;// tree[k].rs=tree[2*k+1].rs;// if(tree[k].rs==tree[2*k+1].r-tree[2*k+1].l+1)// tree[k].rs+=tree[2*k].rs;// tree[k].all=max(tree[2*k].rs+tree[2*k+1].ls,max(tree[2*k].all,tree[2*k+1].all));}void build(int k,int ll,int rr){tree[k].l=ll,tree[k].r=rr;// tree[k].ls=tree[k].rs=tree[k].all=rr-ll+1;if(tree[k].l==tree[k].r){tree[k].w=0;// scanf("%d",&tree[k].w);return;}int m=(ll+rr)/2;build(k*2,ll,m);build(k*2+1,m+1,rr);up(k);}ll ask_point(int k,int x){if(tree[k].l==tree[k].r){return tree[k].w;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(x<=m){return ask_point(k*2,x);}else{return ask_point(k*2+1,x);}}void change_point(int k,int x,int y){if(tree[k].l==tree[k].r){tree[k].w+=y;return;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(x<=m)change_point(k*2,x,y);elsechange_point(k*2+1,x,y);up(k);}ll ans;void ask_interval(int k,int a,int b){if(tree[k].l>=a&&tree[k].r<=b){ans+=tree[k].w;return;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(a<=m)ask_interval(k*2,a,b);if(b>m)ask_interval(k*2+1,a,b);}void change_interval(int k,int a,int b,int y){if(tree[k].l>=a&&tree[k].r<=b){tree[k].w+=(tree[k].r-tree[k].l+1)*y;tree[k].f+=y;return;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(a<=m)change_interval(k*2,a,b,y);if(b>m)change_interval(k*2+1,a,b,y);up(k);}char s[10];int main(){int n,m;scanf("%d%d",&n,&m);build(1,1,n);for(int i=1;i<=n;i++){int a;scanf("%d",&a);change_point(1,i,a);}while(m--){scanf("%s",s);if(s[0]=='Q'){int a,b;scanf("%d%d",&a,&b);ans=0;ask_interval(1,a,b);printf("%lld\n",ans);}else{int a,b,c;scanf("%d%d%d",&a,&b,&c);change_interval(1,a,b,c);}}return 0;}
#include<bits/stdc++.h>//#include<iostream>//#include<algorithm>//#include<cmath>//#include<cstring>//#include<stdio.h>//#include<cstdlib>//#include<cstdio>using namespace std;const int inf=0x3f3f3f3f;const int N=1e6+5;const double eps=1e-4;typedef long long ll;typedef pair<int,ll> pil;struct node{int l,r;ll w,f;int mi,ma;int ls,rs,all;}tree[4*N+1];void down(int k){tree[k*2].f+=tree[k].f;tree[k*2+1].f+=tree[k].f;tree[k*2].w+=tree[k].f*(tree[k*2].r-tree[k*2].l+1);tree[k*2+1].w+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1);tree[k].f=0;}void up(int k){tree[k].w=tree[k*2].w+tree[k*2+1].w;// tree[k].ls=tree[2*k].ls;// if(tree[k].ls==tree[2*k].r-tree[2*k].l+1)// tree[k].ls+=tree[2*k+1].ls;// tree[k].rs=tree[2*k+1].rs;// if(tree[k].rs==tree[2*k+1].r-tree[2*k+1].l+1)// tree[k].rs+=tree[2*k].rs;// tree[k].all=max(tree[2*k].rs+tree[2*k+1].ls,max(tree[2*k].all,tree[2*k+1].all));}void build(int k,int ll,int rr){tree[k].l=ll,tree[k].r=rr;// tree[k].ls=tree[k].rs=tree[k].all=rr-ll+1;if(tree[k].l==tree[k].r){tree[k].w=0;// scanf("%d",&tree[k].w);return;}int m=(ll+rr)/2;build(k*2,ll,m);build(k*2+1,m+1,rr);up(k);}ll ask_point(int k,int x){if(tree[k].l==tree[k].r){return tree[k].w;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(x<=m){return ask_point(k*2,x);}else{return ask_point(k*2+1,x);}}void change_point(int k,int x,int y){if(tree[k].l==tree[k].r){tree[k].w+=y;return;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(x<=m)change_point(k*2,x,y);elsechange_point(k*2+1,x,y);up(k);}ll ans;void ask_interval(int k,int a,int b){if(tree[k].l>=a&&tree[k].r<=b){ans+=tree[k].w;return;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(a<=m)ask_interval(k*2,a,b);if(b>m)ask_interval(k*2+1,a,b);}void change_interval(int k,int a,int b,int y){if(tree[k].l>=a&&tree[k].r<=b){tree[k].w+=(tree[k].r-tree[k].l+1)*y;tree[k].f+=y;return;}if(tree[k].f)down(k);int m=(tree[k].l+tree[k].r)/2;if(a<=m)change_interval(k*2,a,b,y);if(b>m)change_interval(k*2+1,a,b,y);up(k);}int a[N],b[N];ll ansl[N],ansr[N];int main(){int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}sort(b+1,b+1+n);int cnt=unique(b+1,b+1+n)-(b+1);//离散化操作for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;//离散化操作build(1,1,n);for(int i=n;i>=1;i--){ans=0;ask_interval(1,1,a[i]);ansr[i]=ans;change_point(1,a[i],1);}for(int i=1;i<=n;i++){ansl[i]=i-a[i]+ansr[i];}ll res=0;for(int i=1;i<=n;i++)res+=ansl[i]*ansr[i];printf("%lld\n",res);return 0;}