2018-2019 ICPC, NEERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred) Solution
A. Alice the Fan
Solved.
题意:
两个人打网球,要求teamA 的得分与其他队伍拉开尽量大
输出合法的方案
思路:
$dp[i][j][k][l] 表示 A 赢i局,其他队伍赢j局,两个人比分为k : l 的时候的方案$
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int dp[5][5][210][210]; 6 vector<pair<int, int> >out[5][5][210][210]; 7 8 void Init() 9 { 10 dp[0][0][0][0] = 1; 11 for(int sum = 0; sum <= 4; ++sum) 12 { 13 for(int l = 0; l <= sum; ++l) 14 { 15 for(int i = 0; i <= 200; ++i) 16 { 17 for(int j = 0; j <= 200; ++j) 18 { 19 int r = sum - l; 20 if(!dp[l][r][i][j]) continue; 21 if(max(l, r) >= 3) continue; 22 int limit = 25; 23 if(sum == 4) limit = 15; 24 for(int tmp = limit; tmp <= 200; ++tmp) 25 { 26 if(i + tmp <= 200 && j + tmp - 2 <= 200 && !dp[l + 1][r][i + tmp][j + tmp - 2]) 27 { 28 dp[l + 1][r][i + tmp][j + tmp - 2] = 1; 29 out[l + 1][r][i + tmp][j + tmp - 2] = out[l][r][i][j]; 30 out[l + 1][r][i + tmp][j + tmp - 2].push_back(make_pair(tmp, tmp - 2)); 31 } 32 if(i + tmp - 2 <= 200 && j + tmp <= 200 && !dp[l][r + 1][i + tmp - 2][j + tmp]) 33 { 34 dp[l][r + 1][i + tmp - 2][j + tmp] = 1; 35 out[l][r + 1][i + tmp - 2][j + tmp] = out[l][r][i][j]; 36 out[l][r + 1][i + tmp - 2][j + tmp].push_back(make_pair(tmp - 2, tmp)); 37 } 38 } 39 40 for(int tmp = 0; tmp <= limit - 2; ++tmp) 41 { 42 if(i + limit <= 200 && j + tmp <= 200 && !dp[l + 1][r][i + limit][j + tmp]) 43 { 44 dp[l + 1][r][i + limit][j + tmp] = 1; 45 out[l + 1][r][i + limit][j + tmp] = out[l][r][i][j]; 46 out[l + 1][r][i + limit][j + tmp].push_back(make_pair(limit, tmp)); 47 } 48 if(i + tmp <= 200 && j + limit <= 200 && !dp[l][r + 1][i + tmp][j + limit]) 49 { 50 dp[l][r + 1][i + tmp][j + limit] = 1; 51 out[l][r + 1][i + tmp][j + limit] = out[l][r][i][j]; 52 out[l][r + 1][i + tmp][j + limit].push_back(make_pair(tmp, limit)); 53 } 54 } 55 } 56 } 57 } 58 } 59 } 60 61 int a, b; 62 63 int main() 64 { 65 Init(); 66 int t; 67 scanf("%d", &t); 68 while(t--) 69 { 70 scanf("%d %d", &a, &b); 71 int l = -1, r = -1; 72 if(dp[3][0][a][b]) 73 { 74 l = 3; 75 r = 0; 76 } 77 else if(dp[3][1][a][b]) 78 { 79 l = 3; 80 r = 1; 81 } 82 else if(dp[3][2][a][b]) 83 { 84 l = 3; 85 r = 2; 86 } 87 else if(dp[2][3][a][b]) 88 { 89 l = 2; 90 r = 3; 91 } 92 else if(dp[1][3][a][b]) 93 { 94 l = 1; 95 r = 3; 96 } 97 else if(dp[0][3][a][b]) 98 { 99 l = 0; 100 r = 3; 101 } 102 if(l == -1 && r == -1) 103 { 104 puts("Impossible"); 105 } 106 else 107 { 108 printf("%d:%d\n", l, r); 109 int len = out[l][r][a][b].size(); 110 for(int i = 0; i < len; ++i) printf("%d:%d%c", out[l][r][a][b][i].first, out[l][r][a][b][i].second, " \n"[i == len - 1]); 111 } 112 } 113 return 0; 114 }
B:Bimatching
Unsolved.
题意:
$有n个男生和m个女生,一个男生要找两个女生组成一个三元祖进行跳舞$
$当且仅当那个男生同时喜欢另两个女生的时候,他们可以组成三元祖跳舞$
$求最多的三元祖个数$
C:Cactus Search
Unsolved.
D:Distance Sum
Unsolved.
题意:
给出一张无向图,求$\sum_{1 <= i <= n} \sum_{1 <= j <= i} d(i, j) $
E:Easy Chess
Solved.
题意:
从左下角出发到右上角,每个点只能停留一次,且必须停留n次
给出方案
思路:
暴力构造
最后一轮的时候注意绕一个圈
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int n; 6 7 int main() 8 { 9 while(~scanf("%d", &n)) 10 { 11 if(n == 2) 12 cout << "a1 h1 h8" << endl; 13 else if(n == 3) 14 cout << "a1 a2 h2 h8" << endl; 15 else if(n == 4) 16 cout << "a1 a2 a3 h3 h8" << endl; 17 else if(n == 5) 18 cout << "a1 a2 a3 a4 h4 h8" << endl; 19 else if(n == 6) 20 cout << "a1 a2 a3 a4 a5 h5 h8" << endl; 21 else if(n == 7) 22 cout << "a1 a2 a3 a4 a5 a6 h6 h8" << endl; 23 else if(n == 8) 24 cout << "a1 a2 a3 a4 a5 a6 a7 h7 h8" << endl; 25 else if(n == 9) 26 cout << "a1 a2 a3 a4 a5 a6 a7 a8 g8 h8" << endl; 27 else if(n == 10) 28 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 g8 h8" << endl; 29 else if(n == 11) 30 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 h7 h8" << endl; 31 else if(n == 12) 32 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 h6 h8" << endl; 33 else if(n == 13) 34 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 h5 h8" << endl; 35 else if(n == 14) 36 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 h4 h8" << endl; 37 else if(n == 15) 38 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 h3 h8" << endl; 39 else if(n == 16) 40 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 h2 h8" << endl; 41 else if(n == 17) 42 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 h1 h8" << endl; 43 else if(n == 18) 44 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 h1 h8" << endl; 45 else if(n == 19) 46 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 h2 h8" << endl; 47 else if(n == 20) 48 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 h3 h8" << endl; 49 else if(n == 21) 50 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 h4 h8" << endl; 51 else if(n == 22) 52 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 h5 h8" << endl; 53 else if(n == 23) 54 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 h6 h8" << endl; 55 else if(n == 24) 56 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 h7 h8" << endl; 57 else if(n == 25) 58 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 g8 h8" << endl; 59 else if(n == 26) 60 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 g8 h8" << endl; 61 else if(n == 27) 62 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 h7 h8" << endl; 63 else if(n == 28) 64 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 h6 h8" << endl; 65 else if(n == 29) 66 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 h5 h8" << endl; 67 else if(n == 30) 68 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 h4 h8" << endl; 69 else if(n == 31) 70 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 h3 h8" << endl; 71 else if(n == 32) 72 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 h2 h8" << endl; 73 else if(n == 33) 74 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 h1 h8" << endl; 75 else if(n == 34) 76 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 h1 h8" << endl; 77 else if(n == 35) 78 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 h2 h8" << endl; 79 else if(n == 36) 80 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 h3 h8" << endl; 81 else if(n == 37) 82 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 h4 h8" << endl; 83 else if(n == 38) 84 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 h5 h8" << endl; 85 else if(n == 39) 86 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 h6 h8" << endl; 87 else if(n == 40) 88 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 h7 h8" << endl; 89 else if(n == 41) 90 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 g8 h8" << endl; 91 else if(n == 42) 92 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 g8 h8" << endl; 93 else if(n == 43) 94 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 h7 h8" << endl; 95 else if(n == 44) 96 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 h6 h8" << endl; 97 else if(n == 45) 98 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 h5 h8" << endl; 99 else if(n == 46) 100 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 h4 h8" << endl; 101 else if(n == 47) 102 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 h3 h8" << endl; 103 else if(n == 48) 104 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 h2 h8" << endl; 105 else if(n == 49) 106 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h8" << endl; 107 else if(n == 50) 108 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h8" << endl; 109 else if(n == 51) 110 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h8" << endl; 111 else if(n == 52) 112 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h8" << endl; 113 else if(n == 53) 114 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h8" << endl; 115 else if(n == 54) 116 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h8" << endl; 117 else if(n == 55) 118 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 h8" << endl; 119 else if(n == 56) 120 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 g5 g6 g8 h8" << endl; 121 else if(n == 57) 122 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 g5 g6 g7 g8 h8" << endl; 123 else if(n == 58) 124 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g8 h8" << endl; 125 else if(n == 59) 126 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g2 g8 h8" << endl; 127 else if(n == 60) 128 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g2 g3 g8 h8" << endl; 129 else if(n == 61) 130 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g2 g3 g4 g8 h8" << endl; 131 else if(n == 62) 132 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g2 g3 g4 g5 g8 h8" << endl; 133 else if(n == 63) 134 cout << "a1 a2 a3 a4 a5 a6 a7 a8 b8 b7 b6 b5 b4 b3 b2 b1 c1 c2 c3 c4 c5 c6 c7 c8 d8 d7 d6 d5 d4 d3 d2 d1 e1 e2 e3 e4 e5 e6 e7 e8 f8 f7 f6 f5 f4 f3 f2 f1 h1 h2 h3 h4 h5 h6 h7 g7 g1 g2 g3 g4 g5 g6 g8 h8" << endl; 135 } 136 return 0; 137 }
F. Fractions
Solved.
题意:
$令b_i为n的因数$
$求找到k对 a_i 和 b_i$
使得
$\sum_{i = 1}^{k} \frac {a_i}{b_i} = 1 - \frac{1}{n}$
思路:
显然,我们只需要找到两对
令其为$a_1, b_1, a_2, b_2$
有$\frac{a_1}{b_1} + \frac{a_2}{b_2} = \frac{n - 1}{n}$
有$\frac{a_1 \cdot b_2 + a_2 \cdot b_1} {b_1 \cdot b_2} = \frac{n - 1}{n}$
有 $n = b_1 \cdot b_2$
那么$b_1 = \frac{n}{b_2}$
代入其中 得到
$a_1 \cdot b_2 + \frac{a_2 \cdot n} {b_2} = n - 1$
$固定b_2 枚举a_1 求解 或者 exgcd 也可以$
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 typedef long long ll; 6 7 ll n; 8 9 int main() 10 { 11 while(~scanf("%lld", &n)) 12 { 13 ll tmp = n; 14 vector<ll>vec; 15 for(ll i = 2; i * i <= tmp; ++i) 16 { 17 if(tmp % i == 0) 18 { 19 ll res = 1; 20 while(tmp % i == 0) 21 { 22 tmp /= i; 23 res *= i; 24 } 25 vec.push_back(res); 26 } 27 } 28 if(tmp != 1) vec.push_back(tmp); 29 if(vec.size() <= 1) 30 { 31 puts("NO"); 32 } 33 else 34 { 35 puts("YES\n2"); 36 ll num1 = vec[0]; 37 for(ll i = 1; ; ++i) 38 { 39 ll num2 = n - 1 - n / num1 * i; 40 if(num2 % num1 == 0) 41 { 42 printf("%lld %lld\n", i, num1); 43 printf("%lld %lld\n", num2 / num1 , n / num1); 44 break; 45 } 46 } 47 } 48 } 49 return 0; 50 }
G. Guest Student
Water.
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 typedef long long ll; 6 const int INF = 0x3f3f3f3f; 7 ll n; 8 int used[20]; 9 10 int main() 11 { 12 int t; 13 scanf("%d", &t); 14 while(t--) 15 { 16 ll tot = 0; 17 scanf("%lld", &n); 18 for(int i = 1; i <= 7; ++i) 19 { 20 scanf("%d", used + i); 21 tot += used[i]; 22 used[i + 7] = used[i]; 23 } 24 ll tmp = (n - 1) / tot; 25 ll ans = 7 * tmp; 26 ll remind = n - tmp * tot; 27 ll res = INF; 28 for(int i = 1; i <= 7; ++i) 29 { 30 if(used[i]) 31 { 32 ll pos = i; 33 ll tmp = 0; 34 while(tmp < remind) tmp += used[pos++]; 35 res = min(res, pos - i); 36 } 37 } 38 printf("%lld\n", ans + res); 39 } 40 return 0; 41 }
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INF 0x3f3f3f3f 5 int used[20], fa[20]; 6 int t, n; 7 8 int main() 9 { 10 scanf("%d", &t); 11 while (t--) 12 { 13 scanf("%d", &n); 14 memset(used, 0, sizeof used); 15 memset(fa, 0, sizeof fa); 16 int tot = 0; 17 int pre = 0; 18 for (int i = 1; i <= 7; ++i) 19 { 20 scanf("%d", used + i); 21 tot += used[i]; 22 fa[i] = pre; 23 if (used[i]) pre = i; 24 } 25 for (int i = 8; i <= 14; ++i) used[i] = used[i - 7]; 26 int remind = n % tot, need = (remind ? n / tot : n / tot - 1) * 7, res = INF; 27 if (!remind) remind = tot; 28 for (int i = 1; i <= 14; ++i) if (used[i]) 29 { 30 int cnt = 0, tmp = 0; 31 for (int j = i; j <= 14 && cnt < remind; ++j) 32 { 33 cnt += used[j]; 34 ++tmp; 35 } 36 if (cnt == remind) res = min(res, need + tmp); 37 } 38 printf("%d\n", res); 39 } 40 return 0; 41 }
H:Harder Satisfiability
Unsolved.
I. Interval-Free Permutations
Unsolved.
J. JS Minification
Unsolved.
K. King Kog's Reception
Upsoved.
题意:
维护一个队列,骑士在$a_i时刻进入,并且占用b_i的时间, 求从t_i时刻进入需要等待多少时间才能轮到$
思路:
发现$t_i完事的时间为Max_j <= i(a_j + \sum_{j <= k <= i} b_i)$ 然后线段树维护
置于为什么是这样
我们考虑如果我们选取的$a_j 到 a_i 中间有空白时间段的话,那么后移j肯定使得值更优$
$否则有重叠部分的话,不会有问题$
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define ll long long 5 #define N 1000010 6 int q; 7 int p[N], v[N]; 8 9 namespace SEG 10 { 11 struct node 12 { 13 ll sum, Max; 14 node () 15 { 16 sum = Max = 0; 17 } 18 node operator + (const node &other) const 19 { 20 node res; 21 res.sum = sum + other.sum; 22 res.Max = max(other.Max, Max + other.sum); 23 return res; 24 } 25 }a[N << 2], res; 26 void build(int id, int l, int r) 27 { 28 a[id] = node(); 29 if (l == r) 30 { 31 a[id].sum = 0; 32 a[id].Max = l; 33 return; 34 } 35 int mid = (l + r) >> 1; 36 build(id << 1, l, mid); 37 build(id << 1 | 1, mid + 1, r); 38 a[id] = a[id << 1] + a[id << 1 | 1]; 39 } 40 void update(int id, int l, int r, int pos, int val) 41 { 42 if (l == r) 43 { 44 a[id].sum += val; 45 a[id].Max += val; 46 return; 47 } 48 int mid = (l + r) >> 1; 49 if (pos <= mid) update(id << 1, l, mid, pos, val); 50 else update(id << 1 | 1, mid + 1, r, pos, val); 51 a[id] = a[id << 1] + a[id << 1 | 1]; 52 } 53 void query(int id, int l, int r, int ql, int qr) 54 { 55 if (l >= ql && r <= qr) 56 { 57 res = res + a[id]; 58 return; 59 } 60 int mid = (l + r) >> 1; 61 if (ql <= mid) query(id << 1, l, mid, ql, qr); 62 if (qr > mid) query(id << 1 | 1, mid + 1, r, ql, qr); 63 } 64 } 65 66 int main() 67 { 68 while (scanf("%d", &q) != EOF) 69 { 70 SEG::build(1, 1, 1000000); 71 char op; int x, y; 72 for (int i = 1; i <= q; ++i) 73 { 74 scanf(" %c%d", &op, p + i); 75 if (op == '+') 76 { 77 scanf("%d", v + i); 78 SEG::update(1, 1, 1000000, p[i], v[i]); 79 } 80 else if (op == '-') 81 SEG::update(1, 1, 1000000, p[p[i]], -v[p[i]]); 82 else 83 { 84 SEG::res = SEG::node(); 85 SEG::query(1, 1, 1000000, 1, p[i]); 86 printf("%lld\n", SEG::res.Max - p[i]); 87 } 88 } 89 } 90 return 0; 91 }
L. Lazyland
Water.
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 typedef long long ll; 6 7 const int maxn = 1e5 + 10; 8 9 int n, k; 10 ll vis[maxn]; 11 ll arr[maxn], brr[maxn]; 12 13 int main() 14 { 15 while(~scanf("%d %d", &n, &k)) 16 { 17 for(int i = 1; i <= k; ++i) vis[i] = -1; 18 for(int i = 1; i <= n; ++i) scanf("%lld", arr + i); 19 for(int i = 1; i <= n; ++i) scanf("%lld", brr + i); 20 priority_queue<ll, vector<ll>, greater<ll> >q; 21 int cnt = 0; 22 for(int i = 1; i <= n; ++i) 23 { 24 if(vis[arr[i]] == -1) 25 { 26 cnt++; 27 vis[arr[i]] = i; 28 } 29 else 30 { 31 ll tmp = brr[vis[arr[i]]]; 32 if(tmp < brr[i]) 33 { 34 q.push(tmp); 35 vis[arr[i]] = i; 36 } 37 else 38 { 39 q.push(brr[i]); 40 } 41 } 42 } 43 ll ans = 0; 44 for(int i = cnt + 1; i <= k; ++i) 45 { 46 ans += q.top();q.pop(); 47 } 48 printf("%lld\n", ans); 49 } 50 return 0; 51 }
M:Minegraphed
Upsolved.
题意:
构造一个矩形,使得点的连通性和所给的图一致
思路:
用一个三层的图,一个 $(3 \cdot n - 2) * 3 的截面 第三层用小沟单向连接$
$有多少条边就增加多少小沟,注意用一条横线隔开,前面预留2行为数字$
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define N 1010 5 int n, m, G[20][20]; 6 char ans[N], tmp[N]; 7 8 int main() 9 { 10 int n; 11 while (scanf("%d", &n) != EOF) 12 { 13 int w = 3 * n - 2, m = 0; 14 for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) scanf("%d", G[i] + j), m += G[i][j]; 15 printf("%d %d %d\n", w, (m << 1) + 2, 3); 16 for (int i = 1; i <= w; ++i) tmp[i] = '#'; tmp[w + 1] = 0; 17 puts(tmp + 1); puts(tmp + 1); 18 for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (G[i][j]) 19 { 20 puts(tmp + 1); 21 memcpy(ans, tmp, sizeof tmp); 22 int l = (i - 1) * 3 + 1, r = (j - 1) * 3 + 1; 23 if (l > r) swap(l, r); 24 for (int k = l; k <= r; ++k) ans[k] = '.'; 25 puts(ans + 1); 26 } 27 puts(""); 28 puts(tmp + 1); 29 puts(tmp + 1); 30 for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (G[i][j]) 31 { 32 puts(tmp + 1); 33 memcpy(ans, tmp, sizeof tmp); 34 int l = (i - 1) * 3 + 1, r = (j - 1) * 3 + 1; 35 ans[l] = ans[r] = '.'; 36 if (l < r) ans[l + 1] = '.'; 37 else ans[l - 1] = '.'; 38 puts(ans + 1); 39 } 40 puts(""); 41 memcpy(ans, tmp, sizeof tmp); 42 for (int i = 1, j = 1; i <= w; i += 3, ++j) ans[i] = j + '0', tmp[i] = '.'; 43 puts(ans + 1); 44 puts(tmp + 1); 45 for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (G[i][j]) 46 puts(tmp + 1), puts(tmp + 1); 47 } 48 return 0; 49 }