@Alpacadh
2019-02-16T17:01:12.000000Z
字数 7623
阅读 744
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;
else
return 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;
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;
if(y==1)
tree[k].ls=tree[k].rs=tree[k].all=1;
else
tree[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);
else
change_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);
else
change_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);
else
change_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;
}