传送门

这该死的码农题……

把每一条边变为它连接的两个点中深度较浅的那一个,然后就是一堆单点修改/路径查询,不讲了

这里就讲一下怎么搞路径取反,只要打一个标记就好了,然后把区间和取反,最大最小值交换然后再取反

单点修改的时候忘记pushdown结果调了好久……

 //minamoto
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,:;}
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getchar()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getchar());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int K=-,Z;
inline void Ot(){fwrite(sr,,K+,stdout),K=-;}
inline void print(int x){
if(K><<)Ot();if(x<)sr[++K]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
const int N=;
int head[N],Next[N<<],ver[N<<],edge[N<<],tot=;
inline void add(int u,int v,int e){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
}
int dfn[N],top[N],sz[N],son[N],num[N],val[N],dep[N],fa[N],cnt,n,m;
void dfs1(int u){
sz[u]=,dep[u]=dep[fa[u]]+;
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(v!=fa[u]){
fa[v]=u,num[i>>]=v,dfs1(v),sz[u]+=sz[v];
if(sz[son[u]]<sz[v]) son[u]=v;
}
}
}
void dfs2(int u,int t){
top[u]=t,dfn[u]=++cnt;
if(son[u]){
dfs2(son[u],t);
for(int i=head[u];i;i=Next[i])
if(ver[i]!=fa[u]&&ver[i]!=son[u])
dfs2(ver[i],ver[i]);
}
}
int mx[N<<],mn[N<<],sum[N<<],rev[N<<];
#define ls (p<<1)
#define rs (p<<1|1)
inline void upd(int p){
mx[p]=max(mx[ls],mx[rs]),mn[p]=min(mn[ls],mn[rs]),sum[p]=sum[ls]+sum[rs];
}
inline void ppd(int p){
rev[p]^=,sum[p]=-sum[p],swap(mn[p],mx[p]),mn[p]=-mn[p],mx[p]=-mx[p];
}
inline void pd(int p){
if(rev[p]){
ppd(ls),ppd(rs);
rev[p]=;
}
}
void build(int p,int l,int r){
if(l==r) return (void)(mx[p]=mn[p]=sum[p]=val[l]);
int mid=(l+r)>>;
build(ls,l,mid),build(rs,mid+,r);
upd(p);
}
void update(int p,int l,int r,int x){
if(l==r) return (void)(mn[p]=mx[p]=sum[p]=val[l]);
int mid=(l+r)>>;pd(p);
x<=mid?update(ls,l,mid,x):update(rs,mid+,r,x);
upd(p);
}
void Rev(int p,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r) return (void)(ppd(p));
int mid=(l+r)>>;pd(p);
if(ql<=mid) Rev(ls,l,mid,ql,qr);
if(qr>mid) Rev(rs,mid+,r,ql,qr);
upd(p);
}
int querysum(int p,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r) return sum[p];
int mid=(l+r)>>,res=;pd(p);
if(ql<=mid) res+=querysum(ls,l,mid,ql,qr);
if(qr>mid) res+=querysum(rs,mid+,r,ql,qr);
return res;
}
int querymax(int p,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r) return mx[p];
int mid=(l+r)>>,res=-inf;pd(p);
if(ql<=mid) cmax(res,querymax(ls,l,mid,ql,qr));
if(qr>mid) cmax(res,querymax(rs,mid+,r,ql,qr));
return res;
}
int querymin(int p,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r) return mn[p];
int mid=(l+r)>>,res=inf;pd(p);
if(ql<=mid) cmin(res,querymin(ls,l,mid,ql,qr));
if(qr>mid) cmin(res,querymin(rs,mid+,r,ql,qr));
return res;
}
void change(int i,int x){
val[dfn[num[i]]]=x,update(,,n,dfn[num[i]]);
}
void RRR(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
Rev(,,n,dfn[top[u]],dfn[u]);u=fa[top[u]];
}
if(u!=v){
if(dep[u]<dep[v]) swap(u,v);
Rev(,,n,dfn[son[v]],dfn[u]);
}
}
int SUM(int u,int v){
int res=;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
res+=querysum(,,n,dfn[top[u]],dfn[u]);u=fa[top[u]];
}
if(u!=v){
if(dep[u]<dep[v]) swap(u,v);
res+=querysum(,,n,dfn[son[v]],dfn[u]);
}
return res;
}
int MAX(int u,int v){
int res=-inf;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
cmax(res,querymax(,,n,dfn[top[u]],dfn[u]));u=fa[top[u]];
}
if(u!=v){
if(dep[u]<dep[v]) swap(u,v);
cmax(res,querymax(,,n,dfn[son[v]],dfn[u]));
}
return res;
}
int MIN(int u,int v){
int res=inf;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
cmin(res,querymin(,,n,dfn[top[u]],dfn[u]));u=fa[top[u]];
}
if(u!=v){
if(dep[u]<dep[v]) swap(u,v);
cmin(res,querymin(,,n,dfn[son[v]],dfn[u]));
}
return res;
}
char s[];
int main(){
// freopen("testdata.in","r",stdin);
n=read();
for(int i=,u,v,e;i<n;++i)
u=read()+,v=read()+,e=read(),add(u,v,e),add(v,u,e);
dfs1(),dfs2(,);
for(int i=;i<n;++i) val[dfn[num[i]]]=edge[i<<];
build(,,n);
m=read();
while(m--){
scanf("%s",s+);int u=read()+,v=read()+;
switch(s[]){
case 'C':--u,--v,change(u,v);break;
case 'N':RRR(u,v);break;
case 'S':print(SUM(u,v));break;
default:{
print(s[]=='A'?MAX(u,v):MIN(u,v));
break;
}
}
}
Ot();
return ;
}

