原标题应该叫“SCUT五四青年节软件集训队快乐训练赛”。本来应该很快乐才对,但是没想到毒瘤BPM136居然挑了套区域赛题(虽然不是很难),而且队友基本有事导致变成个人solo,这就非常不快乐了。
而且题风有点诡异,做完四道签到之后剩下的要么看不懂要么就是各种dp。
题目链接:http://codeforces.com/gym/100543
C:
一点意思都没有的签到题,因为没留意爆了int交了三发wa。

1 /* basic header */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <string> 6 #include <cstring> 7 #include <cmath> 8 #include <cstdint> 9 #include <climits> 10 #include <float.h> 11 /* STL */ 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <queue> 16 #include <stack> 17 #include <algorithm> 18 #include <array> 19 #include <iterator> 20 /* define */ 21 #define ll long long 22 #define dou double 23 #define pb emplace_back 24 #define mp make_pair 25 #define fir first 26 #define sec second 27 #define sot(a,b) sort(a+1,a+1+b) 28 #define rep1(i,a,b) for(int i=a;i<=b;++i) 29 #define rep0(i,a,b) for(int i=a;i<b;++i) 30 #define repa(i,a) for(auto &i:a) 31 #define eps 1e-8 32 #define int_inf 0x3f3f3f3f 33 #define ll_inf 0x7f7f7f7f7f7f7f7f 34 #define lson curPos<<1 35 #define rson curPos<<1|1 36 /* namespace */ 37 using namespace std; 38 /* header end */ 39 40 const int maxn = 1e5 + 10; 41 ll a[maxn]; 42 43 void init() 44 { 45 rep0(i, 1, 1e5) 46 a[i] = (ll)i * (ll)(i - 1) / 2; 47 } 48 49 int main() 50 { 51 init(); 52 int t; cin >> t; 53 while (t--) 54 { 55 ll n; cin >> n; 56 int flag = 0; 57 rep0(i, 2, 100000) 58 { 59 if (a[i] < n && (n - a[i]) % (ll)i == 0) 60 { 61 cout << n << " = "; 62 int pos = (n - a[i]) / (ll)i; 63 rep0(j, 0, i) 64 { 65 if (j) cout << " + "; 66 cout << pos + (ll)j; 67 } 68 flag = 1; 69 break; 70 } 71 } 72 if (!flag) cout << "IMPOSSIBLE" << endl; 73 else cout << endl; 74 } 75 return 0; 76 }
D:
问轮子转动状态的物理题,也很签到。

1 /* basic header */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <string> 6 #include <cstring> 7 #include <cmath> 8 #include <cstdint> 9 #include <climits> 10 #include <float.h> 11 /* STL */ 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <queue> 16 #include <stack> 17 #include <algorithm> 18 #include <array> 19 #include <iterator> 20 /* define */ 21 #define ll long long 22 #define dou double 23 #define pb emplace_back 24 #define mp make_pair 25 #define fir first 26 #define sec second 27 #define sot(a,b) sort(a+1,a+1+b) 28 #define rep1(i,a,b) for(int i=a;i<=b;++i) 29 #define rep0(i,a,b) for(int i=a;i<b;++i) 30 #define repa(i,a) for(auto &i:a) 31 #define eps 1e-8 32 #define int_inf 0x3f3f3f3f 33 #define ll_inf 0x7f7f7f7f7f7f7f7f 34 #define lson curPos<<1 35 #define rson curPos<<1|1 36 /* namespace */ 37 using namespace std; 38 /* header end */ 39 40 struct Node 41 { 42 int x, y, r, q, frac, nume; 43 }; 44 45 const int maxn = 1e4 + 10; 46 Node wheel[maxn]; 47 queue<int>q; 48 int vis[maxn]; 49 50 int check(int p, int q) 51 { 52 if ((wheel[p].x - wheel[q].x) * (wheel[p].x - wheel[q].x) + (wheel[p].y - wheel[q].y) * (wheel[p].y - wheel[q].y) == (wheel[p].r + wheel[q].r) * (wheel[p].r + wheel[q].r)) 53 return 1; 54 else return 0; 55 } 56 57 int main() 58 { 59 while (!q.empty()) q.pop(); 60 int t; scanf("%d", &t); 61 while (t--) 62 { 63 int n; scanf("%d", &n); 64 rep1(i, 1, n) 65 { 66 vis[i] = 0; 67 scanf("%d%d%d", &wheel[i].x, &wheel[i].y, &wheel[i].r); 68 wheel[i].frac = wheel[i].nume = 1; wheel[i].q = i == 1 ? 1 : 0; 69 } 70 q.push(1); 71 while (!q.empty()) 72 { 73 int curr = q.front(); q.pop(); 74 if (vis[curr]) continue; 75 vis[curr] = 1; 76 rep1(i, 1, n) 77 { 78 if (vis[i]) continue; 79 if (check(i, curr)) 80 { 81 wheel[i].q = -wheel[curr].q; 82 wheel[i].frac = wheel[curr].frac * wheel[curr].r; 83 wheel[i].nume = wheel[curr].nume * wheel[i].r; 84 int gcd = __gcd(wheel[i].frac, wheel[i].nume); 85 wheel[i].frac /= gcd, wheel[i].nume /= gcd; 86 q.push(i); 87 } 88 } 89 } 90 rep1(i, 1, n) 91 if (!wheel[i].q) puts("not moving"); 92 else if (wheel[i].q == 1) 93 { 94 printf("%d", wheel[i].frac); 95 if (wheel[i].nume != 1) printf("/%d", wheel[i].nume); 96 puts(" clockwise"); 97 } 98 else 99 { 100 printf("%d", wheel[i].frac); 101 if (wheel[i].nume != 1) printf("/%d", wheel[i].nume); 102 puts(" counterclockwise"); 103 } 104 } 105 return 0; 106 }
H:
因为数字长度有限制,所以可以dfs预处理一遍所有可行的数字,于是变成傻逼题。

