开学前最后一场训练了,努力搞了个8题,还算可以。就是这场题没多少我能做的,只切了两道题。
题目链接:https://codeforces.com/gym/102428
D:
solver:czq
题意就是二维平面上有n颗恒星,每颗恒星有一个固定亮度。问:是否存在一条直线,从平面的一端扫到另一端,满足:对于任意两颗恒星S和T,如果S亮度大于T,那么S一定在T之前或者跟T一起同时被直线扫到。只需输出Y或N。
构造一下Y和N的例子你就会发现,对于所有亮度不同的恒星,从亮度高的恒星指向亮度低的恒星,这样我们就得到若干条向量。若答案为Y,那么必然存在一对向量,平行且方向相反,而且如果我们把所有的向量极角排序,这对平行的向量位置相邻。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define pb emplace_back 6 #define mp make_pair 7 #define eps 1e-8 8 #define lson (curpos<<1) 9 #define rson (curpos<<1|1) 10 /* namespace */ 11 using namespace std; 12 /* header end */ 13 14 const double pi = acos(-1); 15 const int maxn = 2020; 16 17 struct Star { 18 int x, y, b; 19 } star[maxn]; 20 vector<double>k; 21 int n; 22 23 double getRad(int x, int y) { 24 if (!y) return x > 0 ? 0 : pi; 25 if (!x) return y > 0 ? pi / 2 : -pi / 2; 26 double ans = atan(double(y) / x); 27 return x > 0 ? ans : ans + pi; 28 } 29 30 bool check() { 31 if (k.size() < 2) return true; 32 double last = k.back() - pi * 2; 33 for (auto x : k) { 34 if (pi - x + last <= eps) return true; 35 last = x; 36 } 37 return false; 38 } 39 40 int main() { 41 scanf("%d", &n); 42 for (int i = 0; i < n; i++) { 43 scanf("%d%d%d", &star[i].x, &star[i].y, &star[i].b); 44 for (int j = 0; j < i; j++) { 45 if (star[i].b > star[j].b) k.pb(getRad(star[i].x - star[j].x, star[i].y - star[j].y)); 46 else if (star[i].b < star[j].b) k.pb(getRad(star[j].x - star[i].x, star[j].y - star[i].y)); 47 } 48 } 49 sort(k.begin(), k.end()); 50 if (check()) puts("Y"); else puts("N"); 51 return 0; 52 }
E:
solver:lzh
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ff first 4 #define ss second 5 typedef long long ll; 6 typedef pair<int, int> pii; 7 8 char s[200010]; 9 int a[200010]; 10 int main() { 11 int m; 12 scanf("%s%d", s + 1, &m); 13 int n = strlen(s + 1); 14 for (int i = 1; i <= n; i++) 15 s[i + n] = s[i]; 16 for (int i = 1; i <= 2 * n; i++) 17 if (s[i] == 'E') 18 a[++a[0]] = i; 19 if (!a[0]) { 20 printf("0\n"); 21 return 0; 22 } 23 int last = 1; 24 ll ans = 0; 25 for (int i = 1; i <= n; i++) { 26 if (a[last] < i && last <= a[0]) 27 last++; 28 if (last > a[0]) 29 break; 30 ans += max(0, i + m - a[last]); 31 } 32 printf("%lld\n", ans); 33 }
F:
solver:lzh、zyh
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ff first 4 #define ss second 5 typedef long long ll; 6 typedef pair<int, int> pii; 7 8 ll a[5010][5010]; 9 const int mod = 1e9 + 7; 10 int main() { 11 int n, m; 12 scanf("%d%d", &n, &m); 13 if (n == 1) 14 printf("1\n"); 15 else if (n == 2) 16 printf("%d\n", m - 1); 17 else { 18 for (int i = 1; i <= 5000; i++) 19 a[1][i] = 1, a[2][i] = i - 1; 20 for (int i = 3; i <= n; i++) 21 for (int j = i; j <= m; j++) { 22 int tmp = j - 1; 23 while (tmp > 0) { 24 a[i][j] = (a[i][j] + a[i - 1][tmp] * 2 % mod - a[i - 2][tmp - 1] + mod) % mod; 25 tmp -= i; 26 } 27 } 28 printf("%lld\n", a[n][m]); 29 } 30 }