首页 > 学院 > 开发设计 > 正文

BZOJ2797: [Poi2012]Squarks

2019-11-06 06:39:35
字体:
来源:转载
供稿:网友

乱搞..


首先X是一个递增的序列,所以最小的两个和一定是x1+x2,x1+x3 但是我们还需要x2+x3才能解出这三个数,而x2+x3有n-1种可能的值,不能确定,因为n不大,可以枚举x2+x3是哪个值,然后解出这三个值后可以解出其他的所有值,判一下是否合法即可


code:

#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>#define ll long longusing namespace std;const int maxn = 310;int x[maxn],n;int s[maxn*maxn];int ans[maxn][maxn],at;multiset<int>S;multiset<int>::iterator it;int main(){ scanf("%d",&n); int m=n*(n-1)/2; for(int i=1;i<=m;i++) scanf("%d",&s[i]); sort(s+1,s+m+1); at=0; for(int i=n;i>=3;i--) { if(i<n&&s[i]==s[i+1]) continue; x[1]=(s[1]+s[2]-s[i])>>1; if(x[1]*2!=s[1]+s[2]-s[i]) continue; if(x[1]<=0) continue; x[2]=s[1]-x[1]; if(x[2]<=x[1]) continue; x[3]=s[2]-x[1]; if(x[3]<=x[2]) continue; S.clear(); S.insert(-1); S.insert(1e9+1); for(int j=3;j<=m;j++) if(i!=j) S.insert(s[j]); int nw=4; while(nw<=n) { it=S.upper_bound(-1); x[nw]=(*it)-x[1]; if(x[nw]<=x[nw-1]) break; int j; for(j=1;j<nw;j++) { it=S.lower_bound(x[j]+x[nw]); if((*it)!=x[j]+x[nw]) break; S.erase(it); } if(j!=nw) break; nw++; } if(nw<=n) continue; at++; for(int j=1;j<=n;j++) ans[at][j]=x[j]; } PRintf("%d/n",at); for(int i=at;i>=1;i--) { for(int j=1;j<=n;j++) printf("%d ",ans[i][j]); printf("/n"); } return 0;}
上一篇:用链表实现线性表

下一篇:Mongodb 索引

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表