Codeforces Round #599 (Div. 2) E. Sum Balance 图转换 + 子集dp + 环

传送门

文章目录

  • 题意:
  • 思路:

题意:

在这里插入图片描述

思路:

首先我们知道如果所有数的和summodk!=0sum\bmod k!=0summodk!=0那么此时无解,否则我们设need=sum/kneed=sum/kneed=sum/k
看到kkk这么小,自然的想到是否能状压,但是状压了有什么用也不知道,所以需要继续分析题目。
我们可以将每个盒子都看成一个点,那么拿出来一个再放进去一个完全可以看成一个点入度为111,出度为111,转换成图论,这不就是若干个环嘛!换句话说,我们的一个合法方案就是若干个环,我们先考虑如何建图。
建图比较明显了,如果将第iii个盒子的第jjj个数拿出去之后,存在一个盒子xxx中的第yyy个数放进去之后能使iii这个盒子的数和为needneedneed,那么i−>xi->xi>x连边。
按照上述建图之后,可以看到有很多的环,而且有些环是有交集的,我们可以将环状压成一个二进制,让后遍历[1,(1<<k)−1][1,(1<<k)-1][1,(1<<k)1]的每个子集,设当前遍历到的为iii,看看能否拆成两个存在的子集jjjixorji\ \ xor \ \ ji  xor  j,能的话就可以标记一下当前的子集,让后再记一下分成的某一个子集即可。
最后输出方案的时候递归找到环即可。

