P4319 变化的道路

题目描述

小 w 和小 c 在 H 国,近年来,随着 H 国的发展,H 国的道路也在不断变化着

根据 H 国的道路法,H 国道路都有一个值 \(w\),表示如果小 w 和小 c 通过这条道路,那么他们的 \(L\) 值会减少 \(w\),但是如果小 w 和 小 c 在之前已经经过了这条路,那么他们的 L 值不会减少

H 国有 \(N\) 个国家,最开始 H 国有 \(N−1\) 条道路,这 \(N−1\) 条道路刚好构成一棵树

小 w 将和小 c 从 H 国的城市 1 出发,游览 H 国的所有城市,总共游览 32766 天,对于每一天,他们都希望游览结束后 L 值还是一个正数, 那么他们出发时 L 值至少为多少

H 国的所有边都是无向边,没有一条道路连接相同的一个城市

输入输出格式

输入格式:

输入第 1 行,一个整数\(N\)

输入第 2 至第 \(N\) 行,每行三个正整数 \(u, v, w\),表示城市 \(u\) 与城市 \(v\) 有一条值为 \(w\) 道路

输入第 \(N+1\) 行,一个整数 \(M\),表示 H 国有 \(M\) 条正在变化的道路

输入第 \(N+2\) 行到第 \(N+M+1\) 行,每行 5 个整数 \(u, v, w, l, r\),表示城市 \(u\) 到城市 \(v\) 有一条值为 \(w\) 的道路, 这条道路存在于第 \(l\) 天到第 \(r\) 天

输出格式:

输出共 32766 行,第 \(i\) 行表示第 \(i\) 天游览的 \(L\) 值至少为多少

说明

对于所有数据 : \(1\leq N\leq 50000, 1\leq l\leq r\leq rm\leq 32766, 1\leq w\leq 10^9\)


线段树分治+LCT维护动态最小生成树,比较裸

注意撤回的时候倒过来撤回,RE了一次


Code:

#include <cstdio>
#include <algorithm>
#include <vector>
#define ll long long
#define fa par[now]
#define ls ch[now][0]
#define rs ch[now][1]
using std::max;
const int N=2e5+10;
const int M=32766;
int ch[N][2],par[N],tag[N],s[N],tot,tmp,n,m;ll sum;
struct node
{
int mx,id;
bool friend operator <(node n1,node n2){return n1.mx<n2.mx;}
}dat[N],mx[N];
bool isroot(int now){return ch[fa][0]==now||ch[fa][1]==now;}
int identity(int now){return ch[fa][1]==now;}
void updata(int now){mx[now]=max(dat[now],max(mx[ls],mx[rs]));}
void connect(int f,int now,int typ){ch[fa=f][typ]=now;}
void Reverse(int now){tag[now]^=1,tmp=ls,ls=rs,rs=tmp;}
void pushdown(int now)
{
if(tag[now])
{
if(ls) Reverse(ls);
if(rs) Reverse(rs);
tag[now]^=1;
}
}
void Rotate(int now)
{
int p=fa,typ=identity(now);
connect(p,ch[now][typ^1],typ);
if(isroot(p)) connect(par[p],now,identity(p));
else fa=par[p];
connect(now,p,typ^1);
updata(p),updata(now);
}
void splay(int now)
{
while(isroot(now)) s[++tot]=now,now=fa;s[++tot]=now;
while(tot) pushdown(s[tot--]);now=s[1];
for(;isroot(now);Rotate(now))
if(isroot(fa))
Rotate(identity(now)^identity(fa)?now:fa);
}
void access(int now)
{
for(int las=0;now;las=now,now=fa)
splay(now),rs=las,updata(now);
}
void evert(int now){access(now),splay(now),Reverse(now);}
void split(int u,int v){evert(u),access(v),splay(v);}
void link(int u,int v){evert(u),par[u]=v;}
void cat(int u,int v){split(u,v),ch[v][0]=par[u]=0,updata(v);}
node query(int u,int v){split(u,v);return mx[v];}
std::vector <int > seg[N];
void Insert(int id,int L,int R,int l,int r,int p)
{
if(L==l&&R==r) {seg[id].push_back(p);return;}
int Mid=L+R>>1;
if(r<=Mid) Insert(id<<1,L,Mid,l,r,p);
else if(l>Mid) Insert(id<<1|1,Mid+1,R,l,r,p);
else Insert(id<<1,L,Mid,l,Mid,p),Insert(id<<1|1,Mid+1,R,Mid+1,r,p);
}
struct edge{int u,v,w;}Edge[N];
void segdivide(int id,int l,int r)
{
std::vector <int > sav;
for(int i=0;i<seg[id].size();i++)
{
int p=seg[id][i],las=0;
int u=Edge[p].u,v=Edge[p].v,w=Edge[p].w;
node tmp=query(u,v);
if(tmp.mx>w)
{
sum=sum+w-tmp.mx;
las=tmp.id;
cat(Edge[las].u,las+n),cat(Edge[las].v,las+n);
link(u,p+n),link(v,p+n);
}
sav.push_back(las);
}
int mid=l+r>>1;
if(l==r)
printf("%lld\n",sum+1);
else segdivide(id<<1,l,mid),segdivide(id<<1|1,mid+1,r);
for(int las,p,i=seg[id].size()-1;~i;i--)
{
p=seg[id][i];
if(las=sav[i])
{
int u=Edge[p].u,v=Edge[p].v;
cat(u,p+n),cat(v,p+n);
sum=sum+Edge[las].w-Edge[p].w;
u=Edge[las].u,v=Edge[las].v;
link(u,las+n),link(v,las+n);
}
}
}
int main()
{
scanf("%d",&n);
for(int u,v,w,i=1;i<n;i++)
{
scanf("%d%d%d",&u,&v,&w);
sum=sum+w;
dat[i+n]=mx[i+n]={w,i};
link(u,i+n),link(v,i+n);
Edge[i]={u,v,w};
}
scanf("%d",&m);
for(int u,v,w,l,r,i=0;i<m;i++)
{
scanf("%d%d%d%d%d",&u,&v,&w,&l,&r);
Edge[i+n]={u,v,w};
dat[i+(n<<1)]=mx[i+(n<<1)]={w,i+n};
Insert(1,1,M,l,r,i+n);
}
segdivide(1,1,M);
return 0;
}

2018.12.8

洛谷 P4319 变化的道路 解题报告的更多相关文章

  1. 洛谷P4319 变化的道路

    题意:给定图,每条边都有一段存在时间.求每段时间的最小生成树. 解:动态MST什么毒瘤...洛谷上还是蓝题... 线段树分治 + lct维护最小生成树. 对时间开线段树,每条边的存在时间在上面会对应到 ...

  2. 【刷题】洛谷 P4319 变化的道路

    题目描述 小 w 和小 c 在 H 国,近年来,随着 H 国的发展,H 国的道路也在不断变化着 根据 H 国的道路法,H 国道路都有一个值 \(w\) ,表示如果小 w 和小 c 通过这条道路,那么他 ...

  3. 洛谷 P1462 通往奥格瑞玛的道路 解题报告

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  4. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  5. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  6. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  7. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  8. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  9. NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告

    前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...

随机推荐

  1. 使用Python的Requests库进行web接口测试

    1.Requests简介Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提 ...

  2. NO.07--我跟“ 币乎 ”的那些事

    文章开头给大家安利一款app吧,就是我标题提到的,‘币乎’,一个近似于虚拟货币的论坛吧,大家可以下载试试,发文章点赞赚钱,... 好了,开始说一说今天的正题吧: 这些事情说起来其实挺惭愧的,但也不是什 ...

  3. [redis] linux下主从篇(2)

    一.前言1.为何要主从架构避免单机故障,主服务器挂掉后,还可以手动切换从服务为主服务继续工作,保持缓存数据完整. 2.主从同步的原理步骤从服务器连接主服务器,发送SYNC命令:主服务器接收到SYNC命 ...

  4. call appiy

    其实就是动态的改变this了,下面例子就说明了... function add(a, b){ console.dir(this); } function sub(a, b){ console.dir( ...

  5. USACO 2.4.4 Bessie Come Home 回家(最短路)

    Description 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只速度最快 ...

  6. 按Right-BICEP要求的对任务二的测试用例

    测试方法:Right-BICEP 测试计划 1.Right-结果是否正确? 2.B-是否所有的边界条件都是正确的? 3.P-是否满足性能要求? 4.是否有乘除法? 5.是否有括号? 6.是否有真分数? ...

  7. Python:模块学习——os模块

    os模块提供了多个访问操作系统服务的功能 os模块中一些重要的函数和变量 os.name 显示当前使用平台 os.getcwd() 显示当前Python脚本工作路径 os.listdir('dirna ...

  8. 本周实验PSP0 过程文档

    2016-03-12 项目总结: 日期\学习时间 听课 编写程序 阅读相关书籍 日总计 周一 110 0 30 140 周二 0 30 30 60 周三 0 40 0 40 周四 110 20 30 ...

  9. P4语法(3)Table,Action

    Table table是p4的匹配——动作表,定义了匹配字段(key).动作(action)和一些其他相关属性. 其处理数据包的流程: Key construction.建立其匹配字段 Key loo ...

  10. mysql---时间类型详解

    mysql 日期类型 mysql 日期类型    ·  DATE (适用于"出生日期"等只需要年月日数据的日期字段) 日期.支持的范围为'1000-01-01'到'9999-12- ...