洛谷P1505 [国家集训队]旅游(树剖+线段树)的更多相关文章

  1. 洛谷 P1505 [国家集训队]旅游 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1505 [国家集训队]旅游 题目描述 Ray 乐 ...

  2. 洛谷 P1505 [国家集训队]旅游 解题报告

    P1505 [国家集训队]旅游 题目描述 \(\tt{Ray}\) 乐忠于旅游,这次他来到了\(T\)城.\(T\)城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游 ...

  3. 洛谷P1505 [国家集训队]旅游

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

  4. [洛谷]P1505 [国家集训队]旅游

    题目链接: 传送门 题目分析: 树剖板,支持单点修改,区间取反,区间求最大值/最小值/和 区间取反取两次等于没取,维护一个\(rev\ tag\),每次打标记用\(xor\)打,记录是否需要翻转,\( ...

  5. 2018.06.29 洛谷P1505 [国家集训队]旅游(树链剖分)

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

  6. 洛谷 P1975 [国家集训队]排队 Lebal:块内排序+树状数组

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和. 红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...

  7. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  8. 洛谷P4315 月下“毛景树”(树剖+线段树)

    传送门 woc这该死的码农题…… 把每一条边转化为它连接的两点中深度较深的那一个,然后就可以用树剖+线段树对路径进行修改了 然后顺便注意在上面这种转化之后,树剖的时候不能搞$LCA$ 然后是几个注意点 ...

  9. BZOJ_2157_旅游_树剖+线段树

    BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...

随机推荐

  1. ASP.NET状态保持cookie与session

    ASP.Net状态保持 一.ASP.Net中的状态保持如下图:   二.客户端的状态保持方案     ViewState.隐藏域.Cookies.控件状态.URL查询参数      ->View ...

  2. THUPC2018看题总结

    THUPC2018看题总结 #6387. 「THUPC2018」绿绿与串串 / String 据说是签到题啊. 首先根据题目的意思,我们发现如果能找到那个最后一次选择的对称轴岂不是美滋滋. 自然地,我 ...

  3. EF关联

    public CustomerMap() { this.ToTable("Customer"); this.HasKey(c => c.Id); this.Property( ...

  4. [转] SQL SERVER 2008 R2 安装中的账户设置问题

    故纸堆 原文:SQL SERVER 2008安装中设置账户的问题,2013-7 在安装SQL Server 2008数据库服务器的时候,服务器有可能处于以下几种环境中: ①工作组环境下的服务器 (Wo ...

  5. 去哪网实习总结:easyui在JavaWeb中的使用,以datagrid为例(JavaWeb)

    本来是以做数据挖掘的目的进去哪网的,结构却成了系统开发. . . 只是还是比較认真的做了三个月.老师非常认同我的工作态度和成果.. . 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题, ...

  6. 【c++】动态内存

    静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量.注意:const常量在定义时必须初始化 栈区:在执行函数时,函数内局部变量的存储单 ...

  7. [Angular] Modify User Provided UI with Angular Content Directives

    If we’re going to make our toggle accessible, we’ll need to apply certain aria attributes to the con ...

  8. Oracle APEX 4.2安装和配置

    A standard Oracle 11.2.0.3 database installation comes bundled with Application Express (APEX) 3.2.1 ...

  9. java中 ++前后差别试题及静态变量一旦赋值不可改变

    package javaTest; public class Increment { private static int k=0; public static void main(String[] ...

  10. 树莓派 mongodb 安装&报错处理

    树莓派 mongodb 安装&报错处理 编译过的源码下载地址: http://files.cnblogs.com/files/xueshanshan/mongodb-rpi.zip addus ...