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 ...
随机推荐
- Apache 多端口配置方法
首先修改httpd.conf配置文件. 添加8080端口 Listen 8080 打开虚拟配置文件 # Virtual hosts Include conf/extra/httpd-vhosts.co ...
- 编译器错误消息: CS1617: 选项“6”对 /langversion 无效
编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS1617: 选项“6”对 /langversion 无效:必须是 ...
- 《Cracking the Coding Interview》——第8章:面向对象设计——题目7
2014-04-23 23:38 题目:你要如何设计一个聊天服务器,有什么技术难点? 解法:这是基于工作经验的面试题吗?否则,一个new grad碰上这种题目能打点草稿也就算不错了. 代码: // 8 ...
- USACO Section1.5 Number Triangles 解题报告
numtri解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- js对象使用
以下是js对象使用的两种方式 <script type="text/javascript"> var people = function () { } //方法1 pe ...
- 基于Xtrabackup备份集来恢复某个误删除的表(drop)
Preface Yesterday,I've demonstratated how to rescue a droped and a truncated table based on ...
- selenium定位弹出菜单
写selenium脚本,在浏览器定位各种弹出菜单时,有时用工具很难去取菜单的属性,下面说下如何去取: 点开firebug ,切换到“脚本”界面,首先在输入框输入单字母s,待弹出下拉列表后,单击左侧的插 ...
- Python全栈工程师 (类变量、方法、继承、覆盖)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 补充: 实例方法都是操作实例对象 ...
- pom中的resources设置
Maven项目中一般都会把配置文件放到src/main/resources目录下,有时为了满足多个环境打包发布,可能会创建一些自定义目录来放置各环境的配置文件,如:src/main/profile/d ...
- ImportError: libcudart.so.8.0: cannot open shared object file: No such file or directory
这是在python中使用caffe产生的错误. 程序很普通: #-*-coding=utf-8-*- import numpy as npimport matplotlib.pyplot as plt ...