CodeForces-232A【构造 二分】
2017-07-30 10:30
471 查看
对于3就是C(2, 2), 对于4就是C(2, 3), 对于5就是C(2, 4), 后面你可以发现,会是一个{1},{1,2},{1,2,3},{1,2,3,4}…而且是拿x与1,2相连会有1个环,然后每多一条边会每次按照那些序列增加环。
现在就变成了这种序列构造一个k,预处理出这个数量,二分一下,然后之后因为值小,模拟就好了。
现在就变成了这种序列构造一个k,预处理出这个数量,二分一下,然后之后因为值小,模拟就好了。
#include<bits/stdc++.h> using namespace std; typedef long long LL; int f[110]; void init(){ int temp; f[1] = f[2] = 0; f[3] = 1; for(int i=4;i<=100;i++){ temp = (i-1)*(i-2)/2; f[i] = f[i-1] + temp; } } int k; int ma[110][110]; int main(){ init(); scanf("%d", &k); int Left = 1, Right = 100; while(Left<Right){ int Mid = Left + (Right - Left + 1)/2; if(f[Mid] <= k) Left = Mid; else Right = Mid - 1; } int sum = k - f[Left]; memset(ma, 0, sizeof(ma)); for(int i=1;i<=Left;i++) for(int j=i+1;j<=Left;j++) ma[i][j] = ma[j][i] = 1; int v = Left + 1, temp, p; if(!sum) v--; while(1){ if(!sum) break; sum--; ma[v][1] = ma[1][v] = 1; ma[v][2] = ma[2][v] = 1; temp = 2; p = 3; while(sum >= temp){ sum -= temp; ma[v][p] = ma[p][v] = 1; temp++; p++; } if(sum) v++; } printf("%d\n", v); for(int i=1;i<=v;i++){ for(int j=1;j<=v;j++) printf("%d",ma[i][j]); puts(""); } return 0; }
相关文章推荐
- codeforces 225B B. Well-known Numbers(数论+二分+贪心+构造)
- codeforces-237【B构造】【C二分】
- Codeforces 760B (二分)
- Codeforces 590B Chip 'n Dale Rescue Rangers(二分)
- CodeForces 689D Friends and Subsequences (RMQ+二分)
- CodeForces 932F Escape Through Leaf [set启发式合并+维护凸包+二分]
- CodeForces 627D Preorder Test(树形DP+二分)
- [并查集 构造] Codeforces 723F#375 (Div. 2) F. st-Spanning Tree
- hdu6070 Dirt Ratio (线段树:二分+多次建树+构造难想)
- [二分 前缀优化建图 2-SAT] Codeforces 587D. Duff in Mafia
- CodeForces 782B The Meeting Place Cannot Be Changed(二分)
- Codeforces 550D. Regular Bridge 构造
- Codeforces_768_B_(二分)
- 【CodeForces - 849】C From Y to Y 【思维+构造+贪心】
- CodeForces 483B Friends and Presents(二分+容斥定理)
- CodeForces 940 C. Phone Numbers 字符串构造
- 【 Codeforces 237C Primes on Interval】+ 二分
- CodeForces 372A Counting Kangaroos is Fun (二分)
- codeforces 808D Array Division(二分+思维)
- Codeforces 946E - Largest Beautiful Number(贪心、构造)