zoukankan      html  css  js  c++  java
  • [bzoj3052] [WC2013]糖果公园

    Description

    img

    Input

    img

    Output

    img

    Sample Input

    4 3 5
    1 9 2
    7 6 5 1
    2 3
    3 1
    3 4
    1 2 3 2
    1 1 2
    1 4 2
    0 2 1
    1 1 2
    1 4 2
    

    Sample Output

    84
    131
    27
    84
    

    Solution

    前置:浅谈莫队

    带修改莫队+树上莫队模板题。

    我这里的分块方法是在欧拉序上分块,块的大小为(n^{frac{2}{3}}),总复杂度为(O(n^frac{3}{5}))

    #include<bits/stdc++.h>
    using namespace std;
    
    #define ll long long 
     
    void read(int &x) {
        x=0;int f=1;char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
    }
     
    void print(ll x) {
        if(x<0) putchar('-'),x=-x;
        if(!x) return ;print(x/10),putchar(x%10+48);
    }
    void write(ll x) {if(!x) putchar('0');else print(x);putchar('
    ');}
    
    const int maxn = 2e5+10;
    
    ll sum;
    int n,m,q,tot,eu_cnt;
    int v[maxn],w[maxn],c[maxn],t[maxn],vis[maxn],bel[maxn],lst[maxn];
    int head[maxn],f[maxn][20],eu[maxn],in[maxn],out[maxn],dep[maxn],rev[maxn];
    struct edge{int to,nxt;}e[maxn<<1];
    
    struct data{int l,r,t,lca,x,id;ll ans;}ask[maxn];
    
    int cmp(data a,data b) {return bel[a.l]==bel[b.l]?(bel[a.r]==bel[b.r]?a.t<b.t:bel[a.r]<bel[b.r]):bel[a.l]<bel[b.l];}
    
    int cmp2(data a,data b) {return a.id<b.id;}
    
    struct data2{int x,c,t,pre;}mdf[maxn];
    
    void add(int u,int vv) {e[++tot]=(edge){vv,head[u]},head[u]=tot;}
    void ins(int u,int vv) {add(u,vv),add(vv,u);}
    
    void dfs(int x,int fa) {
    	eu[in[x]=++eu_cnt]=x,f[x][0]=fa,dep[x]=dep[fa]+1;rev[eu_cnt]=x;
    	for(int i=1;i<=19;i++) f[x][i]=f[f[x][i-1]][i-1];
    	for(int i=head[x];i;i=e[i].nxt)
    		if(e[i].to!=fa) dfs(e[i].to,x);
    	eu[out[x]=++eu_cnt]=x;rev[eu_cnt]=x;
    }
    
    int lca(int x,int y) {
    	if(dep[x]<dep[y]) swap(x,y);
    	for(int i=19;~i;i--) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
    	if(x==y) return x;
    	for(int i=19;~i;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
    	return f[x][0];
    }
    
    void add(int x) {
    	int u=rev[x];
    	if(!vis[u]) sum+=1ll*w[++t[c[u]]]*v[c[u]];
    	else sum-=1ll*w[t[c[u]]--]*v[c[u]];vis[u]^=1;
    }
    
    void modify(int x,int col) {
    	if(!vis[x]) c[x]=col;
    	else add(in[x]),c[x]=col,add(in[x]);
    }
    
    int main() {
    	read(n),read(m),read(q);
    	for(int i=1;i<=m;i++) read(v[i]);
    	for(int i=1;i<=n;i++) read(w[i]);
    	for(int i=1,x,y;i<n;i++) read(x),read(y),ins(x,y);
    	for(int i=1;i<=n;i++) read(c[i]),lst[i]=c[i];
    	dfs(1,0);int block=pow(n,2.0/3),s=0,ss=0;
    	for(int i=1,op,x,y;i<=q;i++) {
    		read(op);
    		if(op) {
    			read(x),read(y),ask[++s].t=ss;if(in[x]>in[y]) swap(x,y);
    			ask[s].l=(lca(x,y)==x?in[x]:out[x]),ask[s].r=in[y];ask[s].id=i;
    		}
    		else read(x),read(y),mdf[++ss].x=x,mdf[ss].c=y,mdf[ss].t=i,mdf[ss].pre=lst[x],lst[x]=y;
    	}
    	for(int i=1;i<=(n<<1);i++) bel[i]=i/block+1;
    	sort(ask+1,ask+s+1,cmp);
    	int ql=1,qr=0,qt=1;
    	for(int i=1;i<=s;i++) {
    		while(qt<=ask[i].t) modify(mdf[qt].x,mdf[qt].c),qt++;
    		while(qt>ask[i].t) modify(mdf[qt].x,mdf[qt].pre),qt--;
    		while(ql<ask[i].l) add(ql++);
    		while(ql>ask[i].l) add(--ql);
    		while(qr<ask[i].r) add(++qr);
    		while(qr>ask[i].r) add(qr--);
    		int L=lca(rev[ask[i].l],rev[ask[i].r]);
    		if(L==rev[ask[i].l]||L==rev[ask[i].r]) ask[i].ans=sum;
    		else add(in[L]),ask[i].ans=sum,add(in[L]);
    	}
    	sort(ask+1,ask+s+1,cmp2);
    	for(int i=1;i<=s;i++) write(ask[i].ans);
    	return 0;
    }
    
  • 相关阅读:
    文件输出debug
    sweetalert
    js认清this的第一步
    Creating default object from empty value in PHP?
    matplotlib画图
    python解析库
    zabbix监控ssl证书过期时间
    aws 预留实例到期监控
    aws ec2挂载 s3
    aliyun挂载oss
  • 原文地址:https://www.cnblogs.com/hbyer/p/10301192.html
Copyright © 2011-2022 走看看