●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语言程序设计(基础)- 第2周作业
1.阅读提问的智慧,要求仔细阅读链接内容,用自己的话描述你的收获,并举例子说明应该如何提问. 2.所有同学请在自己电脑上配置git.编译器(win10 系统的话就Dev-C++).翻译软件,十一回校后 ...
- Alpha阶段报告-hywteam
一.Alpha版本测试报告 1. 在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? BUG名 修复的BUG 不能重现的BUG 非BUG 没能力修复的BUG 下个版本修复 文件路径的表示 ...
- iOS开发-继承特征详解
面向对象的三大特性:封装,继承,多态. 1.继承 继承既能保证类的完整,又能简化代码. 把公共的方法和实例变量写在子类,子类只需要写父类独有的实例变量和方法即可. 继承是面向对象三大特性之一,合理的继 ...
- Ubuntu安装使用latex
TeX Live is a TeX distribution to get up and running with the TeX document production system. To ins ...
- 【learning】多项式相关(求逆、开根、除法、取模)
(首先要%miskcoo,这位dalao写的博客(这里)实在是太强啦qwq大部分多项式相关的知识都是从这位dalao博客里面学的,下面这篇东西是自己对其博客学习后的一些总结和想法,大部分是按照其博客里 ...
- SpringBoot的RestController vs @ResponseBody + @Controller
@Controller和@RestController的区别?官方文档:@RestController is a stereotype annotation that combines @Respon ...
- restful架构风格设计准则(四)资源表示和资源访问
读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 一.资源表示 1.资源表示:使用 单数 vs. 复数 如果一个URL所对 ...
- python 模拟浏览器登陆coursera
import requests import random import string def randomString(length): return ''.join(random.choice(s ...
- PL/SQL Developer 导入导出操作
一.PL/SQL Developer数据导入 Tools->Import Tables
- django模版中配置和使用静态文件方法
1 在项目根路径下创建静态文件目录static: test3 是我的项目名,根目录下面: booktest 是一个应用 static是我建立的静态文件目录(这个名字其实可以叫其他的),静态文件都放在这 ...