[CodeChef-ANUDTQ] Dynamic Trees and Queries
类似维护括号序列,给每个点建两个点,然后所有操作都能轻松支持了。注意sum和lastans是long long。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
typedef long long ll;
using namespace std; const int N=;
ll ans,sm[N];
int n,nd,tim,rt,op,x,y,m,cnt,a[N],tag[N];
int v[N],f[N],L[N],R[N],sz[N],c[N][],h[N],to[N],nxt[N]; void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } void dfs(int x,int fa){
L[x]=++tim; v[tim]=a[x];
For(i,x) if ((k=to[i])!=fa) dfs(k,x);
R[x]=++tim; v[tim]=a[x];
} void upd(int x){
sm[x]=sm[c[x][]]+sm[c[x][]]+v[x];
sz[x]=sz[c[x][]]+sz[c[x][]]+;
} void put(int x,int k){ v[x]+=k; sm[x]+=1ll*k*sz[x]; tag[x]+=k; } void push(int x){
if (!tag[x]) return;
if (c[x][]) put(c[x][],tag[x]);
if (c[x][]) put(c[x][],tag[x]);
tag[x]=;
} void pd(int x){ if (f[x]) pd(f[x]); push(x); } int build(int l,int r){
int mid=(l+r)>>,x=mid;
if (l<mid) c[x][]=build(l,mid-),f[c[x][]]=x;
if (mid<r) c[x][]=build(mid+,r),f[c[x][]]=x;
upd(x); return x;
} void rot(int &rt,int x){
int y=f[x],z=f[y],w=c[y][]==x;
if (y==rt) rt=x; else c[z][c[z][]==y]=x;
f[x]=z; f[y]=x; f[c[x][w^]]=y; c[y][w]=c[x][w^];
c[x][w^]=y; upd(y);
} void splay(int &rt,int x){
for (pd(x); x!=rt; rot(rt,x)){
int y=f[x],z=f[y];
if (y!=rt) (c[z][]==y)^(c[y][]==x) ? rot(rt,x) : rot(rt,y);
}
upd(x);
} int pre(int x){ splay(rt,x); for (x=c[x][]; c[x][]; x=c[x][]); return x; }
int lst(int x){ splay(rt,x); for (x=c[x][]; c[x][]; x=c[x][]); return x; } void Ins(int x,int y){
int k=lst(L[x]); splay(rt,L[x]); splay(c[rt][],k);
c[k][]=++nd; v[nd]=y; f[nd]=k; R[++n]=nd;
nd++; c[nd-][]=nd; v[nd]=y; f[nd]=nd-; L[n]=nd;
upd(nd); upd(nd-); upd(k); upd(rt);
} void Add(int x,int y){
int l=pre(L[x]),r=lst(R[x]); splay(rt,l); splay(c[rt][],r);
put(c[r][],y); upd(r); upd(rt);
} void Del(int x){
int l=pre(L[x]),r=lst(R[x]); splay(rt,l); splay(c[rt][],r);
c[r][]=f[c[r][]]=; upd(r); upd(rt);
} ll Que(int x){ int l=pre(L[x]),r=lst(R[x]); splay(rt,l); splay(c[rt][],r); return sm[c[r][]]; } int main(){
freopen("anudtq.in","r",stdin);
freopen("anudtq.out","w",stdout);
scanf("%d",&n);
rep(i,,n) scanf("%d",&a[i]);
rep(i,,n) scanf("%d%d",&x,&y),x++,y++,add(x,y),add(y,x);
tim=; dfs(,); rt=build(,tim+); nd=tim+; scanf("%d",&m);
rep(i,,m){
scanf("%d%d",&op,&x); x+=ans+;
if (op==) scanf("%d",&y),Ins(x,y);
if (op==) scanf("%d",&y),Add(x,y);
if (op==) Del(x);
if (op==) printf("%lld\n",ans=Que(x)/);
}
return ;
}
[CodeChef-ANUDTQ] Dynamic Trees and Queries的更多相关文章
- Codechef Dynamic Trees and Queries
Home » Practice(Hard) » Dynamic Trees and Queries Problem Code: ANUDTQSubmit https://www.codechef.co ...
- CodeChef DGCD Dynamic GCD
CodeChef题面 Time limit 210 ms Code length Limit //内存限制也不说一下,真是的-- 50000 B OS Linux Language limit C, ...
- 【CodeChef】Chef and Graph Queries
Portal --> CC Chef and Graph Queries Solution 快乐数据结构题(然而好像有十分优秀的莫队+可撤销并查集搞法qwq) 首先考虑一种方式来方便一点地..计 ...
- [CodeChef - GERALD07 ] Chef and Graph Queries
Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected gra ...
- codechef Chef And Easy Xor Queries
做法:我们考虑前缀异或和,修改操作就变成了区间[i,n]都异或x 查询操作就变成了:区间[1,x]中有几个k 显然的分块,每个块打一个tag标记表示这个块中所有的元素都异或了tag[x] 然后处理出这 ...
- Creating dynamic/configurable parameterized queries in Entity Framework
https://dillieodigital.wordpress.com/2013/05/09/creating-dynamicconfigurable-parameterized-queries-i ...
- [bzoj3514][CodeChef GERALD07] Chef ans Graph Queries [LCT+主席树]
题面 bzoj上的强制在线版本 思路 首先可以确定,这类联通块相关的询问问题,都可以$LCT$+可持久化记录解决 用LCT维护生成树作为算法基础 具体而言,从前往后按照边的编号顺序扫一遍边 如果这条边 ...
- codechef FUN WITH TREES
题目大意: 给一棵树root=1的树: 给一些操作:u v 的路径所有节点的node + val: 最后m个询问:u 节点(包括u) sum%mod 是多少. LCA + RMQ: 我们每次mark ...
- BZOJ3514 / Codechef GERALD07 Chef and Graph Queries LCT、主席树
传送门--BZOJ 传送门--VJ 考虑使用LCT维护时间最大生成树,那么对于第\(i\)条边,其加入时可能会删去一条边.记\(pre_i\)表示删去的边的编号,如果不存在则\(pre_i = 0\) ...
随机推荐
- 【JZOJ6222】【20190617】可爱
题目 给定一个长度为\(n\)的串,定义两个串匹配当且仅当两个串长度相同并且不同字符至多一个 对于每一个长度为\(m\)的子串输出和它匹配的子串个数 $1 \le n \le 10^5 , m \ ...
- react用脚手架创建一个react单页面项目,react起手式
官网地址:https://react.docschina.org/ 确保本地安装了Node.js node的版本大于8.10 npm的版本大于5.6 1.在本地的某个位置创建一个文件夹,执行以下 ...
- vue-element-admin 实现动态路由(从后台查询出菜单列表绑定)
1. 在路由实例中保留基础路由 router/index.js中只需要保留基础路由,其他的都删了 2. 获取用户菜单,并保存到Vuex中 stroe/modules/user.js中,有个getInf ...
- Hadoop综合大作业总评
作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3363 1.把python爬取的数据传到linux 2.把数据的逗号代替为 ...
- zookeeper安装运行(docker)
拉取镜像docker pull zookeeper:latest 获取镜像基本信息docker inspect zookeeper mkdir /opt/zookeeper -p vim /opt/z ...
- MYSQL事务的开启与提交
MYSQL 事务处理主要有两种方法: 1.用 BEGIN, ROLLBACK, COMMIT来实现 BEGIN 开始一个事务 ROLLBACK 事务回滚 COMMIT 事务确认 2.直接用 SET 来 ...
- 清理收藏夹中的CSS
1.去掉元素的属性, 例如宽度 #blog-calendar { width: initial !important; }
- ora-8176原因及解决方法
在oracle undo_retention范围内,且_undo_autotune=false的情况下,一个语句执行的时候仍然发生ora-8176,语句如下: INSERT INTO XXX SELE ...
- [E2E_L9]类化和级联化
一.多车辆识别可能和车辆车牌分割: 这样一张图,可以识别多车辆和车牌,问题是如何区分并且配对. 0 1 7 8 是否是车牌可以通过图片的大小进行判断.而配对是前后顺序的. // ------- ...
- excel VBA 密码设置问题
Excel中VBA设置密码的步骤如下: 1.右键点击任何工作表,选择VBAProject属性: 2.在新对话框总,选择“保护”选项卡: 3.勾选查看时锁定,输入密码即可.