您的位置:首页 > 其它

{CodeForces】788E New task && 汕头市队赛SRM06 D 五色战队

2017-07-18 23:34 267 查看

D 五色战队 SRM 06

背景&&描述

        游行寺家里人们的发色多种多样,有基佬紫、原谅绿、少女粉、高级黑、相簿白等。         日向彼方:吾令人观其气,气成五彩,此天子气也。         琉璃:我们是不是可以组个五人战队了?         游行寺家的n个人排成一排。第i个人的发色是Ai。         能组成战队的条件是:                 那五人假设是第a,b,c,d,e人(
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=2000007,N=200007,mod=1e9+7;
int read(){
int ans=0,f=1,c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
return ans*f;
}
int sum
,s
,ans;
struct node{int w,pos;}e
;
bool cmp(node a,node b){return a.w<b.w;}
int n,m,cnt,sz;
int L
,R
,root
;
void clear(){memset(sum,0,sizeof(sum));}
int lowbit(int x){return x&-x;}
void add(int x){
while(x<=n){
sum[x]++;
x+=lowbit(x);
}
}
int push_sum(int x){
int ans=0;
while(x){ans+=sum[x]; x-=lowbit(x);}
return ans;
}
struct note{
int l,r,sz;
int A,C,AB,BC,ABC;
}tr[M];
void up(int x){
int l=tr[x].l,r=tr[x].r;
tr[x].sz=(tr[l].sz+tr[r].sz)%mod;
tr[x].A=(tr[l].A+tr[r].A)%mod;
tr[x].C=(tr[l].C+tr[r].C)%mod;
tr[x].AB=(tr[l].AB+tr[r].AB+(LL)tr[l].A*tr[r].sz)%mod;
tr[x].BC=(tr[l].BC+tr[r].BC+(LL)tr[r].C*tr[l].sz)%mod;
tr[x].ABC=(tr[l].ABC+tr[r].ABC+(LL)tr[l].A*tr[r].BC+(LL)tr[l].AB*tr[r].C)%mod;
}
void mdf(int& x,int l,int r,int k,int v){
if(!x) x=++sz;
if(l==r){
tr[x].sz=1*v;
tr[x].A=L[k]*v;
tr[x].C=R[k]*v;
tr[x].AB=tr[x].BC=tr[x].ABC=0;
tr[x].l=tr[x].r=0;
return ;
}
int mid=(l+r)>>1;
if(k<=mid) mdf(tr[x].l,l,mid,k,v);
else mdf(tr[x].r,mid+1,r,k,v);
up(x);
}
int main()
{
n=read();
for(int i=1;i<=n;i++) e[i].w=read(),e[i].pos=i;
sort(e+1,e+1+n,cmp);
for(int i=1;i<=n;i++){
if(e[i].w!=e[i-1].w) cnt++;
s[e[i].pos]=cnt;
}
clear();
for(int i=1;i<=n;i++){
L[i]=push_sum(s[i]);
add(s[i]);
}
clear();
for(int i=n;i>=1;i--){
R[i]=push_sum(s[i]);
add(s[i]);
}
for(int i=1;i<=n;i++){
ans=(ans-tr[root[s[i]]].ABC+mod)%mod;
mdf(root[s[i]],1,n,i,1);
ans=(ans+tr[root[s[i]]].ABC)%mod;
}
int x,y;
m=read();
for(int i=1;i<=m;i++){
x=read(); y=read();
ans=(ans-tr[root[s[y]]].ABC+mod)%mod;
mdf(root[s[y]],1,n,y,x-1);
ans=(ans+tr[root[s[y]]].ABC)%mod;
printf("%d\n",ans);
}
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: