当前位置: 首页 > news >正文

AT_arc107_f Sum of Abs 题解

题目链接:[https://atcoder.jp/contests/arc107/tasks/arc107_f]([ARC107F] Sum of Abs)

初始状态设为全部点都不选,考虑每个点有三种状态:删掉,在一个正的联通块中,在一个负的联通块中,对应的权值分别为:$ 0, A_i+B_i, A_i-B_i $,然后我们可以拆点,每个点拆成正点和负点,权值分别为 $ A_i+B_i $ 和 $ A_i-B_i $,每个点的正点和负点相连,原图中之间有边的两个点的正负相反的点相连(点 A 的正点连点 B 的负点,点 B 的正点连点 A 的负点),然后跑一个最大权独立集即可。

  • 为什么是对的

因为正点和负点对应的就是在一个正的联通块中和在一个负的联通块中这两种状态,同一个点的正点和负点连边使得不能同时取两个状态,原图中之间有边的两个点的正负相反的点相连保证相邻点如果两个都没被删那么取的符号一定相等。

代码:

#include<bits/stdc++.h>
#define int long long
#define debug() cout<<"come here\n"
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pb push_back
using namespace std;
int qpow(int a,int b,int p){int ret=1;while(b){if(b&1)ret=(ret*a)%p;a=(a*a)%p;b>>=1;}return ret;}
inline int read(){int ret=0,f=1;char ch=getchar();while(ch<'0'||ch>'9')f=(ch=='-'?-1:f),ch=getchar();while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+(ch^48),ch=getchar();return ret*f;}
inline void write(int x){if(x<0){putchar('-');write(-x);return ;}if(x>9)write(x/10);putchar((char)(x%10+48));}
inline void writech(int x,char ch){write(x);putchar(ch);}
int n,m,S,T;
int to[1000001],val[1000001],nxt[1000001],head[10001],tot=-1,now[10001];
int dep[10001],sum;
void add(int u,int v,int w)
{if(w<=0){sum-=w;return ;}to[++tot]=v;val[tot]=w;nxt[tot]=head[u];head[u]=tot;to[++tot]=u;val[tot]=0;nxt[tot]=head[v];head[v]=tot;
}
bool bfs()
{memset(dep,0,sizeof(dep));dep[S]=1;queue<int> q;q.push(S);now[S]=head[S];while(q.size()){int u=q.front();q.pop();for(int i=head[u];~i;i=nxt[i]){int v=to[i];if(val[i]&&!dep[v]){dep[v]=dep[u]+1;now[v]=head[v];q.push(v);}}}return dep[T];
}
int dfs(int u,int flow)
{if(u==T)return flow;int nwfw=0;for(int i=now[u];~i&&flow;i=nxt[i]){now[u]=i;int v=to[i];if(val[i]&&dep[v]==dep[u]+1){int tmp=dfs(v,min(val[i],flow));val[i]-=tmp;val[i^1]+=tmp;flow-=tmp;nwfw+=tmp;}}if(nwfw==0)dep[u]=0;return nwfw;
}
int dinic()
{int ret=0;while(bfs())ret+=dfs(S,1000000000);return ret;
}
signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);memset(head,-1,sizeof(head));n=read(),m=read();sum=0;vector<int> a(n+1,0),b(n+1,0);for(int i=1;i<=n;i++){a[i]=read();sum+=a[i];}S=0;T=n+n+1;for(int i=1;i<=n;i++){b[i]=read();add(S,i,a[i]+b[i]);add(i,i+n,INF);add(i+n,T,a[i]-b[i]);}for(int i=1;i<=m;i++){int u=read(),v=read();add(u,v+n,INF);add(v,u+n,INF);}writech(sum-dinic(),'\n');return 0;
}
http://www.jsqmd.com/news/1176456/

相关文章:

  • 3步解锁企业级智能问答:LangChain-Chatchat本地知识库实战指南
  • 从零构建技术栈:30+实战项目带你深入理解核心技术原理
  • KIMI排名优化公司哪家强?2026年五家主流GEO服务商横评 - GEO优化
  • 2026年吉林高职单招备考选购指南:佳森教育核心优势全维度拆解 - 爱说大实话121
  • 卡地亚官方售后服务中心地址及客服服务电话实地考察报告多信源验证(2026年7月最新) - 卡地亚服务中心
  • 2026年楼盘宣传片制作行业观察
  • 数据库索引底层:B+ 树不是面试背完就够,还要知道为什么
  • 2026国内知名SEO优化服务商排名:技术团队服务能力客户留存多维对比TOP榜 - GEO优化
  • awesome-trilium终极指南:2024年最值得收藏的Trilium Notes插件合集
  • OpenCode完整指南:如何利用开源AI编程助手提升10倍开发效率
  • 亲身到店探访深圳雷达官方售后服务中心|全新服务热线及门店地址(2026年7月最新) - 亨得利钟表维修中心
  • Python Fire:一键生成命令行界面的高效状态更新神器
  • ChatGPT联网搜索功能上线倒计时:3天内不配置这4项安全策略,将触发OpenAI自动熔断(含CSP白名单模板)
  • 3个痛点+4个模块:JimuReport扩展开发实战指南
  • GeocoderLaravel部署指南:生产环境配置与安全最佳实践
  • 告别窗口混乱:FancyZones如何让Windows桌面成为你的效率加速器
  • 2026年7月最新海口泰格豪雅官方售后维修服务网点地址与客服电话 - 亨得利官方服务中心
  • 2026年微信公众号迁移公证书办理攻略 - 跑政通
  • 3分钟掌握Snipit:终极SNP可视化工具快速入门指南
  • 企业级知识库专栏如何高效阅读:从认知到落地的八卷路线图
  • STM32 复用功能(AF)配置的常见误区
  • SpringBoot 整合 Logback——日志框架从配置到实战
  • 2026年公众号迁移线上公证处挑选指南 - 跑政通
  • 需求评审被否:Demo 跑通只是入门,权限日志才是 Java 后端转 AI 的生死线
  • 深圳 IC 电子料回收|深圳市鑫鼎程科技|正规再生资源回收 - 品牌优选官
  • 5个高级技巧:如何深度定制Android Root检测库RootBeer
  • 杭州积家回收价格查询和各大回收平台实测排行(2026年7月最新) - 嘉价奢侈品回收平台
  • 如何系统学习AI视觉:从基础概念到实战应用指南
  • OpenToonz动画制作终极指南:从零开始掌握专业级2D动画创作
  • AI排名优化公司哪家好?2026年五家实力派服务商深度横评 - GEO优化