AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867
思路:
树链剖分,边权转点权;
线段树维护三个东西,sum,max,min;
当一个区间变成相反数时,sum=-sum,max=-min,min=-max;
来,上代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 100005
#define ll long long
#define INF 0x7fffffff struct TreeNodeType {
ll l,r,mi,ma,sum,mid,flag;
};
struct TreeNodeType tree[maxn<<]; ll n,m,E[maxn<<],V[maxn<<],W[maxn<<],cnt;
ll deep[maxn],ps[maxn],pe[maxn],head[maxn],X,ty;
ll f[maxn],id[maxn],ds[maxn],size[maxn],top[maxn]; inline void in(ll &now)
{
ll 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;
} inline void edge_add(ll u,ll v,ll w)
{
E[++cnt]=head[u],V[cnt]=v,W[cnt]=w,head[u]=cnt;
E[++cnt]=head[v],V[cnt]=u,W[cnt]=w,head[v]=cnt;
} void pre(ll now,ll fa)
{
f[now]=fa,size[now]=;
if(fa==-) deep[now]=;
else deep[now]=deep[fa]+;
for(ll i=head[now];i;i=E[i])
{
if(V[i]==fa) continue;
pre(V[i],now),size[now]+=size[V[i]];
}
} void dfs(ll now,ll chain,ll dis)
{
ll pos=n+,ww;
top[now]=chain,id[now]=++cnt,ds[cnt]=dis;
for(ll i=head[now];i;i=E[i])
{
if(V[i]==f[now]) continue;
if(size[V[i]]>size[pos]) pos=V[i],ww=W[i];
}
if(pos==n+) return ;
dfs(pos,chain,ww);
for(ll i=head[now];i;i=E[i])
{
if(V[i]==pos||V[i]==f[now]) continue;
dfs(V[i],V[i],W[i]);
}
} void tree_build(ll now,ll l,ll r)
{
tree[now].l=l,tree[now].r=r;
if(l==r)
{
tree[now].mi=ds[l];
tree[now].ma=ds[l];
tree[now].sum=ds[l];
return ;
}
tree[now].mid=l+r>>;
tree_build(now<<,l,tree[now].mid);
tree_build(now<<|,tree[now].mid+,r);
tree[now].sum=tree[now<<].sum+tree[now<<|].sum;
tree[now].ma=max(tree[now<<].ma,tree[now<<|].ma);
tree[now].mi=min(tree[now<<].mi,tree[now<<|].mi);
} inline void tree_down(ll now)
{
ll mii=tree[now<<].mi,maa=tree[now<<].ma;
tree[now<<].ma=-mii,tree[now<<].mi=-maa;
tree[now<<].sum=-tree[now<<].sum;
mii=tree[now<<|].mi,maa=tree[now<<|].ma;
tree[now<<|].mi=-maa,tree[now<<|].ma=-mii;
tree[now<<|].sum=-tree[now<<|].sum;
tree[now<<].flag=!tree[now<<].flag;
tree[now<<|].flag=!tree[now<<|].flag;
tree[now].flag=false;
} void tree_query(ll now,ll l,ll r)
{
if(tree[now].l==l&&tree[now].r==r)
{
if(ty==) X+=tree[now].sum;
else if(ty==) X=max(X,tree[now].ma);
else X=min(X,tree[now].mi);
return ;
}
if(tree[now].flag) tree_down(now);
if(l>tree[now].mid) tree_query(now<<|,l,r);
else if(r<=tree[now].mid) tree_query(now<<,l,r);
else tree_query(now<<,l,tree[now].mid),tree_query(now<<|,tree[now].mid+,r);
} void tree_change(ll now,ll to)
{
if(tree[now].l==tree[now].r)
{
tree[now].mi=X;
tree[now].ma=X;
tree[now].sum=X;
return ;
}
if(tree[now].flag) tree_down(now);
if(to<=tree[now].mid) tree_change(now<<,to);
else tree_change(now<<|,to);
tree[now].sum=tree[now<<].sum+tree[now<<|].sum;
tree[now].ma=max(tree[now<<].ma,tree[now<<|].ma);
tree[now].mi=min(tree[now<<].mi,tree[now<<|].mi);
} void tree_change_(ll now,ll l,ll r)
{
if(tree[now].l==l&&tree[now].r==r)
{
tree[now].flag=!tree[now].flag;
ll mii=tree[now].mi,maa=tree[now].ma;
tree[now].sum=-tree[now].sum;
tree[now].ma=-mii,tree[now].mi=-maa;
return ;
}
if(tree[now].flag) tree_down(now);
if(l>tree[now].mid) tree_change_(now<<|,l,r);
else if(r<=tree[now].mid) tree_change_(now<<,l,r);
else tree_change_(now<<,l,tree[now].mid),tree_change_(now<<|,tree[now].mid+,r);
tree[now].sum=tree[now<<].sum+tree[now<<|].sum;
tree[now].ma=max(tree[now<<].ma,tree[now<<|].ma);
tree[now].mi=min(tree[now<<].mi,tree[now<<|].mi);
} void solve_change(ll x,ll y)
{
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) swap(x,y);
tree_change_(,id[top[x]],id[x]);
x=f[top[x]];
}
if(deep[x]>deep[y]) swap(x,y);
if(x!=y) tree_change_(,id[x]+,id[y]);
} void solve_query(ll x,ll y)
{
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) swap(x,y);
tree_query(,id[top[x]],id[x]);
x=f[top[x]];
}
if(deep[x]>deep[y]) swap(x,y);
if(x!=y) tree_query(,id[x]+,id[y]);
} int main()
{
freopen("nt2011_travel.in","r",stdin);
freopen("nt2011_travel.out","w",stdout);
in(n);ll u,v,w;
for(ll i=;i<n;i++)
{
in(u),in(v),in(w);
edge_add(u,v,w);
ps[i]=u,pe[i]=v;
}
cnt=,pre(,-),dfs(,,);
tree_build(,,n);
in(m);char ch[];
while(m--)
{
scanf("%s",ch);in(u),in(v);
if(ch[]=='N') solve_change(u,v);
else if(ch[]=='C')
{
X=v;
if(deep[ps[u]]>deep[pe[u]]) swap(ps[u],pe[u]);
tree_change(,id[pe[u]]);
}
else if(ch[]=='S') ty=,X=,solve_query(u,v),printf("%lld\n",X);
else if(ch[]=='M')
{
if(ch[]=='A') ty=,X=-INF,solve_query(u,v),printf("%lld\n",X);
else ty=,X=INF,solve_query(u,v),printf("%lld\n",X);
}
}
fclose(stdin),fclose(stdout);
return ;
}
AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867的更多相关文章
- AC日记——[国家集训队2010]小Z的袜子 cogs 1775
[国家集训队2010]小Z的袜子 思路: 传说中的莫队算法(优雅的暴力): 莫队算法是一个离线的区间询问算法: 如果我们知道[l,r], 那么,我们就能O(1)的时间求出(l-1,r),(l+1,r) ...
- cogs 1901. [国家集训队2011]数颜色
Cogs 1901. [国家集训队2011]数颜色 ★★★ 输入文件:nt2011_color.in 输出文件:nt2011_color.out 简单对比时间限制:0.6 s 内存限制 ...
- BZOJ 2150 cogs 1861 [国家集训队2011]部落战争
题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb把 ...
- happiness[国家集训队2011(吴确)]
[试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科 ...
- COGS1882 [国家集训队2011]单选错位
★ 输入文件:nt2011_exp.in 输出文件:nt2011_exp.out 简单对比时间限制:1 s 内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题 ...
- 1893. [国家集训队2011]等差子序列(bitset)
★★ 输入文件:nt2011_sequence.in 输出文件:nt2011_sequence.out 简单对比时间限制:0.3 s 内存限制:512 MB [试题来源] 2011中国 ...
- bzoj2144 【国家集训队2011】跳跳棋
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...
- COGS.1901.[模板][国家集训队2011]数颜色(带修改莫队)
题目链接 COGS BZOJ2120 洛谷P1903 /* Add和Subd函数中的vis不能直接设为=1或=0 比如 l=1,r=0 -> l=3,r=5 时,[1,5]的vis标记全都是1 ...
- COGS1871 [国家集训队2011]排队(魏铭)
bzoj:http://www.lydsy.com/JudgeOnline/problem.php?id=2141 cogs:http://cogs.pro:8080/cogs/problem/pro ...
随机推荐
- hadoop中namenode启动失败
jps发现namenode启动失败 每次开机都要重新格式化一下namenode才可以 其实问题出现自tmp文件上,因为每次开机就会被清空,所以现在我们配置一个tmp文件目录. 如果之前没有配置过,默认 ...
- echart图表展示数据-简单的柱状图
话不多说,先上几张效果图 给大家看看 1:echart所用到的文件包需要事先引入好具体可见 http://echarts.baidu.com/doc/start.html 2:本例中所有的数据都是通过 ...
- 《Cracking the Coding Interview》——第1章:数组和字符串——题目6
2014-03-18 01:45 题目:给定一个NxN的矩阵,就地旋转90度.(没有样例又不说方向的话,随便往哪儿转.) 解法:如果N为奇数,除了中心点以外四等分.如果N为偶数,四等分.按照A-> ...
- python-使用unittest和ddt实现数据驱动
一.数据驱动的概念 相同测测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式成为数据驱动.测试框架使用unittest 和ddt模块相结合的方式 二.unittest ...
- Python网络编程(子进程的创建与处理、简单群聊工具)
前言: 昨天我们已经了解了多进程的原理以及它的实际使用 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次, 但是fork()调用一次,返回两次 ...
- 设置hostname
由于 http://1.2.3.4 不是一个有效的 apt 源,安装肯定会失败,我们可以在 /var/log/cloud-init.log 看到失败的信息. cloud-init 默认会将 insta ...
- 上手Caffe(二)
@author:oneBite本文简述如何在windows环境下,运行caffe的“hello world”例程体会适用caffe的流程:转换输入数据格式>在solver.prototxt中配置 ...
- Leetcode 661.图片平滑器
图片平滑器 包含整数的二维矩阵 M 表示一个图片的灰度.你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个 ...
- NodeJs06 高并发
高并发架构 在业务的最初期,由于业务和用户的体量比较小,可能采用单机就足够了.随着业务的增长,用户量和并发请求量都会不断上升.当增长到一定的瓶颈的时候,系统能否抗住压力,就需要采取一些方案了.这就是著 ...
- Eureka 使用Spring cloud config 管理中心启动
Config 工程创建之后,Eureka就可以使用Git上的配置启动服务了. Git 服务器的搭建这里就不细说了(自行解决),下面是我上传再git的配置文件: 创建EurekaServer项目(eur ...