UFPE Starters Final Try-Outs 2020

题目很简单。差点10题,非常可惜。


A:

签到题+4不应该。

solver:lzh

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int, int> pii;
 4 typedef long long ll;
 5 #define ff first
 6 #define ss second
 7 
 8 const int MAXSTRLEN = 500010;
 9 int maxlen0 = 0, maxlen1 = 0;
10 char ch[2 * MAXSTRLEN];
11 int p[2 * MAXSTRLEN];
12 void manacher(char str[], int len) {
13     for (int i = 0; i < len; i++) {
14         ch[2 * i + 1] = '#';
15         ch[2 * i + 2] = str[i];
16     }
17     ch[0] = '$';
18     ch[2 * len + 1] = '#';
19     ch[2 * len + 2] = '';
20     len = len * 2 + 2;
21     p[0] = p[1] = 1;
22     int id = 1, mx = 2;
23     for (int i = 2; i < len; i++) {
24         int j = min(p[2 * id - i], mx - i);
25         while (ch[i - j] == ch[i + j])
26             j++;
27         p[i] = j;
28         if (i + p[i] > mx) {
29             id = i;
30             mx = i + p[i];
31         }
32         if ((p[i] - 1) % 2 == 0)
33             maxlen0 = max(maxlen0, p[i] - 1);
34         else
35             maxlen1 = max(maxlen1, p[i] - 1);
36     }
37 }
38 char s[MAXSTRLEN];
39 int main() {
40     int n, m;
41     scanf("%d%d%s", &n, &m, s);
42     manacher(s, n);
43     if ((m % 2 == 0 && maxlen0 >= m) || (m % 2 == 1 && maxlen1 >= m)) {
44         printf("Accept
");
45     } else
46         printf("Reject
");
47 }
View Code

B:

solver:zyh、czq

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 struct Segment_Tree {
 4     //constants and innerclass
 5     struct node {
 6         int l, r, lc, rc;
 7         long long val;
 8     };
 9     static const int N = 500000;
10     static const int root = 0;
11 
12     //variables
13     int num;
14     node tr[2 * N];
15 
16     //methods
17     void setRange(int l, int r, int now = root) {
18         num = 0;
19         build(l, r, now);
20     }
21     void build(int l, int r, int now) {
22         tr[now].l = l; tr[now].r = r; tr[now].val = 0;
23         if (l < r) {
24             int mid = (l + r) >> 1;
25             ++num; tr[now].lc = num;
26             ++num; tr[now].rc = num;
27             build(l, mid, tr[now].lc);
28             build(mid + 1, r, tr[now].rc);
29         }
30     }
31 
32     void pushup(node &f, node &lc, node &rc) {
33         f.val = lc.val + rc.val;
34     }
35 
36     //warning: don't invoke both update and updateR in single segment tree, it may cause error
37     void update(int pos, long long val, int now = root) {
38         int mid = (tr[now].l + tr[now].r) >> 1;
39         if (tr[now].l == tr[now].r) {
40             tr[now].val = val;
41             return;
42         } else if (pos <= mid) update(pos, val, tr[now].lc);
43         else update(pos, val, tr[now].rc);
44         //write parent update here
45         pushup(tr[now], tr[tr[now].lc], tr[tr[now].rc]);
46     }
47 
48     long long query(int l, int r, int now = root) {
49         if (tr[now].l == l && tr[now].r == r) return tr[now].val;
50         else {
51             //if (tr[now].cover!=0) pushdown(tr[now],tr[tr[now].lc],tr[tr[now].rc]);
52             int mid = (tr[now].l + tr[now].r) >> 1;
53             if (r <= mid) return query(l, r, tr[now].lc);
54             else if (l > mid) return query(l, r, tr[now].rc);
55             else return query(l, mid, tr[now].lc) + query(mid + 1, r, tr[now].rc);
56         }
57     }
58 
59 };
60 Segment_Tree tr;
61 map<string, long long> Map;
62 string str[1000001];
63 char ch[10001];
64 int main() {
65     int n, m, q;
66     scanf("%d%d%d", &n, &m, &q);
67     for (int i = 1; i <= n; ++i) {
68         scanf("%s", ch);
69         str[i] = ch;
70     }
71     for (int i = 0; i < m; ++i) {
72         long long v;
73         scanf("%s%lld", ch, &v);
74         Map[string(ch)] = v;
75     }
76     tr.setRange(1, n);
77     for (int i = 1; i <= n; ++i) {
78         tr.update(i, Map[str[i]]);
79     }
80     while (q--) {
81         int op;
82         scanf("%d", &op);
83         if (op == 1) {
84             int x;
85             scanf("%d%s", &x, ch);
86             tr.update(x, Map[string(ch)]);
87         } else {
88             int l, r;
89             scanf("%d%d", &l, &r);
90             long long s = tr.query(l, r);
91             if (s <= 30 * (r - l + 1)) printf("NO
");
92             else printf("YES
");
93         }
94     }
95 }
View Code

D:

solver:lzh、czq

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 typedef pair<double, int> pii;
 5 #define ff first
 6 #define ss second
 7 #define mp make_pair
 8 
 9 pii p[100010];
10 int check(double x, int n) {
11     int cur = 1;
12     while (cur <= n) {
13         ll add = 0;
14         while (p[cur].ff - x <= 0)
15             add += p[cur++].ss;
16         if (add == 0)
17             return 0;
18         x += add;
19     }
20     return 1;
21 }
22 int main() {
23     int n, x, y;
24     scanf("%d%d%d", &n, &x, &y);
25     for (int i = 1; i <= n; i++) {
26         int u, v, w;
27         scanf("%d%d%d", &u, &v, &w);
28         p[i] = mp(sqrt(1ll * (u - x) * (u - x) + 1ll * (v - y) * (v - y)) - w, w);
29     }
30     sort(p + 1, p + 1 + n);
31 
32     double l = max(0.0, p[1].ff), r = p[n].ff, eps = 1e-8;
33     double ans = r;
34     while (r - l > eps) {
35         double mid = (l + r) / 2.0;
36         if (check(mid, n)) {
37             r = mid;
38             ans = min(ans, mid);
39         } else
40             l = mid;
41     }
42     printf("%.10lf
", ans);
43 }
View Code

E:

solver:zyh

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int li[] = {6, 28, 496, 8128};
 4 int len = 4;
 5 inline int read() {
 6     int rnt = 0;
 7     int sign = 0;
 8     char ch = 0;
 9     while (!isdigit(ch)) {
10         sign |= ch == '-';
11         ch = getchar();
12     }
13     while (isdigit(ch)) rnt = (rnt << 3) + (rnt << 1) + (ch ^ 48), ch = getchar();
14     return sign ? -rnt : rnt;
15 }
16 inline void print(int x) {
17     if (x < 0) {
18         putchar('-');
19         x = -x;
20     }
21     if (x > 9) print(x / 10);
22     putchar(x % 10 + '0');
23 }
24 int main() {
25     int n = read();
26     while (n--) {
27         int k = read();
28         int ans;
29         for (ans = len - 1; ans >= 0; --ans)
30             if (li[ans] <= k) break;
31         if (ans < 0) print(-1);
32         else print(li[ans]);
33         putchar('
');
34     }
35 }
View Code

F:

solver:lzh

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int, int> pii;
 4 typedef long long ll;
 5 #define ff first
 6 #define ss second
 7 
 8 struct node {
 9     int l, r, h;
10     int add;
11     node() {}
12     node(int _l, int _r, int _h, int _add): l(_l), r(_r), h(_h), add(_add) {}
13 };
14 
15 const int N = 2e5 + 10;
16 int x[N];
17 ll sum[N << 2];
18 node q[N];
19 int mark[N << 2];
20 
21 void pushup(int n, int left, int right) {
22     if (mark[n])sum[n] = x[right + 1] - x[left];
23     else if (left == right)sum[n] = 0;
24     else sum[n] = sum[n << 1] + sum[n << 1 | 1];
25 }
26 
27 void pushdown(int n) {
28     mark[n << 1] += mark[n], mark[n << 1 | 1] += mark[n];
29     mark[n] = 0;
30 }
31 
32 void update(int l, int r, int add, int n, int left, int right) {
33     if (l <= left && right <= r) {
34         mark[n] += add;
35         pushup(n, left, right);
36         return;
37     }
38     int mid = left + right >> 1;
39     if (l <= mid)update(l, r, add, n << 1, left, mid);
40     if (mid < r)update(l, r, add, n << 1 | 1, mid + 1, right);
41     pushup(n, left, right);
42 }
43 
44 int main() {
45     int n;
46     scanf("%d", &n);
47     for (int i = 1; i <= n; i++) {
48         int l, r, h; scanf("%d%d%d", &l, &r, &h);
49         x[2 * i - 1] = l; x[2 * i] = r;
50         q[2 * i - 1] = node(l, r, 0, 1);
51         q[2 * i] = node(l, r, h, -1);
52     }
53     sort(x + 1, x + 1 + 2 * n);
54     sort(q + 1, q + 1 + 2 * n, [](node a, node b) {
55         return a.h < b.h;
56     });
57     int cnt = 1;
58     for (int i = 2; i <= 2 * n; i++)
59         if (x[i - 1] != x[i])x[++cnt] = x[i];
60     ll ans = 0;
61     q[2 * n + 1].h = q[2 * n].h;
62 
63     for (int i = 1; i <= 2 * n; i++) {
64         int l = lower_bound(x + 1, x + 1 + cnt, q[i].l) - x;
65         int r = lower_bound(x + 1, x + 1 + cnt, q[i].r) - x - 1;
66         update(l, r, q[i].add, 1, 1, cnt);
67         ans += sum[1] * (q[i + 1].h - q[i].h);
68     }
69     printf("%lld
", ans);
70 }
View Code

G:

solver:lzh、czq

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int, int> pii;
 4 typedef long long ll;
 5 #define ff first
 6 #define ss second
 7 
 8 map<string, int>name, prob;
 9 char strname[50010][25];
10 int pts[50010];
11 set<int>submit[50010];
12 int main() {
13     int c, p, s; scanf("%d%d%d", &c, &p, &s);
14     int cname = 0, cprob = 0;
15     char str[50];
16     for (int i = 1; i <= c; i++) {
17         scanf("%s", strname[i]);
18         name[strname[i]] = ++cname;
19     }
20     for (int i = 1; i <= p; i++) {
21         int x;
22         scanf("%s%d", str, &x);
23         prob[str] = ++cprob; pts[cprob] = x;
24     }
25     for (int i = 1; i <= s; i++) {
26         int numname = -1, numprob = -1;
27         scanf("%s", str);
28         numname = name[str];
29         scanf("%s", str);
30         numprob = prob[str];
31         scanf("%s", str);
32         if (strlen(str) == 2 && str[0] == 'A' && str[1] == 'C') {
33             if (numname && numprob) {
34                 submit[numname].insert(numprob);
35             }
36         }
37     }
38     for (int i = 1; i <= c; i++) {
39         int ans = 0;
40         for (auto j : submit[i])ans += pts[j];
41         printf("%s %d
", strname[i], ans);
42     }
43 }
View Code

H:

solver:lzh、czq

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 typedef pair<ll, int> pii;
 5 #define ff first
 6 #define ss second
 7 #define mp make_pair
 8 
 9 const int N = 1e5 + 10;
10 vector<pii> v[N];
11 int T[N], vis[N];
12 ll ans[N];
13 int main() {
14     int n, m, k;
15     scanf("%d%d%d", &n, &m, &k);
16     for (int i = 1; i <= m; i++) {
17         int x, y, z;
18         scanf("%d%d%d", &x, &y, &z);
19         v[x].push_back(mp(y, z));
20         v[y].push_back(mp(x, z));
21     }
22     for (int i = 1; i <= n; i++)
23         scanf("%d", &T[i]);
24 
25     priority_queue<pii, vector<pii>, greater<pii>> pq;
26     for (int i = 1; i <= k; i++) {
27         int x;
28         scanf("%d", &x);
29         pq.push(mp(T[x], x));
30     }
31 
32     while (!pq.empty()) {
33         pii x = pq.top();
34         pq.pop();
35         if (vis[x.ss])
36             continue;
37         vis[x.ss]++;
38         ans[x.ss] = x.ff;
39 
40         for (auto i : v[x.ss])
41             if (!vis[i.ff])
42                 pq.push(mp(x.ff + i.ss + T[i.ff], i.ff));
43     }
44     for (int i = 1; i <= n; i++)
45         printf("%lld
", ans[i]);
46 }
View Code

I:

solver:zyh、czq

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 struct point {
 4     int x, v;
 5     point() {}
 6     point(int _x, int _v) {
 7         x = _x;
 8         v = _v;
 9     }
10     bool operator<(const point &b)const {
11         return v < b.v;
12     }
13 };
14 point pts[2000000];
15 int f[2000000];
16 int Size[2000000];
17 int a[2000000];
18 int find(int u) {
19     if (f[u] != u) f[u] = find(f[u]);
20     return f[u];
21 }
22 int Union(int u, int v) {
23     u = find(u);
24     v = find(v);
25     if (u != v) {
26         Size[u] += Size[v];
27         f[v] = u;
28     }
29     return u;
30 }
31 int main() {
32     int s, n, m;
33     scanf("%d%d%d", &s, &n, &m);
34     int len = n * m;
35     for (int i = 0; i < len; ++i) {
36         scanf("%d", &a[i]);
37         pts[i] = point(i, a[i]);
38     }
39     sort(pts, pts + len);
40     for (int i = 0; i < len; ++i) {
41         f[i] = i; Size[i] = 1;
42     }
43     int maxsize = 0;
44     for (int k = len - 1; k >= 0; --k) {
45         int i = pts[k].x;
46         int v = pts[k].v;
47         if (i - 1 >= 0 && (i / m) == ((i - 1) / m) && a[i - 1] >= v) Union(i, i - 1);
48         if (i + 1 < len && (i / m) == ((i + 1) / m) && a[i + 1] >= v) Union(i, i + 1);
49         if (i + m < len && a[i + m] >= v) Union(i, i + m);
50         if (i - m >= 0 && a[i - m] >= v) Union(i, i - m);
51         maxsize = max(maxsize, Size[find(i)]);
52         if (maxsize >= s) {
53             printf("%d
", v);
54             return 0;
55         }
56     }
57 }
View Code

J:

solver:lzh

差一点就做出来了,非常难顶

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 typedef pair<int, int> pii;
  4 typedef long long ll;
  5 #define ff first
  6 #define ss second
  7 #define mp make_pair
  8 
  9 vector<pii> v[100010];
 10 ll dp[100010][10];
 11 const ll mod = 1e9 + 7;
 12 int baoli2[20][2] = { 1, 2, 1, 3, 1, 4, 1, 5, 2, 1, 2, 3, 2, 4, 2, 5, 3, 1, 3, 2, 3, 4, 3, 5, 4, 1, 4, 2, 4, 3, 4, 5, 5, 1, 5, 2, 5, 3, 5, 4 };
 13 int baoli3[60][3] = { 1, 2, 3, 1, 2, 4, 1, 2, 5, 1, 3, 2, 1, 3, 4, 1, 3, 5, 1, 4, 2, 1, 4, 3, 1, 4, 5, 1, 5, 2, 1, 5, 3, 1, 5, 4, 2, 1, 3, 2, 1, 4, 2, 1, 5, 2, 3, 1, 2, 3, 4, 2, 3, 5, 2, 4, 1, 2, 4, 3, 2, 4, 5, 2, 5, 1, 2, 5, 3, 2, 5, 4, 3, 1, 2, 3, 1, 4, 3, 1, 5, 3, 2, 1, 3, 2, 4, 3, 2, 5, 3, 4, 1, 3, 4, 2, 3, 4, 5, 3, 5, 1, 3, 5, 2, 3, 5, 4, 4, 1, 2, 4, 1, 3, 4, 1, 5, 4, 2, 1, 4, 2, 3, 4, 2, 5, 4, 3, 1, 4, 3, 2, 4, 3, 5, 4, 5, 1, 4, 5, 2, 4, 5, 3, 5, 1, 2, 5, 1, 3, 5, 1, 4, 5, 2, 1, 5, 2, 3, 5, 2, 4, 5, 3, 1, 5, 3, 2, 5, 3, 4, 5, 4, 1, 5, 4, 2, 5, 4, 3 };
 14 
 15 void dfs(int x, int pre) {
 16     int col = 0;
 17     vector<int> nex;
 18     for (auto i : v[x])
 19         if (i.ff != pre) {
 20             dfs(i.ff, x);
 21             nex.push_back(i.ff);
 22         } else
 23             col = i.ss;
 24     int sz = v[x].size();
 25     if (pre == -1)
 26         return;
 27 
 28     if (sz == 1) {
 29         if (v[x][0].ss)
 30             dp[x][v[x][0].ss] = 1;
 31         else
 32             for (int i = 1; i <= 5; i++)
 33                 dp[x][i] = 1;
 34         return;
 35     } else if (sz == 2) {
 36         for (int i = 0; i < 20; i++)
 37             if (!col || col == baoli2[i][1]) {
 38                 dp[x][baoli2[i][1]] = (dp[x][baoli2[i][1]] + dp[nex[0]][baoli2[i][0]]) % mod;
 39             }
 40     } else if (sz == 3) {
 41         for (int i = 0; i < 60; i++)
 42             if (!col || col == baoli3[i][2]) {
 43                 dp[x][baoli3[i][2]] = (dp[x][baoli3[i][2]] + dp[nex[0]][baoli3[i][0]] * dp[nex[1]][baoli3[i][1]] % mod) % mod;
 44             }
 45     } else {
 46         int a[10];
 47         for (int i = 1; i <= 5; i++)
 48             a[i] = i;
 49         do {
 50             if (!col || col == a[sz]) {
 51                 ll tmp = 1;
 52                 for (int i = 1; i <= sz - 1; i++)
 53                     tmp = tmp * dp[nex[i - 1]][a[i]] % mod;
 54 
 55                 dp[x][a[sz]] = (dp[x][a[sz]] + tmp) % mod;
 56             }
 57         } while (next_permutation(a + 1, a + 1 + 5));
 58     }
 59 }
 60 int main() {
 61     int n;
 62     scanf("%d", &n);
 63     for (int i = 1; i <= n - 1; i++) {
 64         int a, b, c;
 65         scanf("%d%d%d", &a, &b, &c);
 66         v[a].push_back(mp(b, c));
 67         v[b].push_back(mp(a, c));
 68     }
 69     for (int i = 1; i <= n; i++)
 70         if (v[i].size() > 5) {
 71             printf("0
");
 72             return 0;
 73         }
 74     if (n == 1) {
 75         printf("1
");
 76         return 0;
 77     }
 78     if (n == 2) {
 79         if (v[1][0].ss)
 80             printf("1
");
 81         else
 82             printf("5
");
 83         return 0;
 84     }
 85     dfs(1, -1);
 86 
 87     ll ans = 0;
 88     vector<int> nex;
 89     for (auto i : v[1])
 90         nex.push_back(i.ff);
 91     if (v[1].size() == 1) {
 92         for (int i = 1; i <= 5; i++) {
 93             ans = (ans + dp[nex[0]][i]) % mod;
 94         }
 95     } else if (v[1].size() == 2) {
 96         for (int i = 0; i < 20; i++) {
 97             ll tmp = 1;
 98             for (int j = 0; j < 2; j++)
 99                 tmp = tmp * dp[nex[j]][baoli2[i][j]] % mod;
100             ans = (ans + tmp) % mod;
101         }
102     } else if (v[1].size() == 3) {
103         for (int i = 0; i < 60; i++) {
104             ll tmp = 1;
105             for (int j = 0; j < 3; j++)
106                 tmp = tmp * dp[nex[j]][baoli3[i][j]] % mod;
107             ans = (ans + tmp) % mod;
108         }
109     } else {
110         int a[10], sz = v[1].size();
111         for (int i = 1; i <= 5; i++)
112             a[i] = i;
113         do {
114             ll tmp = 1;
115             for (int i = 1; i <= sz; i++)
116                 tmp = tmp * dp[nex[i - 1]][a[i]] % mod;
117             ans = (ans + tmp) % mod;
118         } while (next_permutation(a + 1, a + 1 + 5));
119     }
120 
121     printf("%lld
", ans);
122 }
View Code

K:

solver:lzh、czq

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int, int> pii;
 4 typedef long long ll;
 5 #define ff first
 6 #define ss second
 7 
 8 const int N = 1e6 + 10;
 9 vector<ll> dp[N];
10 vector<int> a[N];
11 int main() {
12     int n, h; scanf("%d%d", &n, &h);
13     for (int i = 1; i <= n; i++) {
14         a[i].resize(h + 1);
15         dp[i].resize(h + 1);
16         for (int j = 1; j <= h; j++)
17             scanf("%d", &a[i][j]);
18         dp[i][1] = a[i][1];
19     }
20 
21     a[0].resize(h + 1); a[n + 1].resize(h + 1);
22     dp[0].resize(h + 1); dp[n + 1].resize(h + 1);
23     for (int i = 1; i <= h; i++)a[0][i] = a[n + 1][i] = dp[0][i] = dp[n + 1][i] = 0;
24     for (int j = 2; j <= h; j++) {
25         for (int i = 1; i <= n; i++) {
26             dp[i][j] = a[i][j] + max(max(dp[i - 1][j - 1], dp[i + 1][j - 1]), dp[i][j - 1]);
27         }
28     }
29     ll maxx = 0;
30     for (int i = 1; i <= n; i++)maxx = max(maxx, dp[i][h]);
31     printf("%lld
", maxx);
32 }
View Code
原文地址:https://www.cnblogs.com/JHSeng/p/12193790.html