LGP9545 [HBTS-Pre 2023] 环山危路 学习笔记
LGP9545 [HBTS-Pre 2023] 环山危路 学习笔记
题意简述
给定一个
竞赛图的定义:满足任意两点间恰有一条有向边的简单图。
做法解析
直接跑最大流肯定不行,会爆。由于最大流最小割定理,我们求最大流不行就试试考虑最小割,因为这图是张竞赛图,我们可以期待其上的割有一些性质……?
确实有性质:对于两个点集
另外,我们还有
所以我们就有
这样,对于每个
实现上就是先算一遍初始
代码实现
真是精彩的签到!
#include <bits/stdc++.h>
using namespace std;
namespace obasic{
template <typename _T>
void readi(_T &x){
_T k=1;x=0;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')k=-1;
for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-'0';
x*=k;return;
}
template <typename _T>
void writi(_T x){
if(x<0)putchar('-'),x=-x;
if(x>9)writi(x/10);
putchar(x%10+'0');
}
template <typename _T>
void minner(_T &x,_T y){x=min(x,y);}
};
using namespace obasic;
const int MaxN=3e3+5;
int N,M,T,K,X;char S[MaxN];
int deg[MaxN],vis[MaxN];
struct anob{int v,id;}P[MaxN];
bool cmpv(anob a,anob b){return a.v<b.v;}
int main(){
readi(N),readi(M);
for(int i=1;i<=N;i++){
scanf("%s",S+1);
for(int j=1;j<=N;j++)if(S[j]=='1')deg[i]++,deg[j]--;
}
for(int i=1;i<=N;i++)P[i]={deg[i],i};
sort(P+1,P+N+1,cmpv);queue<int> q;
for(int csiz,csum;M--;){
readi(T),readi(K);csiz=K,csum=0;
for(int i=1;i<=K;i++)readi(X),vis[X]=1,q.push(X),csum+=deg[X];
int ans=(csiz*(N-csiz)+csum)/2;
for(int i=1;i<=N;i++){
auto [cv,cid]=P[i];
if(cid==T||vis[cid])continue;
csiz++,csum+=cv;minner(ans,(csiz*(N-csiz)+csum)/2);
}
writi(ans),puts("");
while(!q.empty())vis[q.front()]=0,q.pop();
}
return 0;
}
反思总结
想求
神奇吧,HBTS-Pre。
标签:
贡献分析
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架