// Problem: E. Sum Balance
// Contest: Codeforces - Codeforces Round #599 (Div. 2)
// URL: https://codeforces.com/contest/1243/problem/E
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=6010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
LL sum[N];
int id[20][N],sub[1<<18],st[1<<18];
PII to[20][N];
vector<int>v[N];
map<LL,PII>s;
LL need;
int too[N],val[N];int get(int x) {for(int i=0;i<n;i++) if(x>>i&1) return i;return -1;
}void dfs(int u) {if(sub[u]==-1) {int pos=get(u); int cnt=__builtin_popcount(u);if(pos==-1) return;for(int j=0;j<v[pos].size();j++) {if(id[pos][j]==u) {int x=pos,y=j;while(cnt--) {int dx=x,dy=y;tie(x,y)=to[x][y];too[x]=dx; val[x]=v[x][y];}break;}}} else {dfs(sub[u]);dfs(u^sub[u]);}
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);cin>>n;memset(sub,-1,sizeof(sub));for(int i=0;i<n;i++) {int k; scanf("%d",&k);for(int j=0;j<k;j++) {int x; scanf("%d",&x);v[i].pb(x); sum[i]+=x;s[x]={i,j}; need+=x;}}if(need%n!=0) {puts("No");return 0;}need/=n;for(int i=0;i<n;i++) {for(int j=0;j<v[i].size();j++) {to[i][j]=s.count(need-sum[i]+v[i][j])? s[need-sum[i]+v[i][j]]:mk(-1,-1);//if(s.count(need-sum[i]+v[i][j])) cout<<i<<' '<<s[need-sum[i]+v[i][j]].X<<endl;}}for(int i=0;i<n;i++) {for(int j=0;j<v[i].size();j++) {int x=i,y=j,state=1<<i;bool flag=false;while(true) {if(to[x][y].X==-1) break;tie(x,y)=to[x][y];if(x==i&&y==j) {flag=true;break;}if(state>>x&1) break;state|=1<<x;}if(flag) {id[i][j]=state;st[state]=1;}}}for(int i=1;i<1<<n;i++) {if(!st[i]) {for(int j=(i-1)&i;j>0;j=(j-1)&i) {if(st[j]&&st[i^j]) {st[i]=1;sub[i]=j;break;}}}}if(!st[(1<<n)-1]) {puts("No");return 0;}	puts("Yes");dfs((1<<n)-1);for(int i=0;i<n;i++) printf("%d %d\n",val[i],too[i]+1);return 0;
}
/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

资深开发者们是如何读书的?---线下读书会记录

读了多少书&#xff1f;怎么读书&#xff1f;——请问大家最近读书了吗&#xff1f;一年大概读了多少本书。有超过20本&#xff0c;超过30本&#xff0c;超过50本吗&#xff1f;在7月14日由长沙互联网活动基地和长沙.NET技术社区组织的小型社区活动&#xff0c;《开发者爱读书•…

【APIO2018】Duathlon 铁人两项 【圆方树】

题意&#xff1a;给一张 nnn 点 mmm 边的简单无向图&#xff0c;求有多少个三元组 (s,c,f)(s,c,f)(s,c,f) &#xff0c;满足存在一条从 sss 到 fff 经过 ccc 的简单路径。 n≤105,m≤2105n\leq 10^5,m\leq 2\times 10^5n≤105,m≤2105 首先这个 “经过 ccc 的简单路径” &…

Codeforces Round #598 (Div. 3) E. Yet Another Division Into Teams dp + 输出方案

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的序列aaa&#xff0c;你需要将其分成若干组&#xff0c;每组的价值为max⁡(ai)−min(ai)\max(a_i)-min(a_i)max(ai​)−min(ai​)&#xff0c;求如何分组才能使得代价最小&#xff0c;输出…

架构杂谈《三》

一致性问题前面的《架构杂谈一》和《架构杂谈二》 杂谈了从服务化到微服务架构的演进&#xff0c;并肯定了服务化和微服务架构是一脉相承的。微服务在服务化架构的基础上&#xff0c;对服务化的细节和方案进行了优化和细化&#xff0c;重点突出了无中心化管理的微服务架构&…

【SDOI2018】战略游戏【圆方树】【虚树】

题意&#xff1a;给一张 nnn 点 mmm 边的连通无向图&#xff0c;qqq 次询问&#xff0c;每次给出一个点集 SSS &#xff0c;求有多少个不在 SSS 中的点满足删除后 SSS 中存在两个点不连通。 n≤105,m≤2105,∑∣S∣≤2105n\leq 10^5,m\leq 2\times 10^5,\sum |S|\leq 2\times 1…

Codeforces Round #598 (Div. 3) F. Equalizing Two Strings 思维 + 逆序对

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个长度为nnn的串a,ba,ba,b&#xff0c;每次可以同时翻转a,ba,ba,b中任意一段长度为L(1≤L≤n)L(1\le L\le n)L(1≤L≤n)的子串&#xff0c;问能否通过若干次操作使两个串相同。 思路&#xff1a; 首…

腾讯发布 Tencent SCF Toolkit VS Code 插件,轻松开发无服务器云函数

在之前的文章中&#xff0c;我们提到了亚马逊、谷歌、IBM 等大厂都上了 Visual Studio Code 的船。阿里巴巴也在近日发布了 Aliyun Serverless VS Code 插件。近期&#xff0c;腾讯也上了 VS Code 的船&#xff0c;发布了基于 VS Code 的 Tencent SCF Toolkit 插件&#xff0c;…

Codeforces Round #726 (Div. 2) D. Deleting Divisors 博弈

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数nnn&#xff0c;有两个人博弈&#xff0c;每次可以将nnn减去一个nnn的因子&#xff0c;这个因子不能为111或nnn。当不能操作的人输掉游戏。问你先手赢还是后手赢。 思路&#xff1a; 这个题多写…

【POI2007】OSI-Axes of Symmetry【计算几何】【manacher】

题意&#xff1a;给一个 nnn 个点的多边形&#xff0c;求对称轴个数。 n≤105n\leq 10^5n≤105 显然对称轴一定在顶点或边的中点上。 但你 n2n^2n2 枚举完全没有一点能过的样子。 冷静分析&#xff0c;发现有 “中点”&#xff0c;“对称轴”&#xff0c;很自然个鬼地想到了…

端到端测试实践:Jenkins集成TestCafe

上一篇《对产品质量的一点思考》中说到自动化测试的重要性&#xff0c;本文简单介绍下怎样在实际项目中实现端到端测试的自动化&#xff0c;在这里我们使用的端到端测试工具是TestCafe。环境Jenkisn&#xff1a;2.183TestCafe&#xff1a;1.3.0为什么采用TestCafe做自动化测试要…

Codeforces Round #727 (Div. 2) F. Strange Array 线段树 + 区间合并 + 排序优化

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的数组&#xff0c;对每个位置iii求一个最大价值&#xff0c;价值计算方式如下&#xff1a;选择一个包含iii的[l,r][l,r][l,r]&#xff0c;让后将其拿出来排序&#xff0c;之后价值就是当前…

【CF487E】Tourists【圆方树】【树链剖分】【multiset】

题意&#xff1a;给一张 nnn 点 mmm 边的连通无向图&#xff0c;点帯权&#xff0c;qqq 次操作&#xff1a; 修改一个点的权值。询问两点间所有简单路的最小权值的最小值。 n,m,q≤105n,m,q\leq 10^5n,m,q≤105 显然建出圆方树然后询问路径最小值。多半要树链剖分了。 对于方…

再见Jenkins,从Gitlab代码提交到k8s服务持续交付只需七毛三

Gitlab runner 快速搭建CICD pipeline背景日常开发中&#xff0c;相信大家已经做了很多的自动化运维环境&#xff0c;用的最多的想必就是利用Jenkins实现代码提交到自动化测试再到自动化打包&#xff0c;部署全流水线Jenkins在devops担任了很重要的角色&#xff0c;但是另一方面…

Codeforces Round #726 (Div. 2) F. Figure Fixing 二分图 + 思维

传送门 文章目录题意&#xff1a;思路题意&#xff1a; 给你一张nnn个点mmm条边的图&#xff0c;每个点都有一个当前值aia_iai​&#xff0c;目标值bib_ibi​&#xff0c;每次可以选择一条边(i,j)(i,j)(i,j)&#xff0c;将ai,aja_i,a_jai​,aj​都加上任意一个数&#xff0c;问…

【NOI2020】命运【树形dp】【线段树合并】

题意&#xff1a;给一棵 nnn 个点的树&#xff0c;每条边需要染成黑白两种颜色中的一种。给出 mmm 个条件&#xff0c;每个条件给出 u,vu,vu,v&#xff0c;其中 uuu 是 vvv 的祖先&#xff0c;要求 uuu 到 vvv 的链上至少一条黑边。求方案数 模 998244353998244353998244353。 …

.NET Core 3.0之深入源码理解Kestrel的集成与应用(二)

前言前一篇文章主要介绍了.NET Core继承Kestrel的目的、运行方式以及相关的使用&#xff0c;接下来将进一步从源码角度探讨.NET Core 3.0中关于Kestrel的其他内容&#xff0c;该部分内容&#xff0c;我们无需掌握&#xff0c;依然可以用好Kestrel&#xff0c;本文只是将一些内部…

Codeforces Round #726 (Div. 2) E2. Erase and Extend (Hard Version) 贪心

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的串sss&#xff0c;你有两个操作可以使用&#xff1a; (1)(1)(1)从sss的结尾删除一个字母。 (2)sss(2)sss(2)sss。 让你通过若干次操作使其变成一个长度为kkk的串&#xff0c;且其字典序最…

【BZOJ3451】Normal【期望线性性】【点分治】【NTT卷积】

题意&#xff1a;随机分治中心点分治的期望操作次数 n≤3104n\leq 3\times 10^4n≤3104 即求点分树的 siz 之和的期望 即祖孙关系对数期望 考虑一有序点对 (u,v)(u,v)(u,v)&#xff0c;uuu 在点分树上是 vvv 祖先当且仅当 uuu 是 u∼vu\sim vu∼v 路径上第一个被选为分治中心…

译 | 使用Roslyn分析器高效编写更好的代码

原文&#xff1a;Mika Dumont翻译&#xff1a;汪宇杰Roslyn 是 .NET 编译器平台&#xff0c;即使在运行代码之前&#xff0c;它也能帮助您捕获 Bug。例如内置于 Visual Studio 中的Roslyn 拼写检查分析器。假设您正在创建一个静态方法&#xff0c;并将 static 单词拼错为 statc…

Codeforces Round #724 (Div. 2) F. Omkar and Akmar 组合数学 + 博弈

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先我们先来研究一下这个游戏&#xff0c;手画几个会惊奇的发现&#xff0c;后手这个b怎么怎么画都赢啊&#xff1f;&#xff1f;&#xff1f;对&#xff0c;没错&#xff0c;就是怎么画都…