CF1242C. Sum Balance
题目描述
k组数,每组ni个,数互不相同
把每组数中的一个移到其他组(或者不移动),使得最终每组数的个数不变且总和相等
k<=15,ni<=5000
题解
最终的移动关系一定为若干个环
枚举每个环的起点,找到一个数补上去使得和等于平均值
因为互不相同,所以出边(找到的数)唯一
判断是否能成环,并且把对应的选择方案记下
预处理的时间为O(k*∑ni)
最后O(3^n)dp即可
code
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
using namespace std;
struct type{
int s,x,y;
} a[75001];
int p[16]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384};
int b[16][5001];
int c[16];
int d[32768][16][2]; //d[][1][1] is special
int d2[16][2];
bool bz[16];
bool f[32768];
int g[32768];
int ans[16][2];
int D[16];
int n,I,J,i,j,k,l,len,S,s,L,tot;
long long Sum[16];
long long sum;
bool cmp(type a,type b)
{
return a.s<b.s;
}
int get(long long t)
{
int l=1,r=len,mid;
while (l<r)
{
mid=(l+r)/2;
if (a[mid].s<t)
l=mid+1;
else
r=mid;
}
if (a[l].s==t)
return l;
return -1;
}
int main()
{
// freopen("c.in","r",stdin);
scanf("%d",&n);L=p[n]*2-1;
fo(i,1,n)
{
scanf("%d",&c[i]);
fo(j,1,c[i])
scanf("%d",&b[i][j]),a[++len]={b[i][j],i,j},sum+=b[i][j],Sum[i]+=b[i][j];
}
if (sum%n)
{
printf("No\n");
return 0;
}
sum/=n;
sort(a+1,a+len+1,cmp);
fo(I,1,n)
{
fo(J,1,c[I])
{
memset(bz,0,sizeof(bz));
S=p[I];
tot=1;
d2[1][0]=I;
d2[1][1]=b[I][J];
j=I;
s=b[I][J];
l=get(sum-(Sum[j]-s));
while (!bz[j])
{
bz[j]=1;
if (l==-1 || bz[a[l].x])
break;
j=a[l].x;
s=a[l].s;
S|=p[j];
++tot;
d2[tot][0]=j;
d2[tot][1]=l;
l=get(sum-(Sum[j]-s));
}
if (l!=-1 && a[l].x==I && a[l].y==J)
{
f[S]=1;
fo(j,1,tot)
{
d[S][j][0]=d2[j][0];
d[S][j][1]=d2[j][1];
}
}
}
}
fo(i,1,L)
{
if (f[i])
g[i]=i;
else
{
for (j=(i-1)&i; j; j=(j-1)&i)
if (f[j] && g[i^j])
{
g[i]=j;
break;
}
}
}
if (g[L])
{
for (j=L; j; j^=g[j])
{
tot=0;
fo(i,1,n)
if (g[j]&p[i])
++tot;
ans[d[g[j]][1][0]][0]=d[g[j]][tot][0];
ans[d[g[j]][1][0]][1]=d[g[j]][1][1];
fo(i,2,tot)
{
ans[d[g[j]][i][0]][0]=d[g[j]][i-1][0];
ans[d[g[j]][i][0]][1]=a[d[g[j]][i][1]].s;
}
}
printf("Yes\n");
fo(i,1,n)
printf("%d %d\n",ans[i][1],ans[i][0]);
}
else
printf("No\n");
}
CF1242C. Sum Balance的更多相关文章
- Codeforces Round #599 (Div. 1) C. Sum Balance 图论 dp
C. Sum Balance Ujan has a lot of numbers in his boxes. He likes order and balance, so he decided to ...
- Codeforces Round #599 (Div. 2) E. Sum Balance
这题写起来真的有点麻烦,按照官方题解的写法 先建图,然后求强连通分量,然后判断掉不符合条件的换 最后做dp转移即可 虽然看起来复杂度很高,但是n只有15,所以问题不大 #include <ios ...
- [Codeforces 1242C]Sum Balance
Description 题库链接 给你 \(k\) 个盒子,第 \(i\) 个盒子中有 \(n_i\) 个数,第 \(j\) 个数为 \(x_{i,j}\).现在让你进行 \(k\) 次操作,第 \( ...
- SQL Server 中存储过程的练习
建库建表建约束 插入数据 --建库建表建约束和插入测试数据 use bankDB go --1.完成存款,取款业务--存款 create proc usp_takeMoney ),),)=null,@ ...
- order_by_、group_by_、having的用法区别
写于 2012-11-20 22:14 doc文档上. Having 这个是用在聚合函数的用法.当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算.运算完后 ...
- [POJ] #1004# Financial Management : 浮点数运算
一. 题目 Financial Management Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 173910 Acc ...
- HW4.7
public class Solution { public static void main(String[] args) { double rate = 0.05; double balance ...
- pubwin会员合并
此博文已移至爬不稳独立博客:www.pubwin2009.net连接:http://www.pubwin2009.net/index.php/post/15.html 我们说下过程(这里,我们要求两个 ...
- 事务,Oracle,MySQL及Spring事务隔离级别
一.什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种): 原子性 (atomicity):强调事务的不可分割:一致性 (consiste ...
随机推荐
- miniui 请求遮罩mask不生效
通用写法: mini.mask({ el:document.body(作用对象) cls:样式 hetml:显示文本 }) 我的问题是,当前页面的遮罩无效不会显示,但是页面不能点击 问题原因,aj ...
- python 并发编程 多线程 GIL与Lock
GIL与Lock Python已经有一个GIL来保证同一时间只能有一个线程来执行了,为什么这里还需要互斥锁lock? 锁的目的是为了保护共享的数据,同一时间只能有一个线程来修改共享的数据 GIT保证了 ...
- XSS-笔记
Cross Site Script 跨站脚本 是一种客户端代码的注入 而命令注入.sql注入都是客户端代码的注入. XSS攻击行为的目标为:1.窃取目标的cookie信息 2.执行CSRF脚 ...
- airflow部署
官网: http://airflow.apache.org/installation.html 原理: https://www.cnblogs.com/cord/p/9450910.html 安装: ...
- TCP listener
调试时未关闭之前开启的TCP SERVER: 应该关闭: TcpListener TcpClient 1.开启TCP listener (1)Start()方法失败 异常位置:该异常的产生位置为 tc ...
- gRPC编译教程
windows平台的编译 一.编译openssl ① 安装perl(可以使用ActivePerl),执行perl Configure VC-WIN64A no-asm .在这里解释一下参数含义,VC- ...
- WAMP中的mysql设置密码
为WAMP中的mysql设置密码密码 WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 1.首先,通过WAMP打开mysql控制台. ...
- laravel5.5部署
一.环境: centos7 + apache2.6+mysql5.5+PHP7.2 确保php版本大于7.1,看帮助文档说是7就可以,但是我部署的时候提示要大于7.1,并且要装上必须的php扩展 PH ...
- python——元组方法及字符串方法
元组方法 Tup.count():计算元组中指定元素出现的次数 Tup.count('c') Tup.index():在元组中从左到右查找指定元素,找到第一个就返回该元素的索引值 Tup.index( ...
- python中的生成器、迭代器、闭包、装饰器
迭代器 迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 可迭代对象 以直接作用于 for ...