「ABC 218」解集
E
倒流一下,然后把负权边置零后跑 MST 即可。
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N=2e5+5,M=2e5+5;
struct edge
{
int u,v;
long long w;
edge(int U=0,int V=0,int W=0)
{
u=U;
v=V;
w=W;
}
}tur[M];
int n,m,fa[N];
bool cmp(edge one,edge ano)
{
return one.w<ano.w;
}
int find(int u)
{
if(u^fa[u]) fa[u]=find(fa[u]);
return fa[u];
}
long long spannin()
{
long long res=0;
for(int i=1;i<=m;++i)
{
int u=tur[i].u,v=tur[i].v;
long long w=tur[i].w;
int x=find(u),y=find(v);
if(x^y)
{
fa[x]=y;
res+=w;
}
}
return res;
}
int main()
{
scanf("%d%d",&n,&m);
long long sum=0;
for(int i=1;i<=n;++i) fa[i]=i;
for(int i=1,u,v;i<=m;++i)
{
scanf("%d%d%lld",&u,&v,&tur[i].w);
tur[i].w=max(tur[i].w,0LL);
tur[i]=edge(u,v,tur[i].w);
sum+=tur[i].w;
}
sort(tur+1,tur+1+m,cmp);
printf("%lld\n",sum-spannin());
return 0;
}
F
跑出原图的最短路树,非树边删除不需要考虑,树边就重新跑一次最短路(规模 \(\Theta(n)\))。
类似的题(原题)有 JOI 2020 Final Olympic Bus。
#include<bits/stdc++.h>
int n,m,hd[500],ecnt,ont[319300],pre[500],ide[500];
struct edge {
int nxt,to;
}e[319300];
void add_edge( int x,int y ) { e[++ecnt]={hd[x],y},hd[x]=ecnt; }
int dis[500],vis[500];
std::priority_queue<std::pair<int,int>,std::vector<std::pair<int,int>>,std::greater<std::pair<int,int>>> pq;
int find( int X ) {
std::memset( dis+1,0x3f,n<<2 );
std::memset( vis+1,0,n<<2 );
for( dis[1]=0,pq.emplace( 0,1 ); pq.size(); ) {
int x=pq.top().second; pq.pop();
if( vis[x] ) continue; vis[x]=1;
for( int i=hd[x]; i; i=e[i].nxt ) {
if( i==X ) continue;
int y=e[i].to;
if( dis[y]>dis[x]+1 ) {
dis[y]=dis[x]+1;
pre[y]=x;
ide[y]=i;
if( !vis[y] ) pq.emplace( dis[y],y );
}
}
}
return dis[n]==0x3f3f3f3f?-1:dis[n];
}
signed main() {
scanf( "%d%d",&n,&m );
for( int i=1,x,y; i<=m; ++i ) scanf( "%d%d",&x,&y ),add_edge( x,y );
int ret=find( -1 );
if( ret==-1 ) {
for( int i=1; i<=m; ++i ) puts( "-1" );
return 0;
}
for( int now=n; now!=1; ) ont[ide[now]]=1,now=pre[now];
for( int i=1; i<=m; ++i ) {
if( ont[i] ) printf( "%d\n",find( i ) );
else printf( "%d\n",ret );
}
return 0;
}
G
其实五分钟能冲出来的……去了板子码长 800B。
跑出每个结点到根的中位数,这个随便拿个数据结构维护下就行了,然后做个树 DP,就考虑深度奇偶性,和 P7443 的那个 SG 函数一个套路。注意是自底向上跑的。
#include<bits/stdc++.h>
struct btree {
int ch[100100][2],fa[100100],val[100100],cnt[100100],sz[100100],tot,root;
btree() { ins( std::numeric_limits<int>::max() ),ins( std::numeric_limits<int>::min() ); }
bool wis( int p ) { return ch[fa[p]][1]==p; }
void pull( int p ) { sz[p]=sz[ch[p][0]]+sz[ch[p][1]]+cnt[p]; }
int dot( int v ) { return val[++tot]=v,sz[tot]=cnt[tot]=1,tot; }
void link( int f,int p,int k ) { ch[f][k]=p,fa[p]=f; }
void rot( int p ) {
int f=fa[p],gf=fa[fa[p]],k=wis( p );
link( gf,p,wis( f ) ),link( f,ch[p][k^1],k ),link( p,f,k^1 );
pull( f ),pull( p );
}
void splay( int p,int t ) {
for( ; fa[p]!=t; rot( p ) )
if( fa[fa[p]]!=t ) rot( wis( p )!=wis( fa[p] )?p:fa[p] );
if( t==0 ) root=p;
}
int find( int v ) {
int p=root;
if( !p ) return 0;
while( ch[p][v>val[p]] && v!=val[p] ) p=ch[p][v>val[p]];
return splay( p,0 ),p;
}
void ins( int v ) {
int p=root,f=0;
while( p && v!=val[p] ) f=p,p=ch[p][v>val[p]];
if( p ) cnt[p]++;
else fa[p=dot(v)]=f,( f && ( ch[f][v>val[f]]=p ) );
splay( p,0 );
}
int boundary( int v,int f ) { // f: 0 - pre, 1 - suf
int p=find( v );
if( ( val[p]>v && f ) || ( val[p]<v && !f ) ) return p;
p=ch[p][f];
while( ch[p][f^1] ) p=ch[p][f^1];
return p;
}
void del( int v ) {
int pre=boundary( v,0 ),suf=boundary( v,1 );
splay( pre,0 ),splay( suf,pre );
if( cnt[ch[suf][0]]>1 ) cnt[ch[suf][0]]--,pull( suf ),splay( ch[suf][0],0 );
else ch[suf][0]=0,pull( suf ),splay( suf,0 );
}
int id( int i ) {
int p=root; i++;
if( sz[p]<i ) return -1;
while( 233 ) {
if( sz[ch[p][0]]+cnt[p]<i ) i-=sz[ch[p][0]]+cnt[p],p=ch[p][1];
else if( sz[ch[p][0]]<i ) return val[p];
else p=ch[p][0];
}
return -1;
}
}tr;
int n,a[100100],med[100100],dp[100100];
std::vector<int> g[100100];
void dfs( int x,int f,int d ) {
tr.ins( a[x] );
if( d&1 ) med[x]=tr.id( ( d+1 )/2 );
else med[x]=( tr.id( d/2 )+tr.id( d/2+1 ) )/2;
for( int y:g[x] ) if( y!=f ) dfs( y,x,d+1 );
tr.del( a[x] );
}
void DP( int x,int f,int d ) {
int leaf=1,mx=0,mn=1e9;
for( int y:g[x] ) if( y!=f && ( leaf=0 )^1 )
DP( y,x,d+1 ),mx=std::max( mx,dp[y] ),mn=std::min( mn,dp[y] );
if( leaf ) dp[x]=med[x];
else dp[x]=( d&1 )?mx:mn;
}
signed main() {
scanf( "%d",&n ); for( int i=1; i<=n; ++i ) scanf( "%d",&a[i] );
for( int i=1,x,y; i<n; ++i ) scanf( "%d%d",&x,&y ),g[x].emplace_back( y ),g[y].emplace_back( x );
dfs( 1,0,1 ),DP( 1,0,1 ),printf( "%d\n",dp[1] );
return 0;
}
H 不会 wqs / 反悔贪心,改天学下再说吧……
是不是有点水了呀……
「ABC 218」解集的更多相关文章
- Solution Set -「ABC 217」
大家好屑兔子又来啦! [A - Lexicographic Order] 说个笑话,\(\color{black}{\text{W}}\color{red}{\text{alkingDead} ...
- Solution -「ABC 219H」Candles
\(\mathcal{Description}\) Link. 有 \(n\) 支蜡烛,第 \(i\) 支的坐标为 \(x_i\),初始长度为 \(a_i\),每单位时间燃烧变短 \(1\) ...
- Solution -「ABC 215H」Cabbage Master
\(\mathcal{Description}\) Link. 有 \(n\) 种颜色的,第 \(i\) 种有 \(a_i\) 个,任意两球互不相同.还有 \(m\) 个盒子,每个盒子可以被放 ...
- Solution -「ABC 213G」Connectivity 2
\(\mathcal{Description}\) Link. 给定简单无向图 \(G=(V,E)\),点的编号从 \(1\) 到 \(|V|=n\).对于 \(k=2..n\),求 \(H= ...
- Solution -「ABC 213H」Stroll
\(\mathcal{Description}\) Link. 给定一个含 \(n\) 个结点 \(m\) 条边的简单无向图,每条边的边权是一个常数项为 \(0\) 的 \(T\) 次多项式, ...
- 「ABC 249Ex」Dye Color
考虑停时定理. 初始势能为 \(\sum \Phi(cnt_i)\),末势能为 \(\Phi(n)\),我们希望构造这样一个 \(\Phi:Z\to Z\) 函数,使得每一次操作期望势能变化量为常数. ...
- Solution -「ABC 217」题解
D - Cutting Woods 记录每一个切割点,每次求前驱后驱就好了,注意简单判断一下开闭区间. 考场上采用的 FHQ_Treap 无脑莽. #include <cstdio> #i ...
- Linux 小知识翻译 - 「DNS服务器」
这次聊聊「DNS服务器」. DNS(Domain Name System)服务器,也被称为域名服务器. 因为使用互联网的时候,必须要指定DNS服务器,所以你一定听过DNS这个名字吧. 那么,这个DNS ...
- 「BZOJ 4502」串
「BZOJ 4502」串 题目描述 兔子们在玩字符串的游戏.首先,它们拿出了一个字符串集合 \(S\),然后它们定义一个字符串为"好"的,当且仅当它可以被分成非空的两段,其中每一段 ...
- 「C语言」常量和变量的表示、应用和变量命名规则
在程序运行中,其值不能改变的量成为常量. 在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 目录: 一.常量 二.C语言标识符 三.变 ...
随机推荐
- deepin系统更新谷歌浏览器chrome的方法
deepin系统更新谷歌浏览器chrome的方法 1 为什么要更新谷歌浏览器谷歌浏览器更新频繁,隔一段时间不更新,打开浏览器时会自动弹出一个提示更新的窗口,有点烦,如果使用python自动处理程序时, ...
- Conda 为什么越来越慢?
作者:生信宝典 | 生信宝典公众号原文:https://mp.weixin.qq.com/s/OkOgN4j44MHNt1_noPVpzA Conda 为什么越来越慢? Conda 中包含的软件越来越 ...
- Galaxy Release 20.05 发布,新增多项可视化体验
Galaxy Project(https://galaxyproject.org/)是在云计算背景下诞生的一个生物信息学可视化分析开源项目. 该项目由美国国家科学基金会(NSF).美国国家人类基因组研 ...
- 搭建私人GPT及域名配置
前几天在掘金看到一个搭建私人ChatGPT的教程,看起来并不难. 我也有OpenAI的API Key,然后前阵子我看到我的账号余额还有很多,我的api key其实就一个机器人在用,没用多少. 还有,就 ...
- 03-面试必会-Mysql篇
1. Mysql 查询语句的书写顺序 Select [distinct ] <字段名称> from 表 1 [ <join 类型> join 表 2 on <join 条 ...
- ARHUD驾车导航技术概览
ARHUD (Augmented Reality Head Up Display),即增强现实与抬头显示的结合,是一种将渲染元素投影在真实世界的技术,也是目前用户理解成本最低的展示方式. HUD功 ...
- 谁在以太坊区块链上循环交易?TuGraph+Kafka的0元流图解决方案
都在说数据已经成为新时代的生产资料. 但随着大数据和人工智能等技术的发展,即便人们都知道数据的价值日益凸显,却无法凭借一己之力获取和分析如此大规模的数据. 要想富,先修路.要想利用新时代的数据致富,也 ...
- 【从0开始编写webserver·基础篇#03】TinyWeb源码阅读,还是得看看靠谱的项目
[前言] 之前通过看书.看视频和博客拼凑了一个webserver,然后有一段时间没有继续整这个项目 现在在去看之前的代码,真的是相当之简陋,而且代码设计得很混乱,我认为没有必要继续在屎堆上修改了,于是 ...
- linux150常用命令
Linux最常用150个命令汇总 线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的帮助,比如cd命令. 文件和目录操作 ...
- SQL Server中获取不同格式的日期
select * from 表名 where Convert(varchar(100),日期字段,23)='2008-12-15' Convert函数的应用: Select CONVERT(varch ...