呵呵呵呵,这个sb题做了好久,然并卵,还是不对。

挖坑++

然而我感觉我做的对了,偷瞄了一下题解应该没什么问题。

这个题有n个点,n条边,所以是个基环树(我也不知道是不是这个名)

要每个点有联通,就是一个n个点的环,要是答案最小,那么我们就要保留下一些最大的链

现在我们考虑,因为一个点只有一个入度(n-1条边的话是一个严格从根节点单向向外的树),现在多了一个边,所以多了形成一个环

那先现在这个东西(基环树)就是一个环外面挂着一些严格向外延展的子树。

所以先考虑子树,对于每一个节点,贪心的保留一个权值最大的边连的儿子保留,其他的切掉(这里说的切掉是指重建),(这一步做完之后出来的东西就类似于树链剖分出来的重链)

再来考虑环,与环相连的子树,选择切掉,那么环是不用动的,选择不切,那么在环上对应的下条边是要切掉的。(这里打一个标记,判断切没切,然后,没切的话要找环上最小的边切开)

需要注意的是,可以不止一个基环树233333

 #include<bits/stdc++.h>
#define N 100005
#define LL long long
#define inf 1LL<<60
using namespace std;
inline LL ra()
{
LL x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
struct edge{
int to,next; LL v;
}e[N];
int head[N],cnt,n,start,d[N];
int top,ind,q[N],low[N],dfn[N],size[N],num,belong[N];
LL ans,sum,f[N],del,cst[N];
bool vis[N],cut,inq[N],can[N];
void insert(int x, int y, LL v)
{
e[++cnt].next=head[x]; e[cnt].to=y; e[cnt].v=v; head[x]=cnt;
}
void tarjan(int x)
{
dfn[x]=low[x]=++ind;
q[++top]=x; inq[x]=;
for (int i=head[x];i;i=e[i].next)
if (!dfn[e[i].to])
{
tarjan(e[i].to);
low[x]=min(low[e[i].to],low[x]);
}
else if (inq[e[i].to]) low[x]=min(low[x],dfn[e[i].to]);
if (low[x]==dfn[x])
{
++num;
int now=-;
while (now!=x)
{
now=q[top--];
belong[now]=num;
size[num]++;
inq[now]=;
}
}
}
void get_cost(int x)
{
can[x]=;
for (int i=head[x];i;i=e[i].next)
{
if (vis[e[i].to]) cst[x]=e[i].v;
if (e[i].to==start || !vis[e[i].to]) continue;
get_cost(e[i].to);
}
}
void solve_son(int x)
{
LL son_sum=,son_mx=;
for (int i=head[x];i;i=e[i].next)
{
son_sum+=e[i].v,son_mx=max(son_mx,e[i].v);
f[x]+=f[e[i].to];
solve_son(e[i].to);
}
f[x]+=son_sum-son_mx;
}
void dfs(int x)
{
LL son_del=-inf; can[x]=;
for (int i=head[x];i;i=e[i].next)
{
son_del=max(son_del,-cst[x]);
if (e[i].to==start) continue;
if (vis[e[i].to]) dfs(e[i].to);
else
{
solve_son(e[i].to);
ans+=f[e[i].to]+e[i].v;
son_del=max(son_del,e[i].v-cst[x]);
}
}
if (son_del>) cut=,ans-=son_del; else del=max(del,son_del);
}
int main()
{
n=ra();
for (int i=; i<=n; i++)
{
int x=ra();
LL v=(LL)ra();
if (x==i) ans+=v; else insert(x,i,v);
}
for (int i=; i<=n; i++)
if (!dfn[i]) tarjan(i);
int hehe=;
bool flag=;
for (int i=; i<=n; i++)
if (size[belong[i]]>)
{
if (hehe && hehe!=belong[i]) flag=;
hehe=belong[i];
vis[i]=;
}
for (int i=; i<=n; i++)
if (!vis[i]) {flag=; break;}
if (!flag)
{
cout<<""<<endl;
return ;
}
for (int i=; i<=n; i++)
if (vis[i] && !can[i])
{
start=i;
get_cost(i);
}
memset(can,,sizeof(can));
for (int i=; i<=n; i++)
if (vis[i] && !can[i])
{
cut=; del=-inf;
start=i; dfs(i);
if (!cut) ans-=del;
}
// for (int i=1; i<=n; i++) printf("%d ",f[i]);
cout<<ans<<endl;
return ;
}

洛谷 三月月赛 C的更多相关文章

  1. 洛谷 三月月赛 B

    搞出每一位与前一位的差,然后区间修改只是会影响区间的端点,所以只修改一下端点的值就好. %%%高一神犇线段树 #include<bits/stdc++.h> #define N 10000 ...

  2. 洛谷 三月月赛 A

    模拟模拟 #include<bits/stdc++.h> using namespace std; inline int ra() { ,f=; char ch=getchar(); ; ...

  3. 洛谷五月月赛【LGR-047】划水记

    虽然月赛有些爆炸,但我永远资瓷洛谷! 因为去接水,所以迟到了十几分钟,然后洛谷首页就打不开了-- 通过洛谷题库间接打开了比赛,看了看\(TA\),WTF?博弈论?再仔细读了读题,嗯,判断奇偶性,不过要 ...

  4. 洛谷八月月赛Round1凄惨记

    个人背景: 上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了 也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学 ...

  5. 洛谷⑨月月赛Round2 P3393逃离僵尸岛[最短路]

    题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...

  6. 洛谷⑨月月赛Round2 P3392涂国旗[DP]

    题目描述 某国法律规定,只要一个由N*M个小方块组成的旗帜符合如下规则,就是合法的国旗.(毛熊:阿嚏——) 从最上方若干行(>=1)的格子全部是白色的. 接下来若干行(>=1)的格子全部是 ...

  7. 5239-回忆京都-洛谷3月赛gg祭

    传送门 题目背景 第十五届东方人气投票 音乐部门 106名 第四次国内不知道东方的人对东方原曲的投票调查 51名 回忆京都副歌我tm吹爆,东方文花帖我tm吹爆! 题目描述 射命丸文在取材中发现了一个好 ...

  8. 5238-整数校验器-洛谷3月赛gg祭

    传送门 题目描述 有些时候需要解决这样一类问题:判断一个数 x是否合法. x合法当且仅当其满足如下条件: x格式合法,一个格式合法的整数要么是 0,要么由一个可加可不加的负号,一个 1到 9 之间的数 ...

  9. 洛谷九月月赛II

    题解:模拟 一旦不匹配就要break #include<iostream> #include<cstdio> #include<cstring> #include& ...

随机推荐

  1. Windows 控制台命令笔记

    1. cmd中输出中文乱码问题: CHCP是一个计算机指令,能够显示或设置活动代码页编号. C:\windows\system32>CHCP 活动代码页: 936 原因是我们使用了GBK编码,下 ...

  2. 新增6 n个骰子的点数

    /* * * 面试题43:n个骰子的点数 * 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s. * 输入n,打印出s的所有可能的值出现的概率. * */ #include <iostream ...

  3. 轉:StackOverflow2016最新架构探秘

    轉載:http://www.infoq.com/cn/news/2016/03/Stack-Overflow-architecture-insi?utm_source=tuicool&utm_ ...

  4. 记录—JPA生成数据库表

    环境 springBoot+JPA+MySQL application-dev.yml 注意:配置中的blog数据库需要先创建,否则启动springBoot会报错 spring: #数据库连接配置 d ...

  5. 如何使用ffmpeg的c语言sdk实现对文件夹的操作

    重要函数 打开文件夹:avio_open_dir() 读取文件夹:avio_read_dir() 关闭文件夹:avio_close_dir() 结构体, 操作目录的上下文:AVIODirContext ...

  6. mysql遇到java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed

    在连接数据库的url中,加上allowPublicKeyRetrieval=true from:https://blog.csdn.net/Gushiyuta/article/details/9323 ...

  7. Linux和云供应商Red Hat被IBM以34亿美元的价格收购

    导读 今天的主题包括IBM以340亿美元收购Red Hat,人性化是使人工智能成功的关键.两家公司于10月28日宣布,IBM正以340亿美元的价格收购Linux和云技术供应商Red Hat,以期改变云 ...

  8. springboot,dubbo,nacos,spring-cloud-alibaba的整合

    最近,自去年阿里开源了dubbo2.7及一系列产品后,阿里也打造了融入spring-cloud 的生态体系,本人关注,今年阿里开源的的spring-cloud-alibaba基本孵化完成,笔者更是对这 ...

  9. Day8 - C - Largest Rectangle in a Histogram HDU - 1506

    A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rec ...

  10. 实验吧-杂项-64格(64进制--base64索引)

    下载gif,Winhex打开发现文件头缺失,加上文件头GIF89得到正常图片,用帧分解工具把每一帧分解. 图片主要是一个8×8的方格,好像没什么线索,把每一帧图片上小黄人的占格的位置数出: 17 54 ...