DIV1 250pt
题意:有很多袋子,里面装有苹果和橘子(也可能没有),给出每个袋子里有多少个苹果,多少个橘子。如果每个袋子里含有水果的总数都不小于x个,则可以从每个袋子里都拿出x个水果(拿出苹果和橘子的总数为x),将所有拿出的水果混合成一份礼物,问可能混合出的礼物的种数。
最多50个袋子,每个袋子里的苹果和橘子的数量 <= 10^6。
解法:枚举即可,枚举从每个袋子里拿出的水果的数量x,然后求出,拿出总数是x的情况下,苹果最多能拿多少个,最少能拿多少个,相减即可。
至于怎么求最多和最少,由于最多50个袋子,所以暴力即可。比赛的时候我很傻逼地用了更快的递推来求,然后赋值初始化写错了,喜大普奔。。。。。。。。。。
tag:brute-force
1 // BEGIN CUT HERE
2 /*
3
4 */
5 // END CUT HERE
6 #line 7 "WinterAndPresents.cpp"
7 #include <cstdlib>
8 #include <cctype>
9 #include <cstring>
10 #include <cstdio>
11 #include <cmath>
12 #include <algorithm>
13 #include <vector>
14 #include <iostream>
15 #include <sstream>
16 #include <set>
17 #include <queue>
18 #include <fstream>
19 #include <numeric>
20 #include <iomanip>
21 #include <bitset>
22 #include <list>
23 #include <stdexcept>
24 #include <functional>
25 #include <string>
26 #include <utility>
27 #include <map>
28 #include <ctime>
29 #include <stack>
30
31 using namespace std;
32
33 #define clr0(x) memset(x, 0, sizeof(x))
34 #define clr1(x) memset(x, -1, sizeof(x))
35 #define pb push_back
36 #define mp make_pair
37 #define sz(v) ((int)(v).size())
38 #define out(x) cout<<#x<<":"<<(x)<<endl
39 #define tst(a) cout<<#a<<endl
40 #define CINBEQUICKER std::ios::sync_with_stdio(false)
41
42 typedef vector<int> VI;
43 typedef vector<string> VS;
44 typedef vector<double> VD;
45 typedef long long int64;
46
47 const double eps = 1e-8;
48 const double PI = atan(1.0)*4;
49 const int inf = 2139062143 / 2;
50
51 inline int MyMod( int a , int b ) { return (a%b+b)%b;}
52
53 int num[3000005];
54 int num2[3000005];
55
56 int64 max(int x, int64 y)
57 {
58 return x > y ? x : y;
59 }
60
61 class WinterAndPresents
62 {
63 public:
64 long long getNumber(vector <int> an, vector <int> on){
65 clr0 (num); clr0 (num2);
66 int n = sz(an);
67 for (int i = 0; i < n; ++ i){
68 ++ num[an[i]];
69 ++ num2[on[i]];
70 }
71 int pos = 0;
72 for (int i = 0; i < n; ++ i)
73 if (an[pos] + on[pos] > an[i] + on[i]) pos = i;
74 int64 up = an[pos] + on[pos], cnt = 1;
75 int64 ret = 0, sum = n - num[0], maxx = 0;
76 int64 ts = n - num2[0], minn = 0;
77 while (cnt <= up){
78 maxx += sum;
79 minn += ts;
80 ret += maxx - max(0, cnt*n-minn) + 1;
81 sum -= num[cnt];
82 ts -= num2[cnt];
83 //out (cnt); out (ret); out (sum); out (ts);
84 ++ cnt;
85 }
86 return ret;
87 }
88
89 // BEGIN CUT HERE
90 public:
91 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(); }
92 //void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0();}
93 private:
94 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(); }
95 void verify_case(int Case, const long long &Expected, const long long &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << '\"' << endl; cerr << "\tReceived: \"" << Received << '\"' << endl; } }
96 void test_case_0() { int Arr0[] = {10}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {0}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); long long Arg2 = 3LL; verify_case(0, Arg2, getNumber(Arg0, Arg1)); }
97 void test_case_1() { int Arr0[] = {1, 2, 0, 3}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {4, 5, 0, 6}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); long long Arg2 = 0LL; verify_case(1, Arg2, getNumber(Arg0, Arg1)); }
98 void test_case_2() { int Arr0[] = {2, 2, 2}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {2, 2, 2}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); long long Arg2 = 16LL; verify_case(2, Arg2, getNumber(Arg0, Arg1)); }
99 void test_case_3() { int Arr0[] = {7, 4, 5}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1, 10, 2}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); long long Arg2 = 46LL; verify_case(3, Arg2, getNumber(Arg0, Arg1)); }
100 void test_case_4() { int Arr0[] = {1000000}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1000000}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); long long Arg2 = 1000002000000LL; verify_case(4, Arg2, getNumber(Arg0, Arg1)); }
101
102 // END CUT HERE
103
104 };
105 //by plum rain
106 // BEGIN CUT HERE
107 int main()
108 {
109 //freopen( "a.out" , "w" , stdout );
110 WinterAndPresents ___test;
111 ___test.run_test(-1);
112 return 0;
113 }
114 // END CUT HERE
View Code
DIV1 500pt
题意:给出整数n和m,{1,2,3....n}的一个子集a,{1,2,3...m}的一个子集b,要求a和b满足两个条件:1、a和b的元素无交集;2、a中所有元素异或得到的值小于b中所有元素异或得到的值。求这样的集合对(a, b)有多少对。
解法:首先,设a异或的值为x,b异或的值为y,由于x小于y,所以在二进制形式中,一定存在某一位r,在r位之前x和y相同,第r位x为0,y为1。枚举r。
用异或值为1表示,前r位x和y相同,第r位不同;另一个是,只要把一个数放进集合a或b都把它和j与一下,然后,因为在比r位高的位a和b两个集合的异或值相同,所以j的这些位异或值为0。
虽然这是一个dp,但是关键的那点还是很难想到的。。。。
tag:dp, think, good
1 // BEGIN CUT HERE
2 /*
3 * Author: plum rain
4 * score :
5 */
6 /*
7
8 */
9 // END CUT HERE
10 #line 11 "WinterAndSnowmen.cpp"
11 #include <sstream>
12 #include <stdexcept>
13 #include <functional>
14 #include <iomanip>
15 #include <numeric>
16 #include <fstream>
17 #include <cctype>
18 #include <iostream>
19 #include <cstdio>
20 #include <vector>
21 #include <cstring>
22 #include <cmath>
23 #include <algorithm>
24 #include <cstdlib>
25 #include <set>
26 #include <queue>
27 #include <bitset>
28 #include <list>
29 #include <string>
30 #include <utility>
31 #include <map>
32 #include <ctime>
33 #include <stack>
34
35 using namespace std;
36
37 #define clr0(x) memset(x, 0, sizeof(x))
38 #define clr1(x) memset(x, -1, sizeof(x))
39 #define pb push_back
40 #define sz(v) ((int)(v).size())
41 #define all(t) t.begin(),t.end()
42 #define zero(x) (((x)>0?(x):-(x))<eps)
43 #define out(x) cout<<#x<<":"<<(x)<<endl
44 #define tst(a) cout<<a<<" "
45 #define tst1(a) cout<<#a<<endl
46 #define CINBEQUICKER std::ios::sync_with_stdio(false)
47
48 typedef vector<int> VI;
49 typedef vector<string> VS;
50 typedef vector<double> VD;
51 typedef pair<int, int> pii;
52 typedef long long int64;
53
54 const double eps = 1e-8;
55 const double PI = atan(1.0)*4;
56 const int inf = 2139062143 / 2;
57 const int mod = 1000000007;
58
59 int n, m;
60 int d[2][2105][2];
61
62 int gao(int r)
63 {
64 clr0 (d);
65 d[0][0][0] = 1;
66 int cur = 0, tmp = 1 << 11;
67 for (int i = 1; i <= min(n, m); ++ i){
68 cur ^= 1;
69 int flag = ((i & (1<<r)) > 0);
70 for (int j = 0; j < tmp; ++ j)
71 for (int k = 0; k < 2; ++ k){
72 d[cur][j][k] = (d[cur^1][j][k] + d[cur^1][j^i][k]) % mod;
73 d[cur][j][k] = (d[cur][j][k] + d[cur^1][j^i][k^flag]) % mod;
74 }
75 }
76 if (n > m)
77 for (int i = m+1; i <= n; ++ i){
78 cur ^= 1;
79 int flag = ((i & (1<<r)) > 0);
80 for (int j = 0; j < tmp; ++ j)
81 for (int k = 0; k < 2; ++ k)
82 d[cur][j][k] = (d[cur^1][j][k] + d[cur^1][j^i][k^flag]) % mod;
83 }
84 if (n < m)
85 for (int i = n+1; i <= m; ++ i){
86 cur ^= 1;
87 for (int j = 0; j < tmp; ++ j)
88 for (int k = 0; k < 2; ++ k)
89 d[cur][j][k] = (d[cur^1][j][k] + d[cur^1][j^i][k]) % mod;
90 }
91 int ret = 0;
92 for (int j = 0; j < tmp; ++ j)
93 if ((j >> r) == 1) ret = (ret + d[cur][j][0]) % mod;
94 return ret;
95 }
96
97 class WinterAndSnowmen
98 {
99 public:
100 int getNumber(int N, int M){
101 n = N; m = M;
102 int ans = 0;
103 for (int i = 0; i < 11; ++ i)
104 ans = (ans + gao(i)) % mod;
105 return ans;
106 }
107
108 // BEGIN CUT HERE
109 public:
110 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(); }
111 private:
112 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(); }
113 void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << '\"' << endl; cerr << "\tReceived: \"" << Received << '\"' << endl; } }
114 void test_case_0() { int Arg0 = 2; int Arg1 = 2; int Arg2 = 4; verify_case(0, Arg2, getNumber(Arg0, Arg1)); }
115 void test_case_1() { int Arg0 = 1; int Arg1 = 1; int Arg2 = 1; verify_case(1, Arg2, getNumber(Arg0, Arg1)); }
116 void test_case_2() { int Arg0 = 3; int Arg1 = 5; int Arg2 = 74; verify_case(2, Arg2, getNumber(Arg0, Arg1)); }
117 void test_case_3() { int Arg0 = 7; int Arg1 = 4; int Arg2 = 216; verify_case(3, Arg2, getNumber(Arg0, Arg1)); }
118 void test_case_4() { int Arg0 = 47; int Arg1 = 74; int Arg2 = 962557390; verify_case(4, Arg2, getNumber(Arg0, Arg1)); }
119
120 // END CUT HERE
121
122 };
123
124 // BEGIN CUT HERE
125 int main()
126 {
127 // freopen( "a.out" , "w" , stdout );
128 WinterAndSnowmen ___test;
129 ___test.run_test(-1);
130 return 0;
131 }
132 // END CUT HERE
View Code