传送门

文章目录

  • 题意:
  • 思路:

题意:

思路:

首先我们知道如果所有数的和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,看看能否拆成两个存在的子集jjj和ixorji\ \ 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;
}
/**/

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

  1. Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp

    传送门 文章目录 题意: 思路: 题意: 思路: 之前做过类似的题,翻转一个字串相当于将任意两个不相交的串连在一起.再一看字符集≤20\le20≤20,那就是铁子集dpdpdp了. 定义f[i]f[i ...

  2. Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp

    Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...

  3. Codeforces Round #579 (Div. 3) F2. Complete the Projects (hard version) dp + 贪心

    传送门 文章目录 题意: 思路: 题意: 思路: 排序方式跟easyeasyeasy版本的一样,但是hardhardhard版本是输出最多能选多少,所以我们对b<0b<0b<0的情况 ...

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

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,你需要将其分成若干组,每组的价值为max⁡(ai)−min(ai)\max(a_i)-min(a_i)max(ai​)−mi ...

  5. Codeforces Round #635 (Div. 1) C. Kaavi and Magic Spell 区间dp

    传送门 文章目录 题意: 思路: 题意: 给你两个串s,ts,ts,t,每次都可以从sss的开头拿一个字符放到AAA串的开头或结尾,问最终有多少种方案使得ttt是AAA的前缀,注意sss不必全部拿完. ...

  6. Codeforces Round #674 (Div. 3) F. Number of Subsequences 简单计数dp

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串,包含a,b,c,?a,b,c,?a,b,c,?四种字符,其中???可以变成为a,b,ca,b,ca,b,c的任意一种,让你求abca ...

  7. Codeforces Round #622 (Div. 2) D. Happy New Year 状压dp

    传送门 文章目录 题意: 思路: 题意: n≤1e5,m≤1e9,k≤8.n\le 1e5,m\le 1e9,k\le 8.n≤1e5,m≤1e9,k≤8. 思路: 注意到题目中保证了每个孩子至多收到 ...

  8. Codeforces Round #617 (Div. 3) E2. String Coloring (hard version) 思维 + dp + Dilworth定理

    传送门 文章目录 题意: 思路: 题意: 让你给一个串染色,不同颜色且相邻的一对字符可以互换位置,用最少的颜色,使交换后这个字符串字典序最小. 思路: 考虑将字符串分成若干个非递减的子序列,由于其非递 ...

  9. Codeforces Round #530 (Div. 1) 1098A Sum in the tree

    A. Sum in the tree Mitya has a rooted tree with nn vertices indexed from 11 to nn, where the root ha ...

最新文章

  1. 3.STM32中对EXTI_PE5_Config()函数的理解(自定义)之中断控制按键LED
  2. 区块链BaaS云服务(21)腾讯CCGP”跨链事务“
  3. python写电脑程序_【初学者教程】在电脑上安装Python,写第一个程序
  4. 研究显示每天工作超8小时得心脏病概率增加80%,生命很重要,工作不要那个累。
  5. WSDM Cup 2020检索排序评测任务第一名经验总结
  6. Delphi如何获取本机IP地址
  7. 判断操作系统多久没有任何操作.e
  8. 云计算之路:数据库服务器的选择——舍RDS取云服务器
  9. 一看就懂-grep命令详解
  10. 在浏览器上打开swf文件时变成了下载swf文件解决方式
  11. altera 公司的EP3C5E144C8N的引脚资料如何查找
  12. linux 扫描开放的端口命令,如何在 Linux 中检查(扫描)开放端口
  13. shell 输出7的倍数
  14. 计算机虚拟机安装教程,教你电脑安装虚拟机教程
  15. VS2015中无法查找或打开 PDB 文件
  16. Day28 49. 丑数
  17. Jquery Md5加密解密
  18. 【Ant Design】下拉列表Select 、日期选择框DatePicker等跟随滚动条上下移动解决方案
  19. R语言ggplot2可视化:使用patchwork包将两个ggplot2可视化结果图像垂直堆叠排列进行组合构图(vertically stack the plots)
  20. IPC分类—2018最新版IPC分类查询工具

热门文章

  1. 直角三角形知道两边求角度_每日一讲:解直角三角形(3.21)
  2. cad快捷命令大全_最全CAD快捷键命令大全(图文版、文字版、键盘版)
  3. 吃屎是一种什么样的体验?
  4. hadoop可以解决什么问题_聊一聊,临时工外包可以为企业解决什么问题
  5. 墨迹天气语音包_小米有品“智能AI翻译机”评测,还内置了语音助手,随身WiFi功能...
  6. python数组的切片操作_对Python 数组的切片操作
  7. 软件构造学习笔记-实验2
  8. leetcode54:螺旋矩阵
  9. 字符串哈希-BKDRHash
  10. 用html写出生日蛋糕,纯HTML5+CSS3制作生日蛋糕代码