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之后,最大值和最小值更新有坑.新的最大值是原来最 ...
随机推荐
- iOS打电话,发短信,发邮件,打开网址
//调用自带mail [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@hzl ...
- 项目中用到的SQL-总结
基本sql总结: Group by的理解:having子句,分组函数 Group by使用的限定: 1.出现在Select列表中的字段或者出现在order by后面的字段,如果不是包含在分组函数中,那 ...
- UVA 10574 - Counting Rectangles 计数
Given n points on the XY plane, count how many regular rectangles are formed. A rectangle is regular ...
- poj 3255(次短路)
题目链接:http://poj.org/bbs?problem_id=3255 思路:分别以源点1和终点N为源点,两次SPFA求得dist1[i](1到各点的最短距离)以及dist2[i](各点到N的 ...
- CSS深入理解之line-height
以下文字整理自慕课网——张鑫旭的<CSS深入理解之line-height>. line-height,又称行高,指的是两行文字基线之间的距离,又可以称为这行文字所占的高度. 定义三问: 什 ...
- 15.RDD 创建内幕解析
第15课:RDD创建内幕 RDD的创建方式 Spark应用程序运行过程中,第一个RDD代表了Spark应用程序输入数据的来源,之后通过Trasformation来对RDD进行各种算子的转换,来实现具体 ...
- Tomcat SSL 设置
1. 先用如下命令生成tomcat 证书 cls rem please set the env JAVA_HOME before run this bat file SET JAVA_HOME=C:\ ...
- cocos2d-x3.0环境搭建(基于win7以及mac)
流程概览: Windows平台 一.安装 Python与配置Python环境变量 二.安装Cocos2d-x,并创建项目 Mac平台 安装Cocos2d-x,并创建项目 具体操作: 一.安装Pytho ...
- hdu 1567 2006 (题意理解容易出错)
#include<stdio.h> #include<vector> #include<algorithm> using namespace std; struct ...
- 图解TCP/IP读书笔记(三)
第三章.数据链路 数据链路层是计算机网络最基本的内容. 数据链路层的协议定义了通过通信媒介互连的设备之间传输的规范. 一.数据链路相关技术 1.MAC地址 关于MAC地址的几个要点: ①MAC地址长度 ...