hdu 4010 Query on The Trees LCT
支持:
1.添加边 x,y
2.删边 x,y
3.对于路径x,y上的所有节点的值加上w
4.询问路径x,y上的所有节点的最大权值
分析:
裸的lct...
rev忘了清零死循环了两小时。。。
1:就是link操作
2:就是cut操作
3:维护多一个mx域,mx[x]表示在splay中以节点x为根的子树的最大点权,每次修改时,把x置为splay的根,打通y到x的路径,把y splay到根,那么,直接对y节点的lazy标记加上为w即可。
4:同3操作,把x置为splay的根,打通y到x的路径,把y splay到根,那么,y子树所对应的节点就是路径x到y的所有节点。
另外,题目貌似描述有点问题,不光是询问非法输出-1,是指操作如果是非法就输出-1....
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull; #define debug puts("here")
#define rep(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define foreach(i,vec) for(unsigned i=0;i<vec.size();i++)
#define pb push_back
#define RD(n) scanf("%d",&n)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
#define All(vec) vec.begin(),vec.end()
#define MP make_pair
#define PII pair<int,int>
#define PQ priority_queue
#define cmax(x,y) x = max(x,y)
#define cmin(x,y) x = min(x,y)
#define Clear(x) memset(x,0,sizeof(x))
/* #pragma comment(linker, "/STACK:1024000000,1024000000") int size = 256 << 20; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p) ); */ /******** program ********************/ const int MAXN = 3e5+5; // 外挂
char op;
inline void Int(int &x){
while( !isdigit(op=getchar()) );
x = op-'0';
while(isdigit(op=getchar()))
x = x*10+op-'0';
} struct LCT{
int ch[MAXN][2],fa[MAXN];
int lz[MAXN],mx[MAXN],val[MAXN];
bool rev[MAXN];
int sta[MAXN],top; inline void init(){
Clear(ch);
Clear(fa);
Clear(lz);
Clear(rev);
mx[0] = 0;
} inline void modify(int x,int d){ // 单点增加lazy标记
if(!x)return;
lz[x] += d;
mx[x] += d;
val[x] += d;
} inline void clear(int x){
if(!x)return;
if(rev[x]){
if(ch[x][0])rev[ch[x][0]] ^= 1;
if(ch[x][1])rev[ch[x][1]] ^= 1;
swap(ch[x][0],ch[x][1]);
rev[x] = 0;
}
if(lz[x]){
modify(ch[x][0],lz[x]);
modify(ch[x][1],lz[x]);
lz[x] = 0;
}
} inline void update(int x){
if(!x)return;
mx[x] = max( val[x],max(mx[ch[x][0]],mx[ch[x][1]]) );
} inline bool isRoot(int x){
return !x || !( (ch[ fa[x] ][0]==x) || (ch[ fa[x] ][1]==x) );
} inline bool sgn(int x){
return ch[ fa[x] ][1]==x;
}
inline void setc(int y,int d,int x){
ch[y][d] = x;
fa[x] = y;
}
inline void rot(int x){
int y = fa[x] , z = fa[y] , d = sgn(x)^1;
setc(y,d^1,ch[x][d]);
if(isRoot(y)) fa[x] = fa[y];
else setc(z,sgn(y),x);
setc(x,d,y);
update(y);
} inline void splay(int x){
if(!x)return;
top = 0;
sta[++top] = x;
for(int y=x;!isRoot(y);y=fa[y])
sta[++top] = fa[y];
while(top)clear(sta[top--]); while(!isRoot(x)){
if(isRoot(fa[x]))rot(x);
else{
sgn(x)==sgn(fa[x]) ? rot(fa[x]) : rot(x);
rot(x);
}
}
update(x);
} inline int access(int x){
int y = 0;
for(;x;x=fa[y = x]){
splay(x);
ch[x][1] = y;
update(x);
}
return y;
} inline void mRoot(int x){
rev[ access(x) ] ^= 1;
splay(x);
} inline int getRoot(int x){
x = access(x);
while(ch[x][0]){
x = ch[x][0];
clear(x);
}
return x;
} inline bool jud(int x,int y){// ok
return getRoot(x)==getRoot(y);
} inline void link(int x,int y){
if(jud(x,y)){
puts("-1");
return;
}
mRoot(x);
fa[x] = y;
//access(x);
} inline void cut(int x,int y){
if(x==y||!jud(x,y)){
puts("-1");
return;
}
mRoot(x);
access(y);
splay(y);
fa[ ch[y][0] ] = 0;
ch[y][0] = 0;
update(y);
} inline void modify(int x,int y,int c){
if(!jud(x,y)){
puts("-1");
return;
}
mRoot(x);
access(y);
splay(y);
modify(y,c);
clear(y);
} inline int ask(int x,int y){
if(!jud(x,y))
return -1;
mRoot(x);
access(y);
splay(y);
return mx[y];
} }lct; struct Edge{
int y,next;
}edge[MAXN<<1]; int po[MAXN],tol; inline void add(int x,int y){
edge[++tol].y = y;
edge[tol].next = po[x];
po[x] = tol;
} void dfs(int x,int pa){
lct.fa[x] = pa;
for(int i=po[x];i;i=edge[i].next)
if(edge[i].y!=pa)
dfs(edge[i].y,x);
} int main(){ #ifndef ONLINE_JUDGE
freopen("sum.in","r",stdin);
//freopen("sum.out","w",stdout);
#endif int x,y,w,n,m,op;
while(~RD(n)){
lct.init();
Clear(po);
tol = 0; REP(i,2,n){
Int(x);Int(y);
add(x,y);
add(y,x);
} dfs(1,0); rep1(i,n){
RD(lct.val[i]);
lct.mx[i] = lct.val[i];
}
RD(m);
while(m--){
Int(op);
if(op==1){
Int(x);Int(y);
lct.link(x,y);
}else if(op==2){
Int(x);Int(y);
lct.cut(x,y);
}else if(op==3){
Int(w);Int(x);Int(y);
lct.modify(x,y,w);
}else{
Int(x);Int(y);
printf("%d\n",lct.ask(x,y));
}
}
puts("");
} return 0;
}
hdu 4010 Query on The Trees LCT的更多相关文章
- 动态树(LCT):HDU 4010 Query on The Trees
Query on The Trees Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Othe ...
- HDOJ 4010 Query on The Trees LCT
LCT: 分割.合并子树,路径上全部点的点权添加一个值,查询路径上点权的最大值 Query on The Trees Time Limit: 10000/5000 MS (Java/Others) ...
- HDU 4010 Query on The Trees(动态树LCT)
Problem Description We have met so many problems on the tree, so today we will have a query problem ...
- HDU 4010 Query on The Trees (动态树)(Link-Cut-Tree)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4010 题意; 先给你一棵树,有 \(4\) 种操作: 1.如果 \(x\) 和 \(y\) 不在同一 ...
- HDU 4010 Query on The Trees
Problem Description We have met so many problems on the tree, so today we will have a query problem ...
- HDU 4010.Query on The Trees 解题报告
题意: 给出一颗树,有4种操作: 1.如果x和y不在同一棵树上则在xy连边 2.如果x和y在同一棵树上并且x!=y则把x换为树根并把y和y的父亲分离 3.如果x和y在同一棵树上则x到y的路径上所有的点 ...
- HDU 4010 Query on The Trees(动态树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4010 题意:一棵树,四种操作: (1)若x和y不在一棵树上,将x和y连边: (2)若x和y在一棵树上, ...
- HDU 4010 Query on The Trees(动态树)
题意 给定一棵 \(n\) 个节点的树,每个点有点权.完成 \(m\) 个操作,操作四两种,连接 \((x,y)\) :提 \(x\) 为根,并断 \(y\) 与它的父节点:增加路径 \((x,y)\ ...
- HDU4010 Query on The Trees(LCT)
人生的第一道动态树,为了弄懂它的大致原理,需要具备一些前置技能,如Splay树,树链剖分的一些概念.在这里写下一些看各种论文时候的心得,下面的代码是拷贝的CLJ的模板,别人写的模板比较可靠也方便自己学 ...
随机推荐
- myeclipse中working Sets
最近myeclipse中的项目太多了,看起来老不爽,查找还不方便,发现这个working Sets还是挺好用的 接下来的步骤,太简单了有木有,就不写了 0.0
- 初始化css代码需要注意的
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-05-06) 写在所有css代码之前,对网页中所有同类元素的一个样式规则代码或者一些基础性公用元素的样式规则代码. 1.空白 ...
- Slony-I的 RemoteWorker重试调查
客户的问题是: 向Slony-I运行环境中,增加新的slaveDB节点的时候发生错误. log中反复出现错误,然后再重新开始(重新开始部分的log省略): CONFIG remoteWorkerThr ...
- 为DELL inspiron 14R安装CentOS X64 6.4
今天接到一个任务,为DELL inspiron 14R安装CentOS X64 6.4,本以为这是小菜一碟,不算个啥,大大小小安装LINUX CENTOS 不下上百次了,还怕这个?结果,各种碰壁... ...
- SharedObject.getLocal("application-name")
package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.NetStatus ...
- 【M17】考虑使用缓式评估
1.缓式评估其实就是拖延战术,直到逼不得已的时候才去计算.缓式评估的使用场景有: 2.引用计数,考虑String,String是一个内含char指针(char指针以'\0'结束)的资源管理类,正常情况 ...
- uoj #118. 【UR #8】赴京赶考 水题
#118. [UR #8]赴京赶考 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/118 Description ...
- Jquery实现页面上所有的checkbox只能选中一个
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- 基于CSS3制作的鼠标悬停动画菜单
之前分享了好多款css3实现的鼠标悬停效果.今天再给大家带来一款基于CSS3制作的鼠标悬停动画菜单.这款菜单适用浏览器:360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界 ...
- [Android开发]- MVC的架构实现登录模块-1
本系列博客主要展示一下,在C-S(Client - Server)系统开发当中,如何使用MVC的架构来实现安卓端的一个登录验证的模块.如果你能有基本的数据库开发,WEB开发,和安卓开发的知识,那么理解 ...