裸链剖。

这大概是我第一份两百行左右的代码吧。

然而我把题看错了233333333调了将近两天。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 100050
#define maxe 300050
using namespace std;
struct edge
{
int v,w,nxt;
}e[maxe];
struct edge_
{
int u,v,w;
}eg[maxe];
char s[];
int n,x,y,z,g[maxv],nume=,nume_=,m;
int dis[maxv],w[maxv],top[maxv],fath[maxv],size[maxv],son[maxv],cnt=,tot=,c[maxv];
int ls[maxv<<],rs[maxv<<],lazy[maxv<<],sum[maxv<<],mx[maxv<<],mn[maxv<<],root;
void addedge(int u,int v,int w)
{
e[++nume].v=v;
e[nume].w=w;
e[nume].nxt=g[u];
g[u]=nume;
}
void addedge_(int u,int v,int w)
{
eg[++nume_].u=u;
eg[nume_].v=v;
eg[nume_].w=w;
}
void dfs1(int x,int father)
{
size[x]=;son[x]=;
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v!=father)
{
fath[v]=x;dis[v]=dis[x]+;
dfs1(v,x);
size[x]+=size[v];
if (size[v]>size[son[x]]) son[x]=v;
}
}
}
void dfs2(int x,int father)
{
top[x]=father;w[x]=++cnt;
if (son[x]!=) dfs2(son[x],father);
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v!=fath[x])
{
if (v!=son[x]) dfs2(v,v);
c[w[v]]=e[i].w;
}
}
}
void pushup(int now)
{
sum[now]=sum[ls[now]]+sum[rs[now]];
mx[now]=max(mx[ls[now]],mx[rs[now]]);
mn[now]=min(mn[ls[now]],mn[rs[now]]);
}
void build(int &now,int left,int right)
{
now=++tot;lazy[now]=;
if (left==right)
{
sum[now]=mn[now]=mx[now]=c[left];
return;
}
int mid=(left+right)>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
pushup(now);
}
void pushdown(int now,int left,int right)
{
int r1,r2;
if (lazy[now]==)
{
sum[ls[now]]=-sum[ls[now]];sum[rs[now]]=-sum[rs[now]];
r1=mn[ls[now]];r2=mx[ls[now]];mn[ls[now]]=-r2;mx[ls[now]]=-r1;
r1=mn[rs[now]];r2=mx[rs[now]];mn[rs[now]]=-r2;mx[rs[now]]=-r1;
lazy[ls[now]]^=;lazy[rs[now]]^=;
lazy[now]=;
}
}
void modify(int now,int left,int right,int l,int r,int p,int type)
{
pushdown(now,left,right);
if ((left==l) && (right==r))
{
if (type==)
{
sum[now]=p;
mx[now]=p;mn[now]=p;
return;
}
else
{
lazy[now]^=;
sum[now]=-sum[now];
int r1,r2;r1=mn[now];r2=mx[now];
mn[now]=-r2;mx[now]=-r1;
return;
}
}
int mid=(left+right)>>;
if (r<=mid) modify(ls[now],left,mid,l,r,p,type);
else if (l>=mid+) modify(rs[now],mid+,right,l,r,p,type);
else
{
modify(ls[now],left,mid,l,mid,p,type);
modify(rs[now],mid+,right,mid+,r,p,type);
}
pushup(now);
}
int ask(int now,int left,int right,int l,int r,int type)
{
pushdown(now,left,right);
if ((left==l) && (right==r))
{
if (type==) return sum[now];
else if (type==) return mx[now];
else return mn[now];
}
int mid=(left+right)>>;
if (r<=mid) return ask(ls[now],left,mid,l,r,type);
else if (l>=mid+) return ask(rs[now],mid+,right,l,r,type);
else
{
if (type==) return ask(ls[now],left,mid,l,mid,type)+ask(rs[now],mid+,right,mid+,r,type);
else if (type==) return max(ask(ls[now],left,mid,l,mid,type),ask(rs[now],mid+,right,mid+,r,type));
else return min(ask(ls[now],left,mid,l,mid,type),ask(rs[now],mid+,right,mid+,r,type));
}
}
void work()
{
scanf("%d%d",&x,&y);
x++;y++;
int f1=top[x],f2=top[y];
if (s[]=='N')
{
while (f1!=f2)
{
if (dis[f1]<dis[f2]) {swap(f1,f2);swap(x,y);}
modify(root,,cnt,w[f1],w[x],,);
x=fath[f1];f1=top[x];
}
if (x!=y)
{
if (dis[x]>dis[y]) swap(x,y);
modify(root,,cnt,w[son[x]],w[y],,);
}
}
else if (s[]=='S')
{
int ans=;
while (f1!=f2)
{
if (dis[f1]<dis[f2]) {swap(f1,f2);swap(x,y);}
ans+=ask(root,,cnt,w[f1],w[x],);
x=fath[f1];f1=top[x];
}
if (x!=y)
{
if (dis[x]>dis[y]) swap(x,y);
ans+=ask(root,,cnt,w[son[x]],w[y],);
}
printf("%d\n",ans);
}
else if ((s[]=='M') && (s[]=='A'))
{
int ans=0xefefefef;
while (f1!=f2)
{
if (dis[f1]<dis[f2]) {swap(f1,f2);swap(x,y);}
ans=max(ans,ask(root,,cnt,w[f1],w[x],));
x=fath[f1];f1=top[x];
}
if (x!=y)
{
if (dis[x]>dis[y]) swap(x,y);
ans=max(ans,ask(root,,cnt,w[son[x]],w[y],));
}
printf("%d\n",ans);
}
else
{
int ans=0x3f3f3f3f;
while (f1!=f2)
{
if (dis[f1]<dis[f2]) {swap(f1,f2);swap(x,y);}
ans=min(ans,ask(root,,cnt,w[f1],w[x],));
x=fath[f1];f1=top[x];
}
if (x!=y)
{
if (dis[x]>dis[y]) swap(x,y);
ans=min(ans,ask(root,,cnt,w[son[x]],w[y],));
}
printf("%d\n",ans);
}
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n-;i++)
{
scanf("%d%d%d",&x,&y,&z);
x++;y++;
addedge(x,y,z);
addedge(y,x,z);
addedge_(x,y,z);
}
dfs1(,);
dfs2(,);
build(root,,cnt);
scanf("%d",&m);
for (int i=;i<=m;i++)
{
scanf("%s",s);
if (s[]=='C')
{
scanf("%d%d",&x,&y);
int u,v;
u=eg[x].u;v=eg[x].v;
if (fath[u]==v) modify(root,,cnt,w[u],w[u],y,);
else modify(root,,cnt,w[v],w[v],y,);
}
else work();
}
return ;
}

