zoukankan      html  css  js  c++  java
  • 题解 P4692 【[Ynoi2016]谁的梦】

    Ynoi 中少见的不卡常题呢....虽说有 50 个数据点...

    果然还是道好题

    noteskey

    总之就是补集转化的思想,算出每种颜色选点的总方案减去不可行方案(就是不包含 该种颜色的点的区间选取方案)就是每种颜色的贡献

    然后就是考虑每种颜色把一个区间分成若干份,那么我们只需要算出这若干份区间内的子区间个数就行了

    具体操作也就是考虑每次加入一个点后会减去原来区间的贡献然后加上新的两个区间的贡献

    那么删除点也是同理

    复杂度 ((n+m)log(n+m)) ,说白了就是 (O(n ~log ~n))

    watch out

    要注意的就是这里需要离散化,当然修改操作中的值也是要加进离散化的数组中的,具体离散是开数组还是用 vector 就看喜好了...

    code

    代码还是比较短的,Ynoi 里这么短的代码都没有多少的...

    //by Judge
    #pragma GCC optimize("Ofast")
    #include<bits/stdc++.h>
    #define Rg register
    #define Pi pair<int,int>
    #define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
    #define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
    #define ll long long
    using namespace std;
    const int mod=19260817;
    const int M=5e5+3;
    typedef int arr[M];
    #ifndef Judge
    #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
    #endif
    char buf[1<<21],*p1=buf,*p2=buf;
    inline int mul(int x,int y){return 1ll*x*y%mod;}
    inline int dec(int x,int y){return x<y?x-y+mod:x-y;}
    inline int inc(int x,int y){return x+y>=mod?x+y-mod:x+y;}
    inline bool cmax(int& a,int b){return a<b?a=b,1:0;}
    inline bool cmin(int& a,int b){return a>b?a=b,1:0;}
    inline int read(){ int x=0,f=1; char c=getchar();
    	for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    	for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
    } char sr[1<<21],z[20];int CCF=-1,Z;
    inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
    inline void print(int x,char chr='
    '){
        if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
        while(z[++Z]=x%10+48,x/=10);
        while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
    } int n,m,ans,Ynoi=1; arr L,R,pos,len,a,inv,LN,ept,P;
    set<int> s[M]; vector<int> lr; map<Pi,int> gx;
    struct opts{ int x,y,z; }q[M];
    inline int C2(int x){return (1ll*x*(x-1)>>1)%mod;}
    inline int INV(int x){return x<=5e5?inv[x]:mul(mod-mod/x,INV(mod%x));}
    #define LL long long
    #define pii Pi
    #define md mod
    inline void insert(int col,int x){
    	int pre=*--s[col].lower_bound(x),suf=*s[col].upper_bound(x);
    	cmax(pre,L[pos[x]]-1),cmin(suf,R[pos[x]]+1); Pi xb=Pi(pos[x],col);
    	if(!gx.count(xb)) gx[xb]=C2(len[pos[x]]+1); int &v=gx[xb];
    	ans=inc(ans,ept[col]?0:LN[col]),LN[col]=mul(LN[col],INV(v));
    	v=inc(dec(v,C2(suf-pre)),inc(C2(x-pre),C2(suf-x)));
    	if(v) LN[col]=mul(LN[col],v); else ++ept[col];
    	ans=dec(ans,ept[col]?0:LN[col]),s[col].insert(x);
    }
    inline void erase(int col,int x){
    	int pre=*--s[col].lower_bound(x),suf=*s[col].upper_bound(x);
    	cmax(pre,L[pos[x]]-1),cmin(suf,R[pos[x]]+1); Pi xb=Pi(pos[x],col);
    	if(!gx.count(xb)) gx[xb]=C2(len[pos[x]]+1); int& v=gx[xb];
    	ans=inc(ans,ept[col]?0:LN[col]);
    	if(!v) --ept[col]; else LN[col]=mul(LN[col],INV(v));
    	v=dec(inc(v,C2(suf-pre)),inc(C2(x-pre),C2(suf-x))),LN[col]=mul(LN[col],v);
    	ans=dec(ans,ept[col]?0:LN[col]),s[col].erase(x);
    }
    int main(){ n=read(),m=read(),inv[1]=1;
    	fp(i,2,5e5) inv[i]=mul(mod-mod/i,inv[mod%i]);
    	fp(i,1,n) len[i]=read(),L[i]=R[i-1]+1,R[i]=R[i-1]+len[i],
    		Ynoi=mul(Ynoi,C2(len[i]+1)),P[i]=P[i-1]+len[i];
    	fp(i,1,n) fp(j,L[i],R[i]) pos[j]=i,a[j]=read(),lr.push_back(a[j]);
    	fp(i,1,m) q[i].x=read(),q[i].y=read(),q[i].z=read(),lr.push_back(q[i].z);
    	sort(lr.begin(),lr.end()),lr.erase(unique(lr.begin(),lr.end()),lr.end());
    	fp(i,0,lr.size()) s[i].insert(0),s[i].insert(R[n]+1),LN[i]=Ynoi;
    	fp(i,1,R[n]) a[i]=lower_bound(lr.begin(),lr.end(),a[i])-lr.begin(),insert(a[i],i);
    	for(Rg int i=(print(ans),1);i<=m;++i,print(ans)){ int id=P[q[i].x-1]+q[i].y;
    		erase(a[id],id),insert(a[id]=lower_bound(lr.begin(),lr.end(),q[i].z)-lr.begin(),id);
    	} return Ot(),0;
    }
    
  • 相关阅读:
    Linux(CentOS6.5)下编译安装Nginx官方最新稳定版(nginx-1.10.0)
    Linux(CentOS6.5)修改系统市区被中国标准时间(北京时间)
    Linux(以CentOS6.5示例)下安装Oracle官方最新版JDK(JDK1.8)
    Linux发行版 CentOS6.5下删除分区操作
    Linux发行版 CentOS6.5下的分区操作
    Linux发行版 CentOS6.5 禁用防火墙步骤
    [置顶] drools规则引擎因为内存泄露导致的内存溢出
    架构师必读经典
    Google Chart API学习(二)
    Google Chart API学习(一)
  • 原文地址:https://www.cnblogs.com/Judge/p/10721269.html
Copyright © 2011-2022 走看看