BZOJ 2157 旅行
裸链剖。
这大概是我第一份两百行左右的代码吧。
然而我把题看错了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 旅行的更多相关文章
- BZOJ 2157 旅行(树链剖分码农题)
写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v ...
- bzoj 3531 旅行
动态开点线段树+树链剖分 对于每一种宗教信仰都开一颗线段树 空间: QlogN 即每一次修改都只会改变logN 个点 时间 O(QlogN) naive题 边没有开两倍 QAQ bzoj 35 ...
- BZOJ 2157: 旅游( 树链剖分 )
树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...
- bzoj 2157: 旅游 (LCT 边权)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 题面; 2157: 旅游 Time Limit: 10 Sec Memory Lim ...
- BZOJ 2157: 旅游
2157: 旅游 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1347 Solved: 619[Submit][Status][Discuss] ...
- AC日记——旅游 bzoj 2157
2157 思路: LCT: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 400005 #define IN ...
- BZOJ 2157 旅游(动态树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2157 [题目大意] 支持修改边,链上查询最大值最小值总和,以及链上求相反数 [题解] ...
- BZOJ 2157 旅游(树链剖分+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2157 [题目大意] 支持修改边,链上查询最大值最小值总和,以及链上求相反数 [题解] ...
- 洛谷 P1505 BZOJ 2157 [国家集训队]旅游
bzoj题面 Time limit 10000 ms Memory limit 265216 kB OS Linux 吐槽 又浪费一个下午--区间乘-1之后,最大值和最小值更新有坑.新的最大值是原来最 ...
随机推荐
- JQuery拾遗
1.关于JQuery的animate,可以操作background么? 答:如果是单纯的JQuery不可以,需要引入JQuery的ui核心库.否则只支持宽高.透明度.上下左右位置的变化. 2.能否说一 ...
- HDU 4937 Lucky Number (数学,进制转换)
题目 参考自博客:http://blog.csdn.net/a601025382s/article/details/38517783 //string &replace(iterator fi ...
- iOS后台运行
http://www.cocoachina.com/bbs/read.php?tid=149564 文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后 ...
- 深入浅出ES6(十一):生成器 Generators,续篇
作者 Jason Orendorff github主页 https://github.com/jorendorff 欢迎回到深入浅出ES6专栏,望你在ES6探索之旅中收获知识与快乐!程序员们在工作 ...
- Full GC有关问题学习分析(转载)
网站持久代引发Full GC问题分析 现状: Dragoon(监控系统)的日报显示trade_us_wholelsale(美国wholesale集群),日均Young GC次数25w次左右,应用暂停2 ...
- DMS平台从.NET 1.1升级到.NET 4.0的升级步骤
1)复制新增的项目到4.0平台解决方案对应目录,添加到到解决方案中:2)合并公共文件(比如修改了FormMain主界面.基础类库.售后界面的修改)3)控件的修订(Dev少数属性可能需要手工调整为新的方 ...
- NameNode HA滚动升级方案
Hadoop 滚动升级非常方便,只需要在配置中增加一些选项就可以通过Hadoop自身的代码进行完成. 步骤: 1.首先到需要升级的NameService的Active NameNode上面,比如我们1 ...
- spring定时器,5步完成
spring定时器,5步完成,我们开发的时候会用定时执行任务. 用spring框架时,可以直接使用spring定时功能 1.创建任务调度类,里面一个方法,方法名为work 2. spring配置文件, ...
- 在linux/unix中查找大文件
在linux/unix中查找大文件,如查找大于100M文件的位置路径,查找等于10M文件的位置路径等等,下面就介绍几个实现快速查找的命令: 1. 查找指定目录下所有大于100M的文件,命令为 find ...
- java、el表达式中保留小数的方法
Java中: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; p ...