Codeforces Round #144 (Div. 1) (No. 232) 本番

Coding

A

最初k以上ならおkと勘違いして完全グラフでよくね?とかして1WAする。
グラフを作るのが、どうやったらいいんだ…と普通にわからない。
とりあえず適当にやればいいだろーとランダムに辺を追加/削除するのを書いてみる。
そのコードは動かなかったが、適当な単純な戦略(現在k未満のときのみ追加し、kより大きいときのみ削除する)を書いてみたら何回かやっても動くようになった。
でも何回かしか試してないのでどうだか…

B

行列累乗かなあ?とか思ったが、掛け算はできないよなあ?とか。
なんか数式でできそうだけどなーと、k=1のときに限った式を立ててみる。
再帰的にできそうだけどなーと適当にやっても、よくわからない。
結局、最後までわからなかった

SystemTest

A通ったらいいなあ。でも、通らない可能性のほうが大きい気もする。さて?
とりあえず、寝る
通ってた。

結果

A: +342 (00:54)
Rank: 254/371 (Div.1)
Rate: 17201700

コメント

レートは落ちちゃった。ギリギリDIV1だ。
もう少し早く解くべきだなあ。
Bも解きたいね

コード

AのAcceptしたコード

#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
#define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i))
#ifdef __GNUC__
#define aut(v, x) __typeof(x) v = (x)
#else
#define aut(v, x) auto v = (x)
#endif
#define each(it,o) for(aut(it, (o).begin()); it != (o).end(); ++ it)
#define all(o) (o).begin(), (o).end()
#define pb(x) push_back(x)
#define mp(x,y) make_pair((x),(y))
#define mset(m,v) memset(m,v,sizeof(m))
using namespace std;
typedef long long ll; typedef vector<ll> vl; typedef pair<ll,ll> pll; typedef vector<pll> vpll; typedef vector<string> vs;
const int INF = 0x3f3f3f3f; const ll INFL = 0x3f3f3f3f3f3f3f3fLL;

int g[111][111];
int main() {
    int k;
    cin>>k;
    srand(clock());
//  rer(n, 1, 100) {
    int n = 100;
        ll x = 0;
        mset(g, 0);
        rep(ttt, 1000000) {
            int t = rand()%n, u = rand()%n;
            if(t == u) continue;
            if(!g[t][u] && x < k) {
                rep(i, n) if(g[t][i] && g[i][u]) x ++;
                g[t][u] = g[u][t] = 1;
            }else if(g[t][u] && x > k){
                rep(i, n) if(g[t][i] && g[i][u]) x --;
                g[t][u] = g[u][t] = 0;
            }
//          cout<<x<<endl;
            if(x == k) {
                cout << n << endl;
                rep(i, n) {
                    rep(j, n) cout << "01"[g[i][j]];
                    cout << endl;
                }
                return 0;
            }
        }
//  }
    return 0;