[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的更多相关文章

  1. [BZOJ2797][Poi2012]Squarks

    2797: [Poi2012]Squarks Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 211  Solved: 89[Submit][Status ...

  2. 【BZOJ2797】[Poi2012]Squarks 暴力乱搞

    [BZOJ2797][Poi2012]Squarks Description 设有n个互不相同的正整数{X1,X2,...Xn},任取两个Xi,Xj(i≠j),能算出Xi+Xj.现在所有取法共n*(n ...

  3. bzoj 2797 [Poi2012]Squarks 枚举一个,推出所有

    题目大意 设有n个互不相同的正整数{X1,X2,...Xn},任取两个Xi,Xj(i≠j),能算出Xi+Xj. 现在所有取法共n*(n-1)/2个和,要你求出X1,X2,...Xn. 输出所有满足条件 ...

  4. POI2012题解

    POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. 2795: [Poi2012]A Horrible Poem

    2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 235[Subm ...

  7. [BZOJ2803][Poi2012]Prefixuffix

    2803: [Poi2012]Prefixuffix Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 219  Solved: 95[Submit][St ...

  8. [BZOJ2799][Poi2012]Salaries

    2799: [Poi2012]Salaries Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 91  Solved: 54[Submit][Statu ...

  9. POI2012 (持续更新中)

    Distance Well Vouchers Cloakroom A Horrible Poem Rendezvous Fibonacci Representation Squarks Salarie ...

随机推荐

  1. Verilog笔记.2.数字逻辑电路

    1.数字逻辑电路的种类:1) 组合逻辑:输出只是当前输入逻辑电平的函数(有延时),与电路的原始状态无关的逻辑电路.也就是说,当输入信号中的任何一个发生变化时,输出都有可能会根据其变化而变化,但与电路目 ...

  2. React Native DEMO for Android

    Demo1: 主要知识:navigator,fecth 地址:https://github.com/hongguangKim/ReactNativeDEMO1 Demo2: 主要知识:navigato ...

  3. 【Explain】mysql之explain详解(分析索引的最佳使用)

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain 这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句 ...

  4. Thinkphp的自定义路由(route.php)

    废话:因为thinkphp的默认路由会导致URL特别长,从而会影响搜索引擎优化.所以就衍生了自定义路由,尽量将URL缩短. 这是默认的路由文件: <?php return [ '__patter ...

  5. 29、最小的K个数

    一.题目 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 二.解法 import java.util.ArrayList; ...

  6. 安装在Ubuntu上的Python虚拟环境

    安装指南是在 Ubuntu 下面操作的.不同的 Linux 版本,安装指令不同.所以,该指南的某些指令对于像 CentOS 等非 Ubuntu 系统不适用. 为什么需要使用虚拟环境? 虚拟环境是一个将 ...

  7. Vue.js——60分钟快速入门(转)

    var vm = new Vue({ el: '#app', data: { people: [{ name: 'Jack', age: 30, sex: 'Male' }, { name: 'Bil ...

  8. POJ2528 Mayor's posters(线段树染色问题+离散化)

    题目大意:有t组数据,每组数据给你n张海报(1<=n<=10000),下面n组数据分别给出每张海报的左右范围(1 <= l <= r <= 10000000),下一张海报 ...

  9. C++实践积累

    C++ STL vector 如何彻底清空一个vector? 实践证明,vector.clear()并不能把vector容量清空,只会让vector.size()变为零,依然很占内存.那如何让vect ...

  10. Windows内核分析——内核调试机制的实现(NtCreateDebugObject、DbgkpPostFakeProcessCreateMessages、DbgkpPostFakeThreadMessages分析)

    本文主要分析内核中与调试相关的几个内核函数. 首先是NtCreateDebugObject函数,用于创建一个内核调试对象,分析程序可知,其实只是一层对ObCreateObject的封装,并初始化一些结 ...