BZOJ 2157 旅行的更多相关文章

  1. BZOJ 2157 旅行(树链剖分码农题)

    写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v ...

  2. bzoj 3531 旅行

    动态开点线段树+树链剖分  对于每一种宗教信仰都开一颗线段树 空间: QlogN 即每一次修改都只会改变logN 个点 时间 O(QlogN)  naive题  边没有开两倍  QAQ bzoj 35 ...

  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. AC日记——旅游 bzoj 2157

    2157 思路: LCT: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 400005 #define IN ...

  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. 洛谷 P1505 BZOJ 2157 [国家集训队]旅游

    bzoj题面 Time limit 10000 ms Memory limit 265216 kB OS Linux 吐槽 又浪费一个下午--区间乘-1之后,最大值和最小值更新有坑.新的最大值是原来最 ...

随机推荐

  1. iOS音效

    //AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service) //System Sound S ...

  2. ***ECharts图表入门和最佳实践

    ECharts数据图表系统? 5分钟上手! [ECharts简介] ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动, ...

  3. ****RESTful API 设计最佳实践(APP后端API设计参考典范)

    http://blog.jobbole.com/41233/ 背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而 ...

  4. SQL Server Configuration Manager出错

    在 Windows 桌面上,单击“开始”,然后单击“运行”.  在“打开”框中,键入 MMC,然后单击“确定”.  在“控制台”窗口中,单击菜单栏上的“文件”,然后单击“添加/删除管理单元”.  在“ ...

  5. 矩阵快速幂 POJ 3735 Training little cats

    题目传送门 /* 题意:k次操作,g:i猫+1, e:i猫eat,s:swap 矩阵快速幂:写个转置矩阵,将k次操作写在第0行,定义A = {1,0, 0, 0...}除了第一个外其他是猫的初始值 自 ...

  6. DFS+剪枝 HDOJ 5323 Solve this interesting problem

    题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...

  7. lintcode:买卖股票的最佳时机 II

    买卖股票的最佳时机 II 假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格.设计一个算法来找到最大的利润.你可以完成尽可能多的交易(多次买卖股票).然而,你不能同时参与多个交易(你必须在再 ...

  8. MySQL定义外键的方法

    MySQL定义外键的方法是每个学习MySQL的人都需要掌握的知识,下文就对MySQL定义外键的语句写法进行了详细的阐述,供您参考. 外键为MySQL带来了诸多的好处,下面就为您介绍MySQL定义外键的 ...

  9. 转载网页博客:ie7bug:div容器下的img与div存在间隙

    1.代码及在浏览器上的显示 ie7: ie8+: Firefox: Chrome: 可以看出ie7上在div容器下添加img,div与img中有间隙,而在ie8+和其他浏览器上均显示正常 网页源代码如 ...

  10. JVM垃圾回收机制总结(1) :一些概念

    数据类型 Java虚拟机中,数据类型可以分为两类:基本类型 和引用类型 .基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...