2157

思路:

  LCT;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 400005
#define INF 0x3f3f3f3f
int n,val[maxn],sum[maxn],Max[maxn],Min[maxn],ch[maxn][];
int rev[maxn],flag[maxn],f[maxn],top,st[maxn],m,cur[maxn],id;
inline void in(int &now)
{
int if_z=;now=;
char Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
}
void updata(int now)
{
int l=ch[now][],r=ch[now][];
Max[now]=max(Max[l],Max[r]);
Min[now]=min(Min[l],Min[r]);
if(now>n) Max[now]=max(Max[now],val[now]);
if(now>n) Min[now]=min(Min[now],val[now]);
sum[now]=sum[l]+sum[r]+val[now];
}
void rever(int now)
{
sum[now]=-sum[now];
val[now]=-val[now];
swap(Max[now],Min[now]);
Min[now]=-Min[now];
Max[now]=-Max[now];
flag[now]^=;
}
void pushdown(int now)
{
int l=ch[now][],r=ch[now][];
if(flag[now])
{
flag[now]=;
if(l) rever(l);
if(r) rever(r);
}
if(rev[now])
{
rev[now]^=,rev[l]^=,rev[r]^=;
swap(ch[now][],ch[now][]);
}
}
bool isroot(int now)
{
return (ch[f[now]][]!=now)&&(ch[f[now]][]!=now);
}
void rotate(int &now)
{
int fa=f[now],ffa=f[fa],l,r;
if(ch[fa][]==now) l=;else l=;r=l^;
if(!isroot(fa))
{
if(ch[ffa][]==fa) ch[ffa][]=now;
else ch[ffa][]=now;
}
f[now]=ffa,f[fa]=now,f[ch[now][r]]=fa;
ch[fa][l]=ch[now][r],ch[now][r]=fa;
updata(fa),updata(now);
}
void splay(int now)
{
top=;st[++top]=now;
for(int i=now;!isroot(i);i=f[i]) st[++top]=f[i];
while(top) pushdown(st[top--]);
while(!isroot(now))
{
int fa=f[now],ffa=f[fa];
if(!isroot(fa))
{
if(ch[fa][]==now^ch[ffa][]==fa) rotate(now);
else rotate(fa);
}
rotate(now);
}
}
void access(int now)
{
for(int t=;now;t=now,now=f[now]) splay(now),ch[now][]=t,updata(now);
}
void makeroot(int now)
{
access(now);
splay(now);
rev[now]^=;
}
void split(int x,int y)
{
makeroot(x);
access(y);
splay(y);
}
void link(int x,int y)
{
makeroot(x),f[x]=y;
}
int main()
{
freopen("nt2011_travel.in","r",stdin);
freopen("nt2011_travel.out","w",stdout);
in(n);
for(int i=;i<=n;i++) Max[i]=-INF,Min[i]=INF;
int u,v,w;id=n;
for(int i=;i<n;i++)
{
in(u),in(v),in(w),cur[i]=++id;
link(u+,id),link(v+,id);
val[id]=sum[id]=Max[id]=Min[id]=w;
}
in(m);
char ch[];
while(m--)
{
scanf("%s",ch),in(u),in(v);
if(ch[]=='C') splay(cur[u]),val[cur[u]]=v,updata(cur[u]);
else if(ch[]=='N') split(u+,v+),rever(v+);
else if(ch[]=='S') split(u+,v+),printf("%d\n",sum[v+]);
else if(ch[]=='A') split(u+,v+),printf("%d\n",Max[v+]);
else split(u+,v+),printf("%d\n",Min[v+]);
}
return ;
}

AC日记——旅游 bzoj 2157的更多相关文章

  1. AC日记——dispatching bzoj 2809

    2809: [Apio2012]dispatching Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3290  Solved: 1740[Submi ...

  2. AC日记——codevs1688求逆序对

    AC日记--codevs1688求逆序对 锵炬 掭约芴巷 枷锤霍蚣 蟠道初盛 到被他尽情地踩在脚下蹂躏心中就无比的兴奋他是怎么都 ㄥ|囿楣 定要将他剁成肉泥.挫骨扬灰跟随着戴爷这么多年刁梅生 圃鳋 ...

  3. BZOJ 2157: 旅游( 树链剖分 )

    树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...

  4. bzoj 2157: 旅游 (LCT 边权)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 题面; 2157: 旅游 Time Limit: 10 Sec  Memory Lim ...

  5. BZOJ 2157: 旅游

    2157: 旅游 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1347  Solved: 619[Submit][Status][Discuss] ...

  6. 【刷题】BZOJ 2157 旅游

    Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间 ...

  7. BZOJ 2157 旅游(动态树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2157 [题目大意] 支持修改边,链上查询最大值最小值总和,以及链上求相反数 [题解] ...

  8. BZOJ 2157 旅游(树链剖分+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2157 [题目大意] 支持修改边,链上查询最大值最小值总和,以及链上求相反数 [题解] ...

  9. AC日记——[Noi2011]阿狸的打字机 bzoj 2434

    2434 思路: 构建ac自动机: 抽离fail树: 根据字符串建立主席树: 在线处理询问: 询问x在y中出现多少次,等同于y有多少字母的fail能走到x: 1a,hahahahah: 代码: #in ...

随机推荐

  1. CentOS 6.5 下安装配置 mysql

    如果要在Linux上做j2ee开发,首先得搭建好j2ee的开发环境,包括了jdk.tomcat.eclipse的安装(这个在之前的一篇随笔中已经有详细讲解了Linux学习之CentOS(七)--Cen ...

  2. OopenCV复习及函数深入理解(轮廓查询及绘图)

    核心函数:(后面标明号的,下面有解析) int cvFindContours(Iplimage* img,//这是输入函数,必须是8bit,单通道的图像---1 CvMemStorage* stora ...

  3. DFS搜索题素数环

    素数环: 输入整数1,2,3,4,5,···,n组成一个环,使得相邻两个整数之和均为素数. 输出时从整数1开始逆时针排列.同一个环应恰好输出一次.n<=16. Sample: input: 6 ...

  4. A星寻路算法-Mind&Hand(C++)

    //注1:Mind & Hand,MIT校训,这里指的理解与实现(动脑也动手) //注2:博文分为两部分:(1)理解部分,为参考其他优秀博文的摘要梳理:(2)代码部分,是C++代码实现的,源码 ...

  5. HDU 1045 dfs

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  6. JQuery源码实现

    技术提高篇--- 推荐--- 动脑学院--- http://www.toutiao.com/a6368703139592569089/

  7. 梳排序Comb sort

    梳排序还是基于冒泡排序,与冒泡不同的是,梳排序比较的是固定距离处的数的比较和交换,类似希尔那样 这个固定距离是待排数组长度除以1.3得到近似值,下次则以上次得到的近似值再除以1.3,直到距离小至3时, ...

  8. 【BZOJ】1598: [Usaco2008 Mar]牛跑步

    [题意]给定有向图,边严格从大编号指向小编号,求前k短路.n<=1000,m<=10000,k<=100. [算法]归并+拓扑排序||A*求第k短路 [题解]因为此题自带拓扑序的特殊 ...

  9. 【51NOD-0】1106 质数检测

    [算法]数学 #include<cstdio> #include<cmath> bool ok(int x) { int m=(int)sqrt(x+0.5); ;i<= ...

  10. 【洛谷 P3628】 [APIO2010]特别行动队 (斜率优化)

    题目链接 斜率优化总结待补,请催更.不催更不补 \[f[i]=f[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c\] \[=f[j]+a*sum[i]^2+a*s ...