1 /* basic header */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <string> 6 #include <cstring> 7 #include <cmath> 8 #include <cstdint> 9 #include <climits> 10 #include <float.h> 11 /* STL */ 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <queue> 16 #include <stack> 17 #include <algorithm> 18 #include <array> 19 #include <iterator> 20 /* define */ 21 #define ll long long 22 #define dou double 23 #define pb emplace_back 24 #define mp make_pair 25 #define fir first 26 #define sec second 27 #define sot(a,b) sort(a+1,a+1+b) 28 #define rep1(i,a,b) for(int i=a;i<=b;++i) 29 #define rep0(i,a,b) for(int i=a;i<b;++i) 30 #define repa(i,a) for(auto &i:a) 31 #define eps 1e-8 32 #define int_inf 0x3f3f3f3f 33 #define ll_inf 0x7f7f7f7f7f7f7f7f 34 #define lson curPos<<1 35 #define rson curPos<<1|1 36 /* namespace */ 37 using namespace std; 38 /* header end */ 39 40 set<int>num; 41 vector<int>v[10]; 42 const int px[] = {4, 1, 1, 1, 2, 2, 2, 3, 3, 3}; 43 const int py[] = {2, 1, 2, 3, 1, 2, 3, 1, 2, 3}; 44 45 void dfs(int curDig, int curNum, int len) 46 { 47 curNum += curDig; num.insert(curNum); 48 if (len > 3) return; 49 rep0(i, 0, v[curDig].size()) 50 dfs(v[curDig][i], curNum * 10, len + 1); 51 } 52 53 int main() 54 { 55 rep1(i, 0, 9) 56 { 57 rep1(j, 0, 9) 58 if (px[i] <= px[j] && py[i] <= py[j]) 59 v[i].pb(j); 60 } 61 rep1(i, 0, 9) dfs(i, 0, 0); 62 int t; scanf("%d", &t); 63 while (t--) 64 { 65 int n; scanf("%d", &n); 66 set<int>::iterator it = num.lower_bound(n); 67 int a = *it; 68 if (it != num.begin()) 69 { 70 int b = *(--it); 71 if (n - b < a - n) a = b; 72 } 73 printf("%d ", a); 74 } 75 return 0; 76 }
I:
注意一下没有W或没有B的情况就好了。

