[构造] SRM 689 div1 MultiplicationTable3

来源:互联网 发布:程序员 博客 平台 编辑:程序博客网 时间:2024/05/18 02:31

构造一个nn的数组gi,j
一个集合S是好的当且仅当对于集合中的任意两个数 x , y , gx,y也在S中。
请构造一个数组使得好的集合个数恰好为Kn20

考虑经典套路 构造x+12x

  • 对于2x ,新加元素p ,使得gp,i=gi,p=i ,那么p可选可不选
  • 对于x+1 ,新加pgp,i=gp,i=i1 ,那么选了p之后 得把所有的元素都选上
// BEGIN CUT HERE  #include<conio.h>#include<sstream>// END CUT HERE  #include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<vector>#include<map>#include<string>#include<set>#define pb push_back#define cl(x) memset(x,0,sizeof(x))using namespace std;typedef long long ll;const int N=25; int p;int g[N][N];inline void Solve(int x){  if (x==2){    ++p,g[1][1]=1;    return;  }  if (~x&1){    Solve(x>>1);    ++p;    for (int i=1;i<=p;i++)      g[i][p]=g[p][i]=i;  }else{    Solve(x-1);    ++p;    g[1][p]=g[p][1]=1;    for (int i=2;i<=p;i++)      g[i][p]=g[p][i]=i-1;  }}vector<int> ans;class MultiplicationTable3{public:  vector <int> construct(int x){    x++;    p=0;    Solve(x);    ans.clear();    for (int i=1;i<=p;i++)      for (int j=1;j<=p;j++)    ans.pb(g[i][j]-1);    return ans;  }  // BEGIN CUT HEREpublic:  void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); if ((Case == -1) || (Case == 4)) test_case_4(); }private:  template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); }  void verify_case(int Case, const vector <int> &Expected, const vector <int> &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: " << print_array(Expected) << endl; cerr << "\tReceived: " << print_array(Received) << endl; } }  void test_case_0() { int Arg0 = 2; int Arr1[] = {1, 1, 1, 1 }; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(0, Arg1, construct(Arg0)); }  void test_case_1() { int Arg0 = 3; int Arr1[] = {0, 1, 0, 1 }; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(1, Arg1, construct(Arg0)); }  void test_case_2() { int Arg0 = 6; int Arr1[] = {0, 1, 1, 0, 1, 2, 0, 1, 2 }; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(2, Arg1, construct(Arg0)); }  void test_case_3() { int Arg0 = 31; int Arr1[] = {0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4 }; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(3, Arg1, construct(Arg0)); }  void test_case_4() { int Arg0 = 1; int Arr1[] = {0 }; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(4, Arg1, construct(Arg0)); }  // END CUT HERE};// BEGIN CUT HEREint main(){  MultiplicationTable3 ___test;  ___test.run_test(-1);  getch() ;  return 0;}// END CUT HERE
0 0
原创粉丝点击