LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP
题目:https://loj.ac/problem/2737
相连的关系形成若干环 / 内向基环树 。如果不是只有一个环的话,就得断开一些边使得图变成若干链。边的边权是以它为出边的点的点权。
基环树的树的部分可以 DP 或者贪心,贪心就是只在分叉处断边。
对于每个环,先做出 f[ i ][ 0/1 ] 表示环上这个点 不向下 / 向下 延伸链的代价,然后在环上 DP 。
方法就是先指定 tot -> 1 的边不选, DP 一番,再制定 tot -> 1 的边选, DP 一番。
如果指定 tot -> 1 的边选,要注意不能连出一个环。所以不仅有 g[ i ][ 0/1 ] 表示 “可以向右延伸” / “无要求” , 还要有一个 [ 0/1 ] 表示 “之前有没有断过” 。不过不用有 g[ i ][ 1 ][ 1 ] ,因为 “无要求” 就是表示 i -> i+1 得断开,这样就一定 “断过” 了;所以就记 g[ i ][ 2 ] 表示 “之前断过,现在可以向右延伸” 。 g[ tot ][ 2 ] 就是指定 tot -> 1 的边选的时候加给答案的贡献。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
ll Mn(ll a,ll b){return a<b?a:b;}
ll Mx(ll a,ll b){return a>b?a:b;}
const int N=1e5+; const ll INF=1e14+;
int n,hd[N],xnt,to[N<<],nxt[N<<],w[N<<],tp[N],tw[N],tot;
int cd[N],cnt,col[N],tim,dfn[N],low[N],sta[N],top;
ll ans,f[N][],g[N][]; bool vis[N],ins[N];
void add(int x,int y,int z)
{
to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=z;cd[x]++;
}
void tarjan(int cr)
{
dfn[cr]=low[cr]=++tim; sta[++top]=cr; ins[cr]=;
for(int i=hd[cr],v;i;i=nxt[i])
if(!dfn[v=to[i]])tarjan(v),low[cr]=Mn(low[cr],low[v]);
else if(ins[v])low[cr]=Mn(low[cr],dfn[v]);
if(dfn[cr]==low[cr])
{
cnt++; int siz=;
do{
ins[sta[top]]=; col[sta[top]]=cnt; siz++;
}while(sta[top--]!=cr);
if(siz==)col[cr]=, cnt--;
}
}
void dfs(int cr)
{
ins[cr]=;
for(int i=hd[cr],v;i;i=nxt[i])
if(!col[v=to[i]])
{
dfs(v=to[i]);
ll t0=f[cr][]+f[v][]+w[i];
ll t1=Mn(f[cr][]+f[v][],f[cr][]+f[v][]+w[i]);
f[cr][]=t0; f[cr][]=t1;
}
}
void ini_dfs(int cr,int st)
{
dfs(cr); tp[++tot]=cr;
for(int i=hd[cr],v;i;i=nxt[i])
if(col[v=to[i]])
{tw[tot]=w[i]; if(v!=st)ini_dfs(v,st);}
}
void solve(int cr)
{
tot=; ini_dfs(cr,cr);
g[][]=tw[tot]+f[tp[]][]; g[][]=tw[tot]+f[tp[]][];//f[tp[]]!!
for(int i=;i<=tot;i++)
{
int cr=tp[i];//
g[i][]=Mn(g[i-][],g[i-][]+tw[i-])+f[cr][];
g[i][]=Mn(g[i-][],g[i-][]+tw[i-])+f[cr][];
}
ll ret=g[tot][];
g[][]=f[tp[]][]; g[][]=f[tp[]][]; g[][]=g[][]=INF;
for(int i=;i<=tot;i++)
{
int cr=tp[i];
g[i][]=Mn(g[i-][],g[i-][]+tw[i-])+f[cr][];
g[i][]=Mn(g[i-][],g[i-][]+tw[i-])+f[cr][];
g[i][]=Mn(g[i-][],g[i-][]+tw[i-])+f[cr][];
}
ans+=Mn(ret,g[tot][]);
}
int main()
{
n=rdn();
for(int i=,d,z;i<=n;i++)
{ d=rdn(); z=rdn(); add(d,i,z);}
bool fg=;for(int i=;i<=n;i++)if(cd[i]!=){fg=;break;}
if(!fg)
{
int cr=;while(!vis[cr]){vis[cr]=;cr=to[hd[cr]];}
for(int i=;i<=n;i++)if(!vis[i]){fg=;break;}
if(!fg){puts("");return ;}
}
for(int i=;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=;i<=n;i++)
if(!ins[i]&&col[i])solve(i);
printf("%lld\n",ans); return ;
}
LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP的更多相关文章
- Loj #2731 「JOISC 2016 Day 1」棋盘游戏
Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...
- LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路
题目:https://loj.ac/problem/2736 如果每个询问都是 l = 1 , r = n ,那么每次输出序列的 n 个数与本次操作的数的最大值即可.可以用堆维护. 不同区间的询问,可 ...
- LOJ #2731. 「JOISC 2016 Day 1」棋盘游戏(dp)
题意 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少有一个棋子,也至少有一个空位. 游戏的目标是:在还没有放棋 ...
- [LOJ#2732] 「JOISC 2016 Day 2」雇佣计划
参考博文 (不过个人感觉我讲的稍微更清楚一点) 题目就是让我们求图中满足数值大于等于B的连通块数量 然后我们可以尝试转换为求连通块两端所产生的“谷”的数量,显然一个连通块对谷可以贡献2的答案,最终答案 ...
- LOJ #2831. 「JOISC 2018 Day 1」道路建设 线段树+Link-cut-tree
用 LCT 维护颜色相同连通块,然后在线段树上查一下逆序对个数就可以了. code: #include <cstdio> #include <algorithm> #inclu ...
- 题解 「JOISC 2016 Day 3」电报
题目传送门 题目大意 给出一个\(n\)个点\(n\)条边的图,每个点有且仅有一个出边,改变每条边都会有对应的花费.求最小的花费使得整个图强连通. 思路 很显然,最后的图就是一个环.那我们要求的答案实 ...
- 「JOISC 2016 Day 1」棋盘游戏
「JOISC 2016 Day 1」棋盘游戏 先判无解:第1,3行有连续的空格或四个角有空格. 然后可以发现有解的情况第1,3行可以在任意时间摆放. 对于某一列,若第2行放有棋子,那么显然可以把棋盘分 ...
- loj 2392「JOISC 2017 Day 1」烟花棒
loj 答案显然满足二分性,先二分一个速度\(v\) 然后显然所有没有点火的都会往中间点火的人方向走,并且如果两个人相遇不会马上点火,要等到火快熄灭的时候才点火,所以这两个人之后应该在一起行动.另外有 ...
- 「JOISC 2016 Day 3」回转寿司
https://loj.ac/problem/2736 题解 挺有意思的题. 考虑这种操作不好直接维护,还有时限比较长,所以考虑分块. 考虑一个操作对整个块的影响,无非就是可能把最大的拿走,再把新的元 ...
随机推荐
- SpringSecurity入门例子及遇到的问题解决
最近学习<Spring 实战>学习到了SpringSecurity,觉得书本上的例子过于复杂,而且不喜欢它基于java配置,更喜欢用xml文件进行配置 于是在极客学院网上学习,感觉挺不错的 ...
- mysql三范式
第一范式:有主键,具有原子性,字段不可分割. 第二范式:完全依赖,没有部分依赖. 第三范式:没有传递依赖. 总结:数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时候会拿冗余还速度,最总用的 ...
- 对于src路径问题,深层理解的实践。且对于输出流write()两个方法的源码阅读。
根据昨天的总结,可深层理解图片中src的路径.所以今天实现了一个想法.就是路径写入的是Controller,然后自动去本地找. 其实就是将电脑的本地图片 显示出来.通过输出流的方式. 代码如下: @R ...
- zookeeper和dubbo中出现的问题
报错出现timeout关键字 解决:在服务发布时,添加timeout字段 <!-- 5.服务发布 --> <dubbo:service interface="com.sxt ...
- asp.net 后台执行js
1. 用Response.Write方法 代码如下: Response.Write("<script type='text/javascript'>alert("XXX ...
- JSON的学习,希望可以指导
1.JSON的介绍 是一种轻量级的数据交换格式.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率. 2.格式 JSON ...
- Spring Boot 揭秘与实战(八) 发布与部署 - 开发热部署
文章目录 1. spring-boot-devtools 实现热部署 2. Spring Loaded 实现热部署 3. 模板文件热部署 4. 源代码 Spring Boot 支持页面与类文件的热部署 ...
- Kaggle:Home Credit Default Risk 特征工程构建及可视化(2)
博主在之前的博客 Kaggle:Home Credit Default Risk 数据探索及可视化(1) 中介绍了 Home Credit Default Risk 竞赛中一个优秀 kernel 关于 ...
- 20165228 2017-2018-2 《Java程序设计》第4周学习总结
20165228 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 子类与继承 子类的定义:使用关键词extends class 子类名 extends 父类名 ...
- 数据库开启对sys用户的审计
需求:客户想对数据库开启sys用户的审计功能,关闭其它用户的审计功能. 1)再一次巡检报告中,我们发现数据库版本11.2.0.4,开启审计功能,提供的建议如下,关闭审计alter system set ...