• 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
  • 相关阅读:
    包含min函数的栈
    量化交易系统的四个组成部分
    顺时针打印矩阵
    python正则表达式中re.M,re.S,re.I的作用
    二叉树的镜像
    树的子结构
    合并两个排序的链表
    反转链表
    命名元祖
    二叉树(二叉搜索树-AVL树-B树)
  • 原文地址:https://www.cnblogs.com/JHSeng/p/12193790.html
Copyright © 2020-2023  润新知