• Codeforces Round #625(Div 2)


    A

    统计 A 会做但 B 不会做的题目数量和 B 会做但 A 不会做的数量,无解就是 A 会做但 B 不会做的题目数量为 (0),输出 -1,有解就输出这两个的和除以 A 会做但 B 不会做的题目数。

    #include <bits/stdc++.h>
    #define reg register
    #define ll long long
    #define db double
    #define pi pair<int, int>
    #define pl pair<ll, ll>
    #define vi vector<int>
    #define vl vector<ll>
    #define vpi vector<pi>
    #define vpl vector<pl>
    #define pb push_back
    #define SZ(x) (int) x.size()
    #define lb lower_bound
    #define ub upper_bound
    #define all(x) x.begin(), x.end()
    #define rall(x) x.rbegin(), x.rend()
    #define mkp make_pair
    using namespace std;
    const int MAXN = 110;
    int n, r[MAXN], b[MAXN];
    inline void work() {
     	scanf("%d", &n);
    	int count1 = 0, count2 = 0;
    	for(reg int i = 1; i <= n; ++i)
    		scanf("%d", &r[i]);
    	for(reg int i = 1; i <= n; ++i)
    		scanf("%d", &b[i]);
    	for(reg int i = 1; i <= n; ++i)
    		if(r[i] && !b[i])
    			++count1;
    	for(reg int i = 1; i <= n; ++i)
    		if(!r[i] && b[i])
    			++count2;
      if(count1 == 0) {
        puts("-1");
        return;
      }
    	printf("%d
    ", (count1 + count2) / count1);
    }
    int main() {
     	// freopen("input.txt", "r", stdin);
      work();
    	return 0;
    }
    

    B

    (b_j - b_i = j - i) 就等于 (b_j - j = b_i - i)

    然后用 map 维护一下就行了。

    #include <bits/stdc++.h>
    #define reg register
    #define ll long long
    #define db double
    #define pi pair<int, int>
    #define pl pair<ll, ll>
    #define vi vector<int>
    #define vl vector<ll>
    #define vpi vector<pi>
    #define vpl vector<pl>
    #define pb push_back
    #define SZ(x) (int) x.size()
    #define lb lower_bound
    #define ub upper_bound
    #define all(x) x.begin(), x.end()
    #define rall(x) x.rbegin(), x.rend()
    #define mkp make_pair
    using namespace std;
    const int MAXN = 2e5 + 10;
    int n, b[MAXN];
    map<int, ll> mp;
    inline void work() {
      scanf("%d", &n);
      for(reg int i = 0; i < n; ++i) {
        scanf("%d", &b[i]);
        mp[b[i] - i] += b[i];
      }
      ll ans = 0;
      for(auto it : mp)
        ans = max(ans, it.second);
      printf("%lld
    ", ans);
    }
    int main() {
     	// freopen("input.txt", "r", stdin);
      work();
    	return 0;
    }
    

    C

    统计每个字符出现次数,枚举删除的字符,统计答案。

    #include <bits/stdc++.h>
    #define reg register
    #define ll long long
    #define db double
    #define pi pair<int, int>
    #define pl pair<ll, ll>
    #define vi vector<int>
    #define vl vector<ll>
    #define vpi vector<pi>
    #define vpl vector<pl>
    #define pb push_back
    #define er erase
    #define SZ(x) (int) x.size()
    #define lb lower_bound
    #define ub upper_bound
    #define all(x) x.begin(), x.end()
    #define rall(x) x.rbegin(), x.rend()
    #define mkp make_pair
    using namespace std;
    char ch, B[1 << 20], *S = B, *T = B;
    #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 20, stdin), S == T) ? 0 : *S++)
    #define isd(c) (c >= '0' && c <= '9')
    int aa, bb;
    int rd() {
      while(ch = getc(), !isd(ch) && ch != '-');
      ch == '-' ? aa = bb = 0 : (aa = ch - '0', bb = 1);
      while(ch = getc(), isd(ch))
        aa = aa * 10 + ch - '0';
      return bb ? aa : -aa;
    }
    const int MAXN = 210;
    int n, vis[MAXN];
    string s;
    inline void work() {
      cin >> n;
      memset(vis, 0, sizeof(vis));
      for(reg int i = 1; i <= n; ++i) {
        char ch;
        cin >> ch;
        s += ch;
        vis[ch]++;
      }
      int ans = 0;
      for(reg char ch = 'z'; ch >= 'b'; ch--) {
        if(!vis[ch])
          continue;
        for(reg int i = 0; i < SZ(s); ++i)
          if(s[i] == ch) {
            if((i + 1 < SZ(s) && s[i] - 1 == s[i + 1]) || (i - 1 >= 0 && s[i] - 1 == s[i - 1])) {
              s.er(s.begin() + i);
              i--;
              ans++;
            }
          }
        for(reg int i = SZ(s) - 1; i >= 0; i--) {
          if(s[i] == ch) {
            if((i + 1 < SZ(s) && s[i] - 1 == s[i + 1]) || (i - 1 >= 0 && s[i] - 1 == s[i - 1])) {
              s.er(s.begin() + i);
              i++;
              ans++;
            }
          }
        }
      }
      printf("%d
    ", ans);
    }
    int main() {
     	// freopen("input.txt", "r", stdin);
      work();
    	return 0;
    }
    

    D

    预处理每一个点到达终点的最短距离,然后分类讨论,求最少次数,就是如果下一个位置可以是导航导出来的 ans 就不变,否则 ans+1。求最多次数,就是下一个位置只要不是唯一的最短路,ans 就加一。

    #include <bits/stdc++.h>
    #define reg register
    #define ll long long
    #define ull unsigned long long
    #define db double
    #define pi pair<int, int>
    #define pl pair<ll, ll>
    #define vi vector<int>
    #define vl vector<ll>
    #define vpi vector<pi>
    #define vpl vector<pl>
    #define pb push_back
    #define er erase
    #define SZ(x) (int) x.size()
    #define lb lower_bound
    #define ub upper_bound
    #define all(x) x.begin(), x.end()
    #define rall(x) x.rbegin(), x.rend()
    #define mkp make_pair
    using namespace std;
    char ch, B[1 << 20], *S = B, *T = B;
    #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 20, stdin), S == T) ? 0 : *S++)
    #define isd(c) (c >= '0' && c <= '9')
    int aa, bb;
    int rd() {
      while(ch = getc(), !isd(ch) && ch != '-');
      ch == '-' ? aa = bb = 0 : (aa = ch - '0', bb = 1);
      while(ch = getc(), isd(ch))
        aa = aa * 10 + ch - '0';
      return bb ? aa : -aa;
    }
    const int MAXN = 2e5 + 10;
    vi F[MAXN], G[MAXN];
    int n, m, k, p[MAXN], s, t, dis[MAXN], ans1, ans2;
    queue<int> q;
    inline void bfs() {
      q.push(p[k]);
      dis[p[k]] = 1;
      while(!q.empty()) {
        int x = q.front();
        q.pop();
        for(reg int i = 0; i < SZ(G[x]); ++i) {
          int v = G[x][i];
          if(!dis[v]) {
            dis[v] = dis[x] + 1;
            q.push(v);
          }
        }
      }
    }
    inline void solve_min(int u) {
      if(u == k)
        return;
      int x = p[u];
      if(dis[p[u + 1]] == dis[x] - 1)
        solve_min(u + 1);
      else {
        ++ans1;
        solve_min(u + 1);
      }
    }
    inline void solve_max(int u) {
      if(u == k)
        return;
      int x = p[u];
      if(dis[p[u + 1]] != dis[x] - 1) {
        ++ans2;
        solve_max(u + 1);
        return;
      }
      for(reg int i = 0; i < SZ(F[x]); ++i) {
        int v = F[x][i];
        if(v != p[u + 1] && dis[v] == dis[x] - 1) {
          ++ans2;
          solve_max(u + 1);
          return;
        }
      }
      solve_max(u + 1);
    }
    inline void work() {
      n = rd();
      m = rd();
      for(reg int i = 1; i <= m; ++i) {
        int x = rd(), y = rd();
        F[x].pb(y);
        G[y].pb(x);
      }
      k = rd();
      for(reg int i = 1; i <= k; ++i)
        p[i] = rd();
      bfs();
      solve_min(1);
      solve_max(1);
      printf("%d %d
    ", ans1, ans2);
    }
    int main() {
      // freopen("input.txt", "r", stdin);
      work();
      return 0;
    }
    

    E

    二维偏序问题,将一维从小到大排序,另一维线段树维护最大值。

    #include <bits/stdc++.h>
    #define reg register
    #define ll long long
    #define int long long
    #define ull unsigned long long
    #define db double
    #define pi pair<int, int>
    #define pl pair<ll, ll>
    #define vi vector<int>
    #define vl vector<ll>
    #define vpi vector<pi>
    #define vpl vector<pl>
    #define pb push_back
    #define er erase
    #define SZ(x) (int) x.size()
    #define fi first
    #define se second
    #define lb lower_bound
    #define ub upper_bound
    #define all(x) x.begin(), x.end()
    #define rall(x) x.rbegin(), x.rend()
    #define mkp make_pair
    using namespace std;
    char ch, B[1 << 20], *S = B, *T = B;
    #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 20, stdin), S == T) ? 0 : *S++)
    #define isd(c) (c >= '0' && c <= '9')
    int aa, bb;
    int rd() {
      while(ch = getc(), !isd(ch) && ch != '-');
      ch == '-' ? aa = bb = 0 : (aa = ch - '0', bb = 1);
      while(ch = getc(), isd(ch))
        aa = aa * 10 + ch - '0';
      return bb ? aa : -aa;
    }
    const int MAXN = 2e5 + 10;
    int n, m, p, mx[MAXN << 2], tag[MAXN << 2], d[MAXN];
    struct Node  {
      int x, y;
    } a[MAXN], b[MAXN];
    struct Equ {
      int x, y, z;
    } c[MAXN];
    bool cmp1(Node a, Node b) {
      return a.x < b.x;
    }
    bool cmp2(Equ a, Equ b) {
      return a.x < b.x;
    }
    inline void pushup(int x) {
      mx[x] = max(mx[x << 1], mx[x << 1 | 1]);
    }
    inline void pushdown(int x) {
      if(tag[x]) {
        tag[x << 1] += tag[x];
        tag[x << 1 | 1] += tag[x];
        mx[x << 1] += tag[x];
        mx[x << 1 | 1] += tag[x];
        tag[x] = 0;
      }
    }
    inline void build(int l, int r, int x) {
      if(l == r) {
        mx[x] = -b[l].y;
        return;
      }
      int mid = (l + r) >> 1;
      build(l, mid, x << 1);
      build(mid + 1, r, x << 1 | 1);
      pushup(x);
    }
    inline void modify(int l, int r, int ql, int qr, int x, int c) {
      if(ql <= l && qr >= r) {
        tag[x] += c;
        mx[x] += c;
        return;
      }
      pushdown(x);
      int mid = (l + r) >> 1;
      if(ql <= mid)
        modify(l, mid, ql, qr, x << 1, c);
      if(qr > mid)
        modify(mid + 1, r, ql, qr, x << 1 | 1, c);
      pushup(x);
    }
    int query(int l, int r, int ql, int qr, int x) {
      if(ql <= l && qr >= r)
        return mx[x];
      pushdown(x);
      int mid = (l + r) >> 1;
      int ret = -numeric_limits<int>::max();
      if(ql <= mid)
        ret = max(ret, query(l, mid, ql, qr, x << 1));
      if(qr > mid)
        ret = max(ret, query(mid + 1, r, ql, qr, x << 1 | 1));
      return ret;
    }
    inline void work() {
      n = rd();
      m = rd();
      p = rd();
      for(reg int i = 1; i <= n; ++i) {
        a[i].x = rd();
        a[i].y = rd();
      }
      for(reg int i = 1; i <= m; ++i) {
        b[i].x = rd();
        b[i].y = rd();
      }
      for(reg int i = 1; i <= p; ++i) {
        c[i].x = rd();
        c[i].y = rd();
        c[i].z = rd();
      }
      sort(a + 1, a + n + 1, cmp1);
      sort(b + 1, b + m + 1, cmp1);
      sort(c + 1, c + p + 1, cmp2);
      for(reg int i = 1; i <= m; ++i)
        d[i] = b[i].x;
      build(1, m, 1);
      int pt = 1, ans = -numeric_limits<int>::max();
      for(reg int i = 1; i <= n; ++i) {
        while(pt <= p && c[pt].x < a[i].x) {
          int pos = ub(d + 1, d + m + 1, c[pt].y) - d;
          if(pos <= m)
            modify(1, m, pos, m, 1, c[pt].z);
          pt++;
        }
        ans = max(ans, query(1, m, 1, m, 1) - a[i].y);
      }
      printf("%lld
    ", ans);
    }
    signed main() {
      // freopen("input.txt", "r", stdin);
      work();
      return 0;
    }
    
    

    F

    首先我们可以发现每次变换相当于把 (0) 向左或向右移动两位,移动前后相邻两个 (0) 之间 (1) 的个数奇偶不变,那么我们将这两个串中的 (0) 都尽量往某方向移动,如果移动之后两串长得一样,则这两原串间可相互变换。所以我们将每个 (0) 的权值设为与前一个 (0) 之间 (1) 个数的奇偶(也就是设成 digit % 2,其中 digit 表示前面所说的 (1) 的个数,然后用哈希判断是否相同即可。

    #include <bits/stdc++.h>
    #define reg register
    #define ll long long
    #define ull unsigned long long
    #define db double
    #define pi pair<int, int>
    #define pl pair<ll, ll>
    #define vi vector<int>
    #define vl vector<ll>
    #define vpi vector<pi>
    #define vpl vector<pl>
    #define pb push_back
    #define er erase
    #define SZ(x) (int) x.size()
    #define lb lower_bound
    #define ub upper_bound
    #define all(x) x.begin(), x.end()
    #define rall(x) x.rbegin(), x.rend()
    #define mkp make_pair
    using namespace std;
    char ch, B[1 << 20], *S = B, *T = B;
    #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 20, stdin), S == T) ? 0 : *S++)
    #define isd(c) (c >= '0' && c <= '9')
    int aa, bb;
    int rd() {
      while(ch = getc(), !isd(ch) && ch != '-');
      ch == '-' ? aa = bb = 0 : (aa = ch - '0', bb = 1);
      while(ch = getc(), isd(ch))
        aa = aa * 10 + ch - '0';
      return bb ? aa : -aa;
    }
    const int MAXN = 2e5 + 10;
    const int BASE = 233;
    char s[MAXN];
    int n, a[MAXN], tot, flag[MAXN], cnt[MAXN];
    ull power[MAXN], Hash[MAXN];
    ull get(int l, int r) {
      int len = r - l + 1;
      return 1ll * Hash[r] - Hash[l - 1] * power[len];
    }
    ull check(int l, int r) {
      int L = lower_bound(a + 1, a + tot + 1, l) - a;
      int R = upper_bound(a + 1, a + tot + 1, r) - a - 1;
      if(L <= R) {
        ull x = (a[L] - l) & 1, v = x * power[R - L];
        if(L < R)
          v += get(L + 1, R);
        return v;
      }
      return 0;
    }
    inline void work() {
      power[0] = 1;
      for(reg int i = 1; i < MAXN; ++i)
        power[i] = power[i - 1] * BASE;
      scanf("%d%s", &n, s + 1);
      int digit = 0;
      for(reg int i = 1; i <= n; ++i) {
        cnt[i] = cnt[i - 1];
        if(s[i] == '1')
          digit++;
        else {
          flag[++tot] = digit & 1;
          digit = 0;
          a[tot] = i;
          ++cnt[i];
        }
      }
      for(reg int i = 1; i <= tot; ++i)
        Hash[i] = Hash[i - 1] * BASE + flag[i];
      int q;
      scanf("%d", &q);
      while(q--) {
        int l1, l2, len, r1, r2;
        scanf("%d%d%d", &l1, &l2, &len);
        r1 = l1 + len - 1;
        r2 = l2 + len - 1;
        if(cnt[r1] - cnt[l1 - 1] == cnt[r2] - cnt[l2 - 1] && check(l1, r1) == check(l2, r2))
          printf("Yes
    ");
        else
          printf("No
    ");
      }
    }
    int main() {
     	// freopen("input.txt", "r", stdin);
      work();
      return 0;
    }
    
  • 相关阅读:
    2020软件工程作业02
    2020软件工程作业01
    并发编程—协程
    并发编程—线程
    并发编程—进程
    python网络编程总结
    前端-Javascript
    前端-jQuery
    前端-CSS
    前端-Html
  • 原文地址:https://www.cnblogs.com/Lonely-233/p/13659209.html
Copyright © 2020-2023  润新知