1 /* basic header */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <string> 6 #include <cstring> 7 #include <cmath> 8 #include <cstdint> 9 #include <climits> 10 #include <float.h> 11 /* STL */ 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <queue> 16 #include <stack> 17 #include <algorithm> 18 #include <array> 19 #include <iterator> 20 /* define */ 21 #define ll long long 22 #define dou double 23 #define pb emplace_back 24 #define mp make_pair 25 #define fir first 26 #define sec second 27 #define sot(a,b) sort(a+1,a+1+b) 28 #define rep1(i,a,b) for(int i=a;i<=b;++i) 29 #define rep0(i,a,b) for(int i=a;i<b;++i) 30 #define repa(i,a) for(auto &i:a) 31 #define eps 1e-8 32 #define int_inf 0x3f3f3f3f 33 #define ll_inf 0x7f7f7f7f7f7f7f7f 34 #define lson curPos<<1 35 #define rson curPos<<1|1 36 /* namespace */ 37 using namespace std; 38 /* header end */ 39 40 const int maxn = 1e5 + 10; 41 char s[maxn][1]; 42 int a[maxn], n; 43 44 int main() 45 { 46 int t; scanf("%d", &t); 47 while (t--) 48 { 49 scanf("%d", &n); 50 ll numW = 0, numB = 0; 51 rep0(i, 0, n) 52 { 53 scanf("%d%s", &a[i], s[i]); 54 if (s[i][0] == 'W') numW += a[i]; 55 else numB += a[i]; 56 } 57 if (!numW) printf("%lld ", numB); 58 else if (!numB) printf("%lld ", numW); 59 else 60 { 61 int ans = 0; ll gcd = __gcd(numW, numB), lastW = 0, lastB = 0; 62 numW /= gcd, numB /= gcd; 63 rep0(i, 0, n) 64 if (s[i][0] == 'W') 65 { 66 if (!(lastB % numB)) 67 { 68 if ((lastW + a[i]) / numW >= lastB / numB && lastW / numW < lastB / numB) ans++; 69 } 70 lastW += a[i]; 71 } 72 else 73 { 74 if (!(lastW % numW)) 75 { 76 if ((lastB + a[i]) / numB >= lastW / numW && lastB / numB < lastW / numW) ans++; 77 } 78 lastB += a[i]; 79 } 80 printf("%d ", ans); 81 } 82 } 83 return 0; 84 }
K:
还算简单的dp。定义二维数组dp,第一维是从第i个物品到最后一个物品,第二维是还剩多少次魔法使用次数。dp[i][j]代表可获取的最大价值。
显然倒着处理就完事了。我居然把dp[i+1][j-1]写成dp[i+1][j]导致wa了一发,真的dd。

1 /* basic header */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <string> 6 #include <cstring> 7 #include <cmath> 8 #include <cstdint> 9 #include <climits> 10 #include <float.h> 11 /* STL */ 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <queue> 16 #include <stack> 17 #include <algorithm> 18 #include <array> 19 #include <iterator> 20 /* define */ 21 #define ll long long 22 #define dou double 23 #define pb emplace_back 24 #define mp make_pair 25 #define fir first 26 #define sec second 27 #define sot(a,b) sort(a+1,a+1+b) 28 #define rep1(i,a,b) for(int i=a;i<=b;++i) 29 #define rep0(i,a,b) for(int i=a;i<b;++i) 30 #define repa(i,a) for(auto &i:a) 31 #define eps 1e-8 32 #define int_inf 0x3f3f3f3f 33 #define ll_inf 0x7f7f7f7f7f7f7f7f 34 #define lson curPos<<1 35 #define rson curPos<<1|1 36 /* namespace */ 37 using namespace std; 38 /* header end */ 39 40 struct Item 41 { 42 int c, v; 43 bool operator<(const Item &rhs) const 44 { 45 return v < rhs.v; 46 } 47 }; 48 const int maxn = 150000 + 10; 49 Item item[maxn]; 50 int n, k, dp[maxn][11]; 51 //dp[i][j]: max benefit 52 //first dir: from Ith to Nth items 53 //second dir: remain J times to use magic 54 //dp[1][k] should be answer 55 56 int main() 57 { 58 int t; scanf("%d", &t); 59 while (t--) 60 { 61 scanf("%d%d", &n, &k); 62 rep1(i, 1, n) scanf("%d%d", &item[i].v, &item[i].c); 63 sot(item, n); 64 //init 65 rep1(i, 0, k) dp[n + 1][i] = 0; 66 for (int i = n; i >= 1; i--) 67 for (int j = 0; j <= k; j++) 68 { 69 if (!j) //border 70 dp[i][j] = max(dp[i + 1][j], item[i].v - item[i].c); 71 else //compare two situations: use or not use magic 72 dp[i][j] = max(dp[i + 1][j], min(item[i].v - item[i].c, dp[i + 1][j - 1] - item[i].c)); //fuck 73 } 74 printf("%d ", dp[1][k]); 75 } 76 return 0; 77 }
剩下的题:
E:貌似可以用数据结构搞搞?没想法。
F:貌似是个dp+组合数+逆元。
L:题目意思是有n个敌人,在第ai个时刻会出现在距离你ci的位置(不会移动),他必须在第bi个时刻(或之前)被消灭。你有一把武器,每次启动可以以代价D消灭距离<=D以内的所有敌人。问消灭所有敌人所需最小代价。
一看就是区间dp (不想动了,丢给队友
看了没想法 || 看不懂,以后再补 (咕咕咕