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. 关于ExecuteNonQuery执行的返回值(SQL语句、存储过程)

    因为msdn中说返回受影响的行数: Executes a Transact-SQL statement against the connection and returns the number of ...

  2. svn 配置仓库

    1.新建一个空文件夹,然后点击--在此创建版本库. 2.修改conf 下的 svnserve.conf : anon-access = read auth-access = write passwor ...

  3. JMeter:全面的乱码解决方案【转】

    本文是转自https://www.cnblogs.com/mawenqiangios/p/7918583.html 感谢分享者   中文乱码一直都是比较让人棘手的问题,我们在使用Jmeter的过程中, ...

  4. java计算两个日期之间的天数,排除节假日和周末

    如题所说,计算两个日期之前的天数,排除节假日和周末.这里天数的类型为double,因为该功能实现的是请假天数的计算,有请一上午假的为0.5天. 不够很坑的是每个日期都要查询数据库,感觉很浪费时间. 原 ...

  5. List Leaves 树的层序遍历

    3-树2 List Leaves (25 分) Given a tree, you are supposed to list all the leaves in the order of top do ...

  6. 联邦快递 IE和IP的区别 Fedex IE VS Fedex IP

    什么是FedEx IP? FedEx IP指的是联邦快递优先服务,时效比较快些,相对来说价格也比普通的高一些. 什么是FedEx IE? FedEx IE指的是联邦快递经济服务,时效与FedEx IP ...

  7. Full Binary Tree(二叉树找规律)

    Description In computer science, a binary tree is a tree data structure in which each node has at mo ...

  8. 20181120-10 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 7

    此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2415] 版本控制地址    [https://git.coding.n ...

  9. Programming Protocol-Independent Packet Processors

    引言 OpenFlow协议固定的包头域数目,使得南向协议过于死板. P4可以实现自定义包头,增加灵活性. P4是OpenFlow未来发展的方向. We propose P4 as a strawman ...

  10. C++总结作业

    在博客作业中学到的内容 在博客作业中,首先我学到了Markdown编辑器的排版格式,github的上传,如果没有博客作业,可能根本不会接触到这些内容.然后,就C++来讲,我在博客作业中学会了命令行参数 ...