●UOJ58 [WC2013]糖果公园
题链:
树上带修莫队。
每个块的大小为$n^{\frac{2}{3}}$,在dfs时,把点集分为若干块。
然后类似序列带修莫队,三个关键字:bel[u],bel[v],time来排序,
从上一个询问(u,v)更新到新的询问(u',v')时,
首先把时间弄对,
然后再把u->lca(u,u')->u'(不含lca(u,u'))这条链上的点的信息取反(原来不存在,现在就存在;原来存在,现在就存在)。
同样对v->lca(v,v')->v'(不含lca(v,v'))这条链上的点的信息取反。
由于没有考虑到lca(u',v')的贡献,所以加上该lca的后,得到当前询问的答案。
(被洛谷的数据卡的不要不要的,勉强过了UOJ)
代码:
#include<bits/stdc++.h>
#define MAXN 100005
#define rint register int
using namespace std;
long long ans,ANS[MAXN];
int N,M,Qnt,BLOCK,nowU,nowV,nowT;
int candy[MAXN],s[MAXN],V[MAXN],W[MAXN],fa[MAXN][18],bel[MAXN],deep[MAXN],vis[MAXN],now[MAXN];
struct Edge{
int ent;
int to[MAXN*2],nxt[MAXN*2],head[MAXN];
Edge(){ent=2;}
void Adde(int u,int v){
to[ent]=v; nxt[ent]=head[u]; head[u]=ent++;
}
}E;
struct Query{
int u,v,t,id;
bool operator < (const Query &rtm) const{
return bel[u]==bel[rtm.u]?(bel[v]==bel[rtm.v]?t<rtm.t:bel[v]<bel[rtm.v]):bel[u]<bel[rtm.u];
}
}Q[MAXN];
struct Change{int p,nc,oc;}C[MAXN];
void read(int &x){
static int sign; static char ch;
sign=1; x=0; ch=getchar();
for(;ch<'0'||'9'<ch;ch=getchar()) if(ch=='-') sign=-1;
for(;'0'<=ch&&ch<='9';ch=getchar()) x=x*10+ch-'0';
x=x*sign;
}
void dfs(int u){
static int stk[MAXN],top,bnt;
for(rint k=1;k<17;k++)
fa[u][k]=fa[fa[u][k-1]][k-1];
for(rint e=E.head[u];e;e=E.nxt[e]){
int v=E.to[e]; if(v==fa[u][0]) continue;
fa[v][0]=u; deep[v]=deep[u]+1; dfs(v);
if(top>BLOCK){
++bnt;
while(top) bel[stk[top--]]=bnt;
}
}
stk[++top]=u;
if(u==1) while(top) bel[stk[top--]]=bnt;
}
int LCA(int u,int v){
static int d;
if(deep[u]>deep[v]) swap(u,v);
d=deep[v]-deep[u];
for(rint k=16;k>=0;k--)
if(d&(1<<k)) v=fa[v][k];
if(u==v) return u;
for(rint k=16;k>=0;k--)
if(fa[u][k]!=fa[v][k]) u=fa[u][k],v=fa[v][k];
return fa[u][0];
}
void modify(int p){
if(!vis[p]) candy[s[p]]++,ans+=1ll*W[candy[s[p]]]*V[s[p]];
else ans-=1ll*W[candy[s[p]]]*V[s[p]],candy[s[p]]--;
vis[p]^=1;
}
void trans(rint u,rint v){
while(u!=v)
deep[u]>=deep[v]?(modify(u),u=fa[u][0]):(modify(v),v=fa[v][0]);
}
void dotime(int p,int c){
if(vis[p]) modify(p),s[p]=c,modify(p);
else s[p]=c;
}
int main(){
int q,t,lca;
read(N); read(M); read(Qnt); BLOCK=pow(N,0.6);
for(rint i=1;i<=M;i++) read(V[i]);
for(rint i=1;i<=N;i++) read(W[i]);
for(rint i=1,a,b;i<N;i++)
read(a),read(b),E.Adde(a,b),E.Adde(b,a);
for(rint i=1;i<=N;i++) read(s[i]),now[i]=s[i];
deep[1]=1; dfs(1);
for(rint i=1,type,x,y;i<=Qnt;i++){
read(type),read(x),read(y);
if(type){
if(bel[x]>bel[y]) swap(x,y);
++q; Q[q]=(Query){x,y,t,q};
}
else ++t,C[t]=(Change){x,y,now[x]},now[x]=y;
}
sort(Q+1,Q+q+1);
nowU=nowV=1;nowT=0;
for(rint i=1;i<=q;i++){
while(nowT<Q[i].t) nowT++,dotime(C[nowT].p,C[nowT].nc);
while(nowT>Q[i].t) dotime(C[nowT].p,C[nowT].oc),nowT--;
trans(nowU,Q[i].u);
trans(nowV,Q[i].v);
nowU=Q[i].u; nowV=Q[i].v; lca=LCA(Q[i].u,Q[i].v);
modify(lca); ANS[Q[i].id]=ans; modify(lca);
}
for(int i=1;i<=q;i++) printf("%lld\n",ANS[i]);
return 0;
}
●UOJ58 [WC2013]糖果公园的更多相关文章
- bzoj 3052: [wc2013]糖果公园 带修改莫队
3052: [wc2013]糖果公园 Time Limit: 250 Sec Memory Limit: 512 MBSubmit: 506 Solved: 189[Submit][Status] ...
- 洛谷 P4074 [WC2013]糖果公园 解题报告
P4074 [WC2013]糖果公园 糖果公园 树上待修莫队 注意一个思想,dfn序处理链的方法,必须可以根据类似异或的东西,然后根据lca分两种情况讨论 注意细节 Code: #include &l ...
- AC日记——[WC2013]糖果公园 cogs 1817
[WC2013]糖果公园 思路: 带修改树上莫队(模板): 来,上代码: #include <cmath> #include <cstdio> #include <cst ...
- COGS1817. [WC2013]糖果公园
1817. [WC2013]糖果公园 ★★★☆ 输入文件:park.in 输出文件:park.out 简单对比时间限制:8 s 内存限制:512 MB [题目描述] Candyland ...
- 【BZOJ3052】[wc2013]糖果公园 带修改的树上莫队
[BZOJ3052][wc2013]糖果公园 Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 ...
- [BZOJ3052][UOJ#58][WC2013]糖果公园
[BZOJ3052][UOJ#58][WC2013]糖果公园 试题描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来 ...
- 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法
[题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...
- 【Luogu P4074】[WC2013]糖果公园(树上带修改莫队)
题目描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 \(n\) 个游 ...
- BZOJ3052:[WC2013]糖果公园(树上莫队)
Description Input Output Sample Input 4 3 51 9 27 6 5 12 33 13 41 2 3 21 1 21 4 20 2 11 1 21 4 2 Sam ...
随机推荐
- C语言第十一次博客作业---函数嵌套调用
一.实验作业 1.1 PTA题目 题目:递归实现顺序输出整数 1. 本题PTA提交列表 2. 设计思路 printdigits函数 定义整型变量result存放结果 if n是10的倍数 result ...
- 本地通知UILocalNotification
1.增加一个本地推送 //设置20秒之后 ]; //chuagjian一个本地推送 UILocalNotification *noti = [[[UILocalNotification alloc] ...
- 自主学习之RxSwift(一) -----Driver
对于RxSwift,我也是初学者,此系列来记录我学习RxSwift的历程! (一) 想必关于Drive大家一定在RxSwift的Demo中看到过,也一定有些不解,抱着一起学习的态度,来了解一下Driv ...
- EVA 4400存储硬盘故障数据恢复方案和数据恢复过程
EVA系列存储是一款以虚拟化存储为实现目的的HP中高端存储设备,平时数据会不断的迁移,加上任务通常较为繁重,所以磁盘的负载相对是较重的,也是很容易出现故障的.EVA是依靠大量磁盘的冗余空间,以及故障后 ...
- 第一章 创建WEB项目
第一章 创建WEB项目 一.Eclipse创建WEB项目 方法/步骤1 首先,你要先打开Eclipse软件,打开后在工具栏依次点击[File]>>>[New]>>&g ...
- C#-获取字符的GBK编码值
public static int GetGBKValue(string key) { byte[] gbk = Encoding.GetEncoding("GBK").GetBy ...
- Python内置函数(18)——bin
英文文档: bin(x) Convert an integer number to a binary string. The result is a valid Python expression. ...
- 电梯模拟C++
1.问题描述与要求 模拟某校九层教学楼的电梯系统.该楼有一个自动电梯,能在每层停留,其中第一层是大楼的进出层,即是电梯的"本垒层",电梯"空闲"时,将来到该层候 ...
- sts 和 lombok
1.安装lombok.jar到sts.exe所在目录 如果是eclipse,需要放到eclipse.exe所在目录,同理myeclipse. 2.修改sts.ini配置使用lombok 如果是ecli ...
- SpringCloud的Config:ConfigServer注册到EurekaServer中,变成一个Eureka服务
一.概念与定义 1.将SpringCloud ConfigServer注册到 EurekaServer,以便ConfigClient以服务的方式引用ConfigServer 2.客户端不再引用 Con ...