●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 ...
随机推荐
- 安利给班里的大家一个chrome的GitHub插件-----gayhub
title: 一个好用的Github插件--gayhub date: 2017-09-20 15:41:36 tags: --- 别跑, 这真是正经插件. 效果, 一图流: 具体效果在项目地址很详细 ...
- 2018年3月份的PTA(一)
写程序证明p++等价于(p)++还是等价于(p++)? 由程序说明p++等价于(p)++,因为(p++)在程序中是没有地址的,而输出中p++和(p)++的地址不同是由于在线C语言开发环境地址是动态的 ...
- python 一致性哈希 分布式
hash_ring # -*- coding: utf-8 -*- """ hash_ring ~~~~~~~~~~~~~~ Implements consistent ...
- Flask 蓝图(Blueprint)
蓝图使用起来就像应用当中的子应用一样,可以有自己的模板,静态目录,有自己的视图函数和URL规则,蓝图之间互相不影响.但是它们又属于应用中,可以共享应用的配置.对于大型应用来说,我们可以通过添加蓝图来扩 ...
- 《javascript设计模式与开发实践》阅读笔记(10)—— 组合模式
组合模式:一些子对象组成一个父对象,子对象本身也可能是由一些孙对象组成. 有点类似树形结构的意思,这里举一个包含命令模式的例子 var list=function(){ //创建接口对象的函数 ret ...
- iot前台开发环境:搭建 SpringBoot+angularJs2
参考网站 Angular 中文官网:https://angular.cn/ 参考代码:https://ng.ant.design/#/components/dropdown npm install ...
- python isinstance 函数
isinstance是Python中的一个内建函数 语法: isinstance(object, classinfo) 如果参数object是classinfo的实例,或者object是class ...
- python tornado TCPserver异步协程实例
项目所用知识点 tornado socket tcpserver 协程 异步 tornado tcpserver源码抛析 在tornado的tcpserver文件中,实现了TCPServer这个类,他 ...
- 简单搭建SpringMVC框架详解
在公司待了两年,用的一直是Spring+SpringMVC+Hibernate框架,都是公司自己搭建好的,自己从来没有主动搭建过,闲来无聊,自己搭建试试.一下即我搭建的过程以及搭建所遇到的问题,有部分 ...
- tar磁带归档
一:压缩.解压 1.compress/uncompress/zcat -d:解压 -c:输出到终端,不删除原文件 -v:显示详细信息 2.gzip/ungzip/zcat -d:解压 -c:将压缩或解 ...