[BZOJ2797][Poi2012]Squarks

2797: [Poi2012]Squarks

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 211  Solved: 89
[Submit][Status][Discuss]

Description

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

Input

第一行一个正整数n (3<=n<=300)。
第二行n*(n-1)/2个正整数(每个正整数不超过10^8),表示任取两个Xi,Xj(i≠j)算出的n*(n-1)/2个和。

Output

第一行一个正整数k,表示方案数。测试数据保证至少存在一种方案。
下面k行每行给出递增的n个正整数。方案按照{Xi}的最小值从大到小输出。

Sample Input

Sample Input 1
4
3 5 4 7 6 5

Sample Input 2
4
11 17 12 20 21 15

Sample Output

Sample Output 2
2
4 7 8 13
3 8 9 12

Sample Output 1
1
1 2 3 4

HINT

Source

鸣谢Oimaster

[Submit][Status][Discuss]

先把数列排一下序,a1一定是x1+x2,a2一定是x1+x3。如果知道x2+x3的话,就可以求出x1~x3了。

这样的话可以枚举x2+x3,然后求出x1~x3之后删掉这里面的和,最小的一定是x1+x4了,这样又可以求出来x4。

因为n比较小,这样就可以过了。

 1 #include<set>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define N 305
 5 using namespace std;
 6 inline int read()
 7 {
 8     int x=0,f=1;char ch=getchar();
 9     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
10     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
11     return x*f;
12 }
13 int n,tot,a[N*N],ans[N][N],x[N];
14 multiset<int>s;
15 void solve(int a3)
16 {
17     s.clear();
18     for(int i=1;i<=n*(n-1)/2;i++)
19     s.insert(a[i]);
20     if(a[1]+a[2]+a3&1)return;
21     x[1]=a[1]+a[2]-a3>>1;
22     x[2]=a[1]-a[2]+a3>>1;
23     x[3]=-a[1]+a[2]+a3>>1;
24     if(x[1]<0||x[2]<0||x[3]<0)return;
25     s.erase(s.find(a[1]));
26     s.erase(s.find(a[2]));
27     s.erase(s.find(a3));
28     for(int i=4;i<=n;i++)
29     {
30         x[i]=*s.begin()-x[1];
31         if(x[i]<0)return;
32         for(int j=1;j<i;j++)
33         {
34             int t=x[j]+x[i];
35             if(s.find(t)==s.end())return;
36             s.erase(s.find(t));
37         }
38     }
39     for(int i=2;i<=n;i++)
40     if(x[i]<=x[i-1])return;
41     for(int i=1;i<=n;i++)
42     ans[tot][i]=x[i];
43     tot++;
44 }
45 int main()
46 {
47     n=read();
48     for(int i=1;i<=n*(n-1)/2;i++)a[i]=read();
49     sort(a+1,a+n*(n-1)/2+1);
50     for(int i=3;i<=n;i++)
51     if(i==3||a[i]!=a[i-1])
52     solve(a[i]);
53     printf("%d\n",tot);
54     for(int j=0;j<tot;j++,puts(""))
55     for(int i=1;i<=n;i++)
56     printf("%d ",ans[j][i]);
57 }

(PS:我发现有很多人特别快,不知道是怎么做的。。)

时间: 2024-12-10 12:08:35

[BZOJ2797][Poi2012]Squarks的相关文章

[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

Bzoj 2789: [Poi2012]Letters 树状数组,逆序对

2789: [Poi2012]Letters Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 278  Solved: 185[Submit][Status][Discuss] Description 给出两个长度相同且由大写英文字母组成的字符串A.B,保证A和B中每种字母出现的次数相同. 现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B. Input 第一行一个正整数n (2<=n<=1,000,000),表示字符串的长度

POI2012 (持续更新中)

Distance Well Vouchers Cloakroom A Horrible Poem Rendezvous Fibonacci Representation Squarks

[BZOJ2791][Poi2012]Rendezvous

2791: [Poi2012]Rendezvous Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 95  Solved: 71[Submit][Status][Discuss] Description 给定一个n个顶点的有向图,每个顶点有且仅有一条出边.对于顶点i,记它的出边为(i, a[i]).再给出q组询问,每组询问由两个顶点a.b组成,要求输出满足下面条件的x.y:1. 从顶点a沿着出边走x步和从顶点b沿着出边走y步后到达的顶点相同.2.

[BZOJ2793][Poi2012]Vouchers

2793: [Poi2012]Vouchers Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 316  Solved: 148[Submit][Status][Discuss] Description 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个.正整数中有m个数被标成了幸运数,问有哪些人取到了幸运数. Input 第一行一个正整数m (m<=1,000,000),下面m行每行一

[BZOJ2795][Poi2012]A Horrible Poem

2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 261  Solved: 150[Submit][Status][Discuss] Description 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. Input 第一行一个正整数n (n<=500,000),表示S的长度.第二行n个小

[BZOJ2792][Poi2012]Well

2792: [Poi2012]Well Time Limit: 40 Sec  Memory Limit: 64 MBSubmit: 137  Solved: 61[Submit][Status][Discuss] Description 给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一. 最终要求存在某个k满足Xk=0,并且z=max{|Xi - Xi+1|}最小. 输出最小的z和此时最小的k. Input 第一行两个正整数n, m (1<=

[BZOJ2788][Poi2012]Festival

2788: [Poi2012]Festival Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 187  Solved: 91[Submit][Status][Discuss] Description 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1. 给出a,b (1<=a,b<=n),要求满足Xa + 1 = Xb 2. 给出c,d (1<=c,d<=n),要求满足Xc <= Xd 在满足所

[BZOJ2790][Poi2012]Distance

2790: [Poi2012]Distance Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 225  Solved: 115[Submit][Status][Discuss] Description 对于两个正整数a.b,这样定义函数d(a,b):每次操作可以选择一个质数p,将a变成a*p或a/p, 如果选择变成a/p就要保证p是a的约数,d(a,b)表示将a变成b所需的最少操作次数.例如d(69,42)=3. 现在给出n个正整数A1,A2,.