zoukankan      html  css  js  c++  java
  • NCD2019

    比较水的一场,智力不足差一题AK。

    题目链接:https://codeforces.com/gym/102163


    A:

    solver:czq

    树状数组+二分

     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 int maxn = 2e5 + 10;
    15 
    16 struct Segment {
    17     int st, ed, len;
    18 } seg[maxn];
    19 
    20 struct Info {
    21     int isHori, len, slen, sign;
    22 } cross[maxn];
    23 
    24 int t, n, m, tree[maxn], pos[maxn];
    25 
    26 int lowbit(int x) {
    27     return x & -x;
    28 }
    29 
    30 void init() {
    31     for (int i = 0; i < 100001; i++) tree[i] = 0;
    32 }
    33 
    34 void add(int x, int k) {
    35     for (; x < maxn; x += lowbit(x)) tree[x] += k;
    36 }
    37 
    38 int query(int x) {
    39     int ret = 0;
    40     for (; x; x -= lowbit(x)) ret += tree[x];
    41     return ret;
    42 }
    43 
    44 int cmp(int u, int v) {
    45     return mp(cross[u].len, cross[u].isHori) < mp(cross[v].len, cross[v].isHori);
    46 }
    47 
    48 bool check(int len) {
    49     init();
    50     int cnt = 0;
    51     for (int i = 1; i <= n; i++) {
    52         if (seg[i].ed - seg[i].st < len * 2) continue;
    53         cross[++cnt].slen = seg[i].len, cross[cnt].sign = 1, cross[cnt].isHori = 0, cross[cnt].len = seg[i].st + len;
    54         cross[++cnt].slen = seg[i].len, cross[cnt].sign = -1, cross[cnt].isHori = 0, cross[cnt].len = seg[i].ed - len + 1;
    55     }
    56     for (int i = n + 1; i <= n + m; i++) {
    57         if (seg[i].ed - seg[i].st < len * 2) continue;
    58         cross[++cnt].slen = seg[i].st + len, cross[cnt].sign = seg[i].ed - len, cross[cnt].isHori = 1, cross[cnt].len = seg[i].len;
    59     }
    60     for (int i = 1; i <= cnt; i++) pos[i] = i;
    61     sort(pos + 1, pos + cnt + 1, cmp);
    62     for (int l = 1, r = 1; l <= cnt; l = r) {
    63         for (; r <= cnt && cross[pos[l]].len == cross[pos[r]].len; r++) {
    64             if (!cross[pos[r]].isHori) add(cross[pos[r]].slen, cross[pos[r]].sign);
    65             else if (query(cross[pos[r]].slen - 1) < query(cross[pos[r]].sign)) return true;
    66         }
    67     }
    68     return false;
    69 }
    70 
    71 int main() {
    72     scanf("%d", &t);
    73     while (t--) {
    74         scanf("%d%d", &n, &m);
    75         for (int i = 1; i <= n; i++) scanf("%d%d%d", &seg[i].st, &seg[i].ed, &seg[i].len);
    76         for (int i = n + 1; i <= n + m; i++) scanf("%d%d%d", &seg[i].st, &seg[i].ed, &seg[i].len);
    77         int l = 0, r = 5e4, ans;
    78         while (l < r) {
    79             int mid = (l + r + 1) / 2;
    80             if (check(mid)) l = mid; else r = mid - 1;
    81         }
    82         ans = l;
    83         printf("%d
    ", ans);
    84     }
    85     return 0;
    86 }
    View Code

    B:

    solver:zyh、czq

    tarjan求强连通分量和割边数量,缩点,求树的直径,ans=割边数量-直径

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int SIZE = 100010;
     5 int head[SIZE], ver[SIZE * 2], Next[SIZE * 2];
     6 int dfn[SIZE], low[SIZE];
     7 int n, m, tot, num;
     8 int color[SIZE];
     9 int cnum = 0;
    10 stack<int> st;
    11 unordered_set<int> rds[SIZE];
    12 void add(int x, int y) {
    13     ver[++tot] = y, Next[tot] = head[x], head[x] = tot;
    14 }
    15 
    16 void tarjan(int x, int in_edge) {
    17     dfn[x] = low[x] = ++num;
    18     st.push(x);
    19     for (int i = head[x]; i; i = Next[i]) {
    20         int y = ver[i];
    21         if (!dfn[y]) {
    22             tarjan(y, i);
    23             low[x] = min(low[x], low[y]);
    24         } else if (i != (in_edge ^ 1)) low[x] = min(low[x], dfn[y]);
    25     }
    26     if (low[x] == dfn[x]) {
    27         cnum++;
    28         while (!st.empty() && st.top() != x) {
    29             color[st.top()] = x;
    30             st.pop();
    31         }
    32         st.pop();
    33         color[x] = x;
    34     }
    35 }
    36 int furthest = 0;
    37 int furthest_u = 0;
    38 void dfs(int u, int f, int d) {
    39     if (d > furthest) {
    40         furthest_u = u;
    41         furthest = d;
    42     }
    43     for (auto v : rds[u]) {
    44         if (v == f) continue;
    45         dfs(v, u, d + 1);
    46     }
    47 }
    48 
    49 int main() {
    50     int T;
    51     scanf("%d", &T);
    52     while (T--) {
    53         scanf("%d%d", &n, &m);
    54         memset(head, 0, sizeof(head));
    55         memset(dfn, 0, sizeof(dfn));
    56         for (int i = 1; i <= n; ++i) rds[i].clear();
    57         tot = 1;
    58         cnum = 0;
    59         num = 0;
    60         for (int i = 1; i <= m; i++) {
    61             int x, y;
    62             scanf("%d%d", &x, &y);
    63             add(x, y), add(y, x);
    64         }
    65         for (int i = 1; i <= n; i++)
    66             if (!dfn[i]) tarjan(i, 0);
    67         for (int i = 2; i < tot; i += 2) {
    68             int u = color[ver[i]];
    69             int v = color[ver[i ^ 1]];
    70             if (u != v) {
    71                 rds[u].insert(v);
    72                 rds[v].insert(u);
    73             }
    74         }
    75         furthest = 0;
    76         furthest_u = 0;
    77         dfs(color[1], 0, 1);
    78         dfs(furthest_u, 0, 1);
    79         printf("%d
    ", cnum - furthest);
    80     }
    81 }
    View Code

    C:

    solver:czq

    求LIS长度和个数

     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 int maxn = 1010, mod = 1e9 + 7;
    15 int t, n, a[maxn], f[maxn], g[maxn];
    16 
    17 int main() {
    18     scanf("%d", &t);
    19     while (t--) {
    20         int maxx = 0, num = 0;
    21         scanf("%d", &n);
    22         for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    23         for (int i = 1; i <= n; i++) {
    24             f[i] = 1, g[i] = 1;
    25             for (int j = 1; j < i; j++)
    26                 if (a[j] < a[i]) {
    27                     if (f[i] < f[j] + 1) f[i] = f[j] + 1, g[i] = g[j];
    28                     else if (f[i] == f[j] + 1) g[i] = (g[i] + g[j]) % mod;
    29                 }
    30         }
    31         for (int i = 1; i <= n; i++)
    32             if (maxx < f[i]) maxx = f[i], num = g[i];
    33             else if (maxx == f[i]) num = (num + g[i]) % mod;
    34         printf("%d %d
    ", maxx, num);
    35     }
    36     return 0;
    37 }
    View Code

    D:

    solver:czq

    白给

     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 int t;
    15 
    16 int main() {
    17     scanf("%d", &t);
    18     while (t--) {
    19         int x, y; scanf("%d%d", &x, &y);
    20         if (x > y) puts("Bashar");
    21         else if (x < y) puts("Hamada");
    22         else puts("Iskandar");
    23     }
    24     return 0;
    25 }
    View Code

    E:

    看上去像是数据结构,待补

    F:

    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 int main() {
     9     int t;
    10     scanf("%d", &t);
    11     while (t--) {
    12         ll a, b;
    13         scanf("%lld%lld", &a, &b);
    14         a -= b;
    15         ll ans = a / 6;
    16         if (a % 6)
    17             ans++;
    18         printf("%lld
    ", ans);
    19     }
    20 }
    View Code

    G:

    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 const double g = 10.0;
     9 const double pi = acos(-1.0);
    10 
    11 long double ansl, ansr;
    12 int n, v, l, r;
    13 void solve45(double x, double y) {
    14     ansl = ansr = -1;
    15     if (l > 45)
    16         return;
    17     long double L = l * pi / 180.0, R = min(45, r) * pi / 180.0;
    18     long double st = (long double)v * v / g * sin(2.0 * L),
    19                 end = (long double)v * v / g * sin(2.0 * R);
    20     if (l == 0)
    21         st = 0;
    22     x = max((long double)x, st), y = min((long double)y, end);
    23     if (x > y)
    24         return;
    25 
    26     long double res1 = asin((long double)g * x / v / v);
    27     res1 /= 2.0;
    28 
    29     long double res2 = asin((long double)g * y / v / v);
    30     res2 /= 2.0;
    31 
    32     ansl = max(L, res1), ansr = min(R, res2);
    33 }
    34 void solve90(double x, double y) {
    35     ansl = ansr = -1;
    36     if (r < 45)
    37         return;
    38     long double L = max(45, l) * pi / 180.0, R = r * pi / 180.0;
    39     long double st = (long double)v * v / g * sin(2.0 * R),
    40                 end = (long double)v * v / g * sin(2.0 * L);
    41     if (r == 90)
    42         st = 0;
    43     x = max((long double)x, st), y = min((long double)y, end);
    44     //printf("%lf %lf
    ", x, y);
    45     if (x > y)
    46         return;
    47 
    48     long double res1 = asin((long double)g * y / v / v);
    49     res1 = (pi - res1) / 2.0;
    50 
    51     long double res2 = asin((long double)g * x / v / v);
    52     res2 = (pi - res2) / 2.0;
    53 
    54     ansl = max(L, res1), ansr = min(R, res2);
    55 }
    56 
    57 int main() {
    58     int t;
    59     scanf("%d", &t);
    60     while (t--) {
    61         scanf("%d%d%d%d", &n, &v, &l, &r);
    62         if (l == r) {
    63             long double should = (long double)v * v / g * sin(2.0 * l * pi / 180.0);
    64             while (n--) {
    65                 double x, y;
    66                 scanf("%lf%lf", &x, &y);
    67                 if (should - x >= -1e-6 && y - should >= -1e-6)
    68                     printf("1.0000
    ");
    69                 else
    70                     printf("0.0000
    ");
    71             }
    72         } else
    73             while (n--) {
    74                 double x, y;
    75                 scanf("%lf%lf", &x, &y);
    76                 double ans = 0;
    77 
    78                 solve45(x, y);
    79                 if (ansl != -1)
    80                     ans += ansr - ansl;
    81 
    82                 solve90(x, y);
    83                 if (ansl != -1)
    84                     ans += ansr - ansl;
    85 
    86                 printf("%.4lf
    ", abs(ans / (pi * (r - l) / 180.0)));
    87             }
    88     }
    89 }
    View Code

    H:

    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 int f[100010];
     9 int find(int x) {
    10     return f[x] != x ? f[x] = find(f[x]) : f[x];
    11 }
    12 void add(int x, int y) {
    13     int fx = find(x), fy = find(y);
    14     if (fx != fy)
    15         f[fx] = fy;
    16 }
    17 int main() {
    18     int t;
    19     scanf("%d", &t);
    20     while (t--) {
    21         int n, m, q;
    22         scanf("%d%d%d", &n, &m, &q);
    23         for (int i = 1; i <= n; i++)
    24             f[i] = i;
    25         while (m--) {
    26             int x, y;
    27             scanf("%d%d", &x, &y);
    28             add(x, y);
    29         }
    30         while (q--) {
    31             int x, y;
    32             scanf("%d%d", &x, &y);
    33             if (find(x) == find(y))
    34                 printf("1");
    35             else
    36                 printf("0");
    37         }
    38         printf("
    ");
    39     }
    40 }
    View Code

    J:

    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<ll, ll> pii;
     7 
     8 ll a[300010], ans[300010];
     9 pii p[100010];
    10 int main() {
    11     int t;
    12     scanf("%d", &t);
    13     while (t--) {
    14         int n, m;
    15         scanf("%d%d", &n, &m);
    16         for (int i = 0; i <= 3 * n; i++)
    17             a[i] = ans[i] = 0;
    18         for (int i = 1; i <= m; i++)
    19             scanf("%lld", &p[i].ff), p[i].ff += n - 1;
    20         for (int i = 1; i <= m; i++)
    21             scanf("%lld", &p[i].ss);
    22         for (int i = 1; i <= m; i++) {
    23             int l = p[i].ff, r = p[i].ff + p[i].ss;
    24             if (l > r)
    25                 swap(l, r);
    26             r++;
    27             a[l]++, a[r]--;
    28         }
    29         for (int i = 1; i < 3 * n; i++)
    30             a[i] += a[i - 1];
    31         for (int i = 0; i < 3 * n; i++)
    32             ans[i % n] += a[i];
    33         pii ansn = { 0, 0 };
    34         for (int i = 0; i < n; i++) {
    35             if (ans[i] > ansn.ff)
    36                 ansn = { ans[i], i };
    37         }
    38         ansn.ss++;
    39         printf("%lld %lld
    ", ansn.ss, ansn.ff);
    40     }
    41 }
    View Code

    K:

    solver:lzh

    upper_bound一下就行

     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[100010];
     9 int main() {
    10     int t;
    11     scanf("%d", &t);
    12     while (t--) {
    13         int n, x;
    14         scanf("%d%d", &n, &x);
    15         for (int i = 1; i <= n; i++)
    16             scanf("%lld", &a[i]), a[i] += a[i - 1];
    17         ll ans = 0;
    18         for (int i = 1; i <= n; i++) {
    19             int r = upper_bound(a + 1, a + 1 + n, a[i - 1] + x - 1) - a - 1;
    20             ans += r - i + 1;
    21         }
    22         printf("%lld
    ", ans);
    23     }
    24 }
    View Code

    L:
    solver:czq

    白给

     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 int t, n;
    15 
    16 int main() {
    17     scanf("%d", &t);
    18     while (t--) {
    19         scanf("%d", &n);
    20         vector<int>ans;
    21         while (n--) {
    22             int x, cnt = 0; scanf("%d", &x);
    23             while (x) {
    24                 cnt += x & 1;
    25                 x >>= 1;
    26             }
    27             ans.pb(cnt);
    28         }
    29         for (int i = 0; i < (int)ans.size() - 1; i++) printf("%d ", ans[i]);
    30         printf("%d
    ", ans[(int)ans.size() - 1]);
    31     }
    32     return 0;
    33 }
    View Code

    M:
    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 ll mod = 1e9 + 7;
     9 ll qp(ll base, ll b) {
    10     ll res = 1;
    11     while (b) {
    12         if (b & 1)
    13             res = res * base % mod;
    14         base = base * base % mod;
    15         b >>= 1;
    16     }
    17     return res;
    18 }
    19 
    20 int main() {
    21     int t;
    22     scanf("%d", &t);
    23     while (t--) {
    24         int b1, p1, b2, p2;
    25         scanf("%d%d%d%d", &b1, &p1, &b2, &p2);
    26         double tmp = p1 * log(b1) - p2 * log(b2);
    27         int l = -1, r = -1;
    28         if (!b1)
    29             l = 0;
    30         else if (!p1)
    31             l = 1;
    32         if (!b2)
    33             r = 0;
    34         else if (!p2)
    35             r = 1;
    36         if (l != -1 && r != -1) {
    37             if (l == r)
    38                 printf("Lazy
    ");
    39             else if (l < r)
    40                 printf("Congrats
    ");
    41             else
    42                 printf("HaHa
    ");
    43             continue;
    44         }
    45 
    46         if (fabs(tmp) < 1e-8 && qp(b1, p1) == qp(b2, p2))
    47             printf("Lazy
    ");
    48         else if (tmp < 1e-8)
    49             printf("Congrats
    ");
    50         else
    51             printf("HaHa
    ");
    52     }
    53 }
    View Code
  • 相关阅读:
    【开学季】自学嵌入式开发|四核开发板|4412开发板|ARM+Android+linux技术
    迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
    【嵌入式开发板】8月终极暑促迅为Cortex-a9四核入门开发板
    [资料分享]迅为iTOP4412开发板-SDIO WiFi移植文档
    [leetcode] 905. Sort Array By Parity [easy]
    [leetcode] 106. Construct Binary Tree from Inorder and Postorder Traversal(medium)
    [leetcode] 4. Median of Two Sorted Arrays
    [leetcode] 3. Longest Substring Without Repeating Characters
    [leetcode] 105. Construct Binary Tree from Preorder and Inorder Traversal (Medium)
    [leetcode] 110. Balanced Binary Tree (easy)
  • 原文地址:https://www.cnblogs.com/JHSeng/p/12317700.html
Copyright © 2011-2022 走看看