[POI2012]Squarks
[POI2012]Squarks
题目大意:
设有\(n\)个互不相同的正整数\(\{X_1,X_2,...,X_n\}\),任取两个\(X_i,X_j(i\ne j)\),能算出\(X_i+X_j\)。
现在所有取法共\(\frac{n(n-1)}2\)个和,要你求出\(\{X_i\}\)的取值方案数,并求出所有方案的\(X_1,X_2,\ldots,X_n\)。
思路:
设\(\{X_i\}\)两两之和构成集合\(A\),将\(A\)和\(X\)从小到大排序,则\(A_1=X_1+X_2,A_2=X_1+X_3\)。
而\(X_2+X_3\)的取值可能在\(X_3\sim X_n\)中,我们可以枚举\(X_2+X_3\)的取值,这样我们就可以求出\(X_1,X_2,X_3\)的值。
用multiset维护\(A\),将\(X_1+X_2,X_1+X_3,X_2+X_3\)从集合中删去,剩下最小的一定是\(X_1+X_4\)。这样可以求出\(X_4\)。将\(X_4\)与\(X_1\sim X_3\)的和从集合中删去,剩下最小就是\(X_1+X_5\)。以此类推。
这样我们\(\mathcal O(n)\)枚举\(X_2+X_3\)的值,再\(\mathcal O(n^2\log n)\)不断推出\(X_4\sim X_n\)的值。时间复杂度\(\mathcal O(n^3\log n)\)。
源代码:
#include<set>
#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=301,M=(N-1)*(N-2)/2+1;
int a[M],cnt,ans[N][N],n;
std::multiset<int> set;
void solve(const int &k) {
set.clear();
for(register int i=3;i<=n*(n-1)/2;i++) {
if(i!=k) set.insert(a[i]);
}
const int tmp=(a[1]+a[2]+a[k])>>1;
ans[cnt][1]=tmp-a[k];
if(ans[cnt][1]<=0) return;
ans[cnt][2]=tmp-a[2];
if(ans[cnt][2]<=0) return;
ans[cnt][3]=tmp-a[1];
if(ans[cnt][3]<=0) return;
for(register int i=4;i<=n;i++) {
const int val=*set.begin();
ans[cnt][i]=val-ans[cnt][1];
if(ans[cnt][i]<=0) return;
for(register int j=1;j<i;j++) {
const std::set<int>::iterator pos=set.find(ans[cnt][i]+ans[cnt][j]);
if(pos==set.end()) return;
set.erase(pos);
}
}
cnt++;
}
int main() {
n=getint();
for(register int i=1;i<=n*(n-1)/2;i++) {
a[i]=getint();
}
std::sort(&a[1],&a[n*(n-1)/2]+1);
for(register int i=3;i<=n;i++) {
if(i!=3&&a[i]==a[i-1]) continue;
if((a[1]+a[2]+a[i])&1) continue;
solve(i);
}
printf("%d\n",cnt);
for(register int i=0;i<cnt;i++) {
for(register int j=1;j<=n;j++) {
printf("%d%c",ans[i][j]," \n"[j==n]);
}
}
return 0;
}
[POI2012]Squarks的更多相关文章
- [BZOJ2797][Poi2012]Squarks
2797: [Poi2012]Squarks Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 211 Solved: 89[Submit][Status ...
- 【BZOJ2797】[Poi2012]Squarks 暴力乱搞
[BZOJ2797][Poi2012]Squarks Description 设有n个互不相同的正整数{X1,X2,...Xn},任取两个Xi,Xj(i≠j),能算出Xi+Xj.现在所有取法共n*(n ...
- bzoj 2797 [Poi2012]Squarks 枚举一个,推出所有
题目大意 设有n个互不相同的正整数{X1,X2,...Xn},任取两个Xi,Xj(i≠j),能算出Xi+Xj. 现在所有取法共n*(n-1)/2个和,要你求出X1,X2,...Xn. 输出所有满足条件 ...
- POI2012题解
POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 2795: [Poi2012]A Horrible Poem
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 484 Solved: 235[Subm ...
- [BZOJ2803][Poi2012]Prefixuffix
2803: [Poi2012]Prefixuffix Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 219 Solved: 95[Submit][St ...
- [BZOJ2799][Poi2012]Salaries
2799: [Poi2012]Salaries Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 91 Solved: 54[Submit][Statu ...
- POI2012 (持续更新中)
Distance Well Vouchers Cloakroom A Horrible Poem Rendezvous Fibonacci Representation Squarks Salarie ...
随机推荐
- String类的一些常用操作方法
package com.liveyc.framework.util; import java.io.UnsupportedEncodingException; import java.net.URLD ...
- PHP数据库类
简单封装PHP操作MySQL的类 <?php /* 类的名称:Model 类的作用:连接数据库执行sql语句 作 者:lim 更新时间:20170812 */ class Model{ //存放 ...
- KEA128单片机启动代码分析
;/*****************************************************************************; * @file: startup_SK ...
- thinkphp对数据库的增删改查(查询构造器)
- Linux下的压缩解压缩
Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲t ...
- SVM问题再理解与分析——我的角度
SVM问题再理解与分析--我的角度 欢迎关注我的博客:http://www.cnblogs.com/xujianqing/ 支持向量机问题 问题先按照几何间隔最大化的原则引出他的问题为 上面的约束条件 ...
- elk系列6之tcp模块的使用【转】
preface tcp模块的使用场景如下: 有一台服务器A只需要收集一个日志,那么我们就可以不需要在这服务器上安装logstash,我们通过在其他logstash上启用tcp模块,监听某个端口,然后我 ...
- Deep Learning基础--Softmax求导过程
一.softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个 ...
- DroidParts 中文系列教程(基于官方教程)
DroidParts中文系列教程(基于官方教程) (一)DroidParts框架概况 2014年4月18日星期五 11:36 他是一个精心构造的安卓框架,包括下面这些基本功能 DI依赖注入,可以注入V ...
- POJ 2349 Arctic Network(最小生成树+求第k大边)
题目链接:http://poj.org/problem?id=2349 题目大意:有n个前哨,和s个卫星通讯装置,任何两个装了卫星通讯装置的前哨都可以通过卫星进行通信,而不管他们的位置. 否则,只有两 ...