开学前最后一场训练了,努力搞了个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 }
View Code

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 }
View Code

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 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-06-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-04
相关资源
相似解决方案