SPOJ375.QTREE

来源:互联网 发布:三星9008端口刷机模式 编辑:程序博客网 时间:2024/05/24 01:56

题目大意:

一棵树,每条边有个权值

两种操作

一个修改每条边权值

一个询问两点之间这一条链的最大边权

点数<=10000

多组测试数据,case<=20


简单动态树,只是一般Splay维护的是点的信息,这里是边的信息

那么有两种做法

一种是Splay直接维护边的信息,这种貌似比较难写,据pty说是比较蛋疼

还有一种是随便指定一个点作为树根,那么每个点就有相应的深度了,此时将所有的边的边压到它所连的下面的那个点,那么就变成了维护点的信息

只是询问时不要比较两个点的LCA就行了


……尼玛我还没有哪一次写Splay1A的……

这题一交直接tle,tletletle……我以为是我哪里写错了,最后发现是SPOJ机子慢,这题写link-cut tree卡的又比较严……

将每次初始化的范围从原来的memset改成和n有关以后就AC,在inline一下快了半秒多……

不过比起写树链剖分的大牛们还是比较慢……

优化前

优化后

反正就是一个慢……


//Lib#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<ctime>#include<iostream>#include<algorithm>#include<vector>#include<string>#include<queue>using namespace std;//Macro#define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i)#define rrep(i,a,b) for(int i=a,tt=b;i>=tt;--i)#define erep(i,e,x) for(int i=x;i;i=e[i].next)#define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++)#define read() (strtol(ipos,&ipos,10))#define sqr(x) ((x)*(x))#define pb push_back#define PS system("pause");typedef long long ll;typedef pair<int,int> pii;const int oo=~0U>>1;const double inf=1e20;const double eps=1e-6;string name="",in=".in",out=".out";//Varstruct T{int LC,RC,FA,MAX,KEY;#define lc(x) tree[x].LC#define rc(x) tree[x].RC#define fa(x) tree[x].FA#define Max(x) tree[x].MAX#define key(x) tree[x].KEY}tree[10008];struct E{int next,node,v;}e[20008];int n,m,T;int h[10008],tot;int belong[10008];queue<int> q;//Functionbool vis[10008];inline void Update(int x){Max(x)=max(max(Max(lc(x)),Max(rc(x))),key(x));}inline void set(int x){lc(x)=rc(x)=0;}inline bool isRoot(int x){return lc(fa(x))!=x&&rc(fa(x))!=x;}inline void Zig(int x){int y=fa(x),z=fa(y);if(lc(z)==y)lc(z)=x;else if(rc(z)==y)rc(z)=x;fa(x)=z;fa(rc(x))=y;lc(y)=rc(x);fa(y)=x;rc(x)=y;Update(y);}inline void Zag(int x){int y=fa(x),z=fa(y);if(lc(z)==y)lc(z)=x;else if(rc(z)==y)rc(z)=x;fa(x)=z;fa(lc(x))=y;rc(y)=lc(x);fa(y)=x;lc(x)=y;Update(y);}inline void Splay(int x){for(int y,z;!isRoot(x);){y=fa(x);z=fa(y);if(isRoot(y))if(lc(y)==x)Zig(x);else Zag(x);elseif(lc(z)==y)if(lc(y)==x)Zig(y),Zig(x);else Zag(x),Zig(x);elseif(rc(y)==x)Zag(y),Zag(x);else Zig(x),Zag(x);}Update(x);}inline void Expose(int x){for(int y=0;x;x=fa(x)){Splay(x);rc(x)=y;Update(x);y=x;}}void Build(){q.push(1);vis[1]=true;int x,y;set(1);fa(1)=0;while(!q.empty()){x=q.front();q.pop();erep(i,e,h[x]){y=e[i].node;if(vis[y])continue;set(y);fa(y)=x;key(y)=e[i].v;belong[i>>1]=y;vis[y]=true;q.push(y);}}}inline void Modify(int x,int y){key(x)=y;Splay(x);}int Query(int x,int y){Expose(y);for(y=0;x;x=fa(x)){Splay(x);if(!fa(x)){return max(Max(rc(x)),Max(y));}rc(x)=y;Update(x);y=x;}}inline void add(int a,int b,int c){e[++tot].next=h[a];e[tot].node=b;e[tot].v=c;h[a]=tot;}void Init(){//memset(tree,0,sizeof tree);scanf("%d",&n);int a,b,c;tot=1;rep(i,0,n)h[i]=vis[i]=0;rep(i,1,n-1)scanf("%d%d%d",&a,&b,&c),add(a,b,c),add(b,a,c);key(0)=Max(0)=-oo;Build();}void Work(){char ch[10];int a,b;while(1){scanf("%s",ch);if(ch[0]=='D')return;scanf("%d%d",&a,&b);if(ch[0]=='C')Modify(belong[a],b);else printf("%d\n",Query(a,b));}}int main(){//freopen((name+in).c_str(),"r",stdin);//freopen((name+out).c_str(),"w",stdout);for(scanf("%d",&T);T;T--){Init();Work();}return 0;}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 泄露验证码之后怎么办 手机验证码被盗怎么办 网络博彩不让提款怎么办 冰团e购扫码注册怎么办 苏宁销售火爆怎么办 菲洛城平台黑钱怎么办 货车扣12分怎么办 烟草证下来后怎么办 余款未结该怎么办 沙袋吸盘吸不住怎么办 电视购物不退货怎么办 母亲相信电视购物怎么办 中关村商城会买到假货怎么办 年休 科室主任不同意怎么办 怡成血糖仪不准怎么办 电子血压仪不准怎么办 学java没思路怎么办 安逸花评分不足怎么办 环保投诉不管用怎么办 乐购超市会员卡怎么办 易购225冻结金额怎么办 麻将机不洗牌了怎么办 麻将桌升不起来怎么办 公司宣布破产债务怎么办 一元乐购被骗怎么办 车被墙外皮砸了怎么办 win10安全中心打不开怎么办 导航出现001错误怎么办 车导航代码错误怎么办 买了假化妆品怎么办 发物流没有单号怎么办 天添网密码忘了怎么办 新华书香卡过期怎么办 车险断了一年怎么办 天添新倒闭捷信怎么办 建行diy信用卡怎么办卡 奥体 游泳卡过期怎么办 次卡过期了怎么办 该插件不受支持怎么办 信用卡申请找不到住址怎么办 中信信用卡白户怎么办