zoukankan      html  css  js  c++  java
  • Wannafly挑战赛19

    A.队列Q

    随便on

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 1e5 + 10;
     4 int q[maxn], f[maxn], b[maxn], vis[maxn];
     5 stack<int> F, B;
     6 vector<int> ans;
     7  
     8 int main() {
     9     int N, Q;
    10     scanf("%d", &N);
    11     for(int i = 1; i <= N; ++i) scanf("%d", q + i);
    12     scanf("%d", &Q);
    13     while(Q--) {
    14         int x;
    15         char s[11];
    16         scanf("%s %d", s, &x);
    17         if(s[0] == 'F') f[x] = 1, b[x] = 0, F.push(x);
    18         else f[x] = 0, b[x] = 1, B.push(x);
    19     }
    20     while(!F.empty()) {
    21         int x = F.top(); F.pop();
    22         if(!f[x] || vis[x]) continue;
    23         vis[x] = 1, ans.push_back(x);
    24     }
    25     for(int i = 1; i <= N; ++i) {
    26         if(b[q[i]] || vis[q[i]]) continue;
    27         vis[q[i]] = 1, ans.push_back(q[i]);
    28     }
    29     while(!B.empty()) {
    30         int x = B.top(); B.pop();
    31         if(!b[x] || vis[x]) continue;
    32         vis[x] = 1, F.push(x);
    33     }
    34     while(!F.empty()) {
    35         int x = F.top(); F.pop();
    36         ans.push_back(x);
    37     }
    38     for(int i = 0; i < N; ++i) printf("%d%c", ans[i], i == N - 1 ? '
    ' : ' ');
    39     return 0;
    40 }
    Aguin

    B.矩阵

    单调队列

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 LL M[505][505], sum[505][505], zero[505][505];
     5 deque<int> dq;
     6  
     7 int main() {
     8     int R, C, X, Y, Z;
     9     scanf("%d %d %d %d %d", &R, &C, &X, &Y, &Z);
    10     for(int i = 1; i <= R; ++i) {
    11         for(int j = 1; j <= C; ++j) {
    12             scanf("%lld", M[i] + j);
    13             sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + M[i][j];
    14             zero[i][j] = zero[i-1][j] + zero[i][j-1] - zero[i-1][j-1] + (M[i][j] == 0 ? 1 : 0);
    15         }
    16     }
    17     LL ans = 0;
    18     for(int U = 1; U <= R; ++U) {
    19         for(int D = U; D <= min(R, U + X - 1); ++D) {
    20             dq.clear();
    21             dq.push_back(0);
    22             for(int i = 1; i <= C; ++i) {
    23                 while(!dq.empty() && (i - dq.front() > Y || (zero[D][i] - zero[U-1][i]) - (zero[D][dq.front()] - zero[U-1][dq.front()]) > Z)) dq.pop_front();
    24                 LL x = sum[D][i] - sum[U-1][i];
    25                 if(!dq.empty()) ans = max(ans, x - sum[D][dq.front()] + sum[U-1][dq.front()]);
    26                 while(!dq.empty() && x <= sum[D][dq.back()] - sum[U-1][dq.back()]) dq.pop_back();
    27                 dq.push_back(i);
    28             }
    29         }
    30     }
    31     printf("%lld
    ", ans);
    32     return 0;
    33 }
    Aguin

    C.多彩的树

    枚举色集容斥

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 5e4 + 10;
     4 typedef long long LL;
     5 const LL mod = 1e9 + 7;
     6 vector<int> G[maxn];
     7 int A[maxn], vis[maxn];
     8 LL cnt, ans[2222];
     9  
    10 void dfs(int x, int msk) {
    11     vis[x] = 1, cnt++;
    12     for(int i = 0; i < G[x].size(); ++i) {
    13         int to = G[x][i];
    14         if(vis[to] || !((1 << (A[to] - 1)) & msk)) continue;
    15         dfs(to, msk);
    16     }
    17 }
    18  
    19 int main() {
    20     int N, K;
    21     scanf("%d %d", &N, &K);
    22     for(int i = 1; i <= N; ++i) scanf("%d", A + i);
    23     for(int i = 1; i < N; ++i) {
    24         int u, v;
    25         scanf("%d %d", &u, &v);
    26         G[u].push_back(v);
    27         G[v].push_back(u);
    28     }
    29     for(int i = 0; i < (1 << K); ++i) {
    30         for(int j = 1; j <= N; ++j) vis[j] = 0;
    31         for(int j = 1; j <= N; ++j) {
    32             if(!vis[j] && ((1 << (A[j] - 1)) & i)) {
    33                 cnt = 0, dfs(j, i);
    34                 ans[i] = (ans[i] + cnt * (cnt - 1) / 2 + cnt) % mod;
    35             }
    36         }
    37     }
    38     for(int j = 0; j < K; ++j) {
    39         for (int i = 0; i < (1 << K); ++i) {
    40             if (i & (1 << j)) ans[i] = (ans[i] + mod - ans[i ^ (1 << j)]) % mod;
    41         }
    42     }
    43     LL ret = 0;
    44     for(int i = 0; i < (1 << K); ++i) {
    45         LL base = 1;
    46         for(int j = 0; j < K; ++j) {
    47             if(i & (1 << j)) base = base * 131 % mod;
    48         }
    49         ret = (ret + ans[i] * base) % mod;
    50     }
    51     printf("%lld
    ", ret);
    52     return 0;
    53 }
    Aguin

    D.回文

    马拉车前后缀预处理完枚举回文中心

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 1e5 + 10;
     4 int A[26], B[26], p[maxn<<1];
     5 typedef long long LL;
     6 const LL INF = 1e18;
     7 LL L[maxn], R[maxn], SL[maxn], SR[maxn];
     8 char s[maxn], ss[maxn<<1];
     9  
    10 int main() {
    11     scanf("%s", s + 1);
    12     int l = strlen(s + 1);
    13     for (int i = 0; i < 26; ++i) scanf("%d %d", A + i, B + i);
    14     LL m = 0, sum = 0;
    15     for (int i = 1; i <= l; ++i) {
    16         sum += A[s[i] - 'a'] - B[s[i] - 'a'];
    17         L[i] = sum - m;
    18         SL[i] = SL[i - 1] + A[s[i] - 'a'];
    19         m = min(m, sum);
    20     }
    21     m = 0, sum = 0;
    22     for (int i = l; i >= 1; --i) {
    23         sum += A[s[i] - 'a'] - B[s[i] - 'a'];
    24         R[i] = sum - m;
    25         SR[i] = SR[i + 1] + A[s[i] - 'a'];
    26         m = min(m, sum);
    27     }
    28     int len = 2 * l + 1;
    29     ss[0] = '$';
    30     for (int i = 1; i <= len; i++) {
    31         if (i % 2) ss[i] = '#';
    32         else ss[i] = s[i / 2];
    33     }
    34     ss[len + 1] = '^';
    35     int mx = 0, id;
    36     for (int i = 1; i <= len; i++) {
    37         if (mx > i) p[i] = min(p[2 * id - i], mx - i);
    38         else p[i] = 1;
    39         while (ss[i + p[i]] == ss[i - p[i]]) p[i]++;
    40         if (p[i] + i > mx) {
    41             mx = p[i] + i;
    42             id = i;
    43         }
    44     }
    45     LL ans = INF;
    46     for (int i = 1; i <= len; ++i) {
    47         if (ss[i] == '#') {
    48             if (p[i] == 1) continue;
    49             int lb = i / 2 - p[i] / 2 + 1, rb = i / 2 + p[i] / 2;
    50             ans = min(ans, SL[lb-1] + SR[rb+1] - max(L[lb-1], R[rb+1]));
    51         } else {
    52             int lb = i / 2 - p[i] / 2 + 1, rb = i / 2 + p[i] / 2 - 1;
    53             ans = min(ans, SL[lb-1] + SR[rb+1] - max(L[lb-1], R[rb+1]));
    54         }
    55     }
    56     printf("%lld
    ", ans);
    57     return 0;
    58 }
    Aguin

    E.集合

    预处理bfs转移要o1 想不到建图

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3  
      4 // SPFA_min_cost_flow
      5 const int INF = 1e9;
      6 const int maxn = 1e6;
      7 int dist[555], vis[555];
      8 int pv[555], pe[555];
      9 int cnt, h[555];
     10  
     11 struct edge {
     12     int to, pre, cap, cost;
     13 } e[maxn<<1];
     14  
     15 void init() { //Don't forget
     16     cnt = 0;
     17     memset(h, -1, sizeof(h));
     18 }
     19  
     20 void add(int from, int to, int cap, int cost) {
     21     e[cnt].pre = h[from];
     22     e[cnt].to = to;
     23     e[cnt].cap = cap;
     24     e[cnt].cost = cost;
     25     h[from] = cnt;
     26     cnt++;
     27 }
     28  
     29 void ad(int from, int to, int cap, int cost) {
     30     add(from, to, cap, cost);
     31     add(to, from, 0, -cost);
     32 }
     33  
     34 int min_cost_flow(int s, int t) {
     35     int ret = 0;
     36     while (1) {
     37         memset(vis, 0, sizeof(vis));
     38         for (int i = 0; i < 555; i++) dist[i] = INF;
     39         dist[s] = 0;
     40         queue<int> q;
     41         q.push(s);
     42         while (!q.empty()) {
     43             int v = q.front();
     44             q.pop();
     45             vis[v] = 0;
     46             for (int i = h[v]; i >= 0; i = e[i].pre) {
     47                 int to = e[i].to, cap = e[i].cap, cost = e[i].cost;
     48                 if (cap > 0 && dist[to] > dist[v] + cost) {
     49                     pv[to] = v, pe[to] = i;
     50                     dist[to] = dist[v] + cost;
     51                     if (!vis[to]) q.push(to);
     52                     vis[to] = 1;
     53                 }
     54             }
     55         }
     56         if (dist[t] >= 0) return ret; // modify here
     57         int d = INF;
     58         for (int v = t; v != s; v = pv[v])
     59             d = min(d, e[pe[v]].cap);
     60         ret += d * dist[t];
     61         for (int v = t; v != s; v = pv[v]) {
     62             e[pe[v]].cap -= d;
     63             e[pe[v] ^ 1].cap += d;
     64         }
     65     }
     66 }
     67  
     68 char SA[55][22], SB[55][22];
     69 int da[55], db[55], ma[55], mb[55];
     70 vector<int> G[55], D[55];
     71  
     72 queue<int> q;
     73 int dis[1<<16], base[22];
     74  
     75 int get(char * s, int la) {
     76     int ret = 0;
     77     for (int i = 0; i < la; ++i) ret += (s[i] - '0') * base[i];
     78     return ret;
     79 }
     80  
     81 vector<int> rev[17];
     82 int main() {
     83     for (int i = 0; i < 22; ++i) base[i] = 1 << i;
     84     for (int i = 2; i <= 16; ++i) {
     85         for (int j = 0; j < (1 << i); ++j) {
     86             int o = 0;
     87             for (int k = 0; k < i; ++k)
     88                 if (j & (1 << k)) o += (1 << (i - k - 1));
     89             rev[i].push_back(o);
     90         }
     91     }
     92     int N, M, ans = 0;
     93     scanf("%d", &N);
     94     for (int i = 1; i <= N; ++i) scanf("%s", SA[i]);
     95     scanf("%d", &M);
     96     for (int i = 1; i <= M; ++i) scanf("%s", SB[i]);
     97     for (int i = 1; i <= N; ++i) scanf("%d", da + i), ans += da[i];
     98     for (int i = 1; i <= M; ++i) scanf("%d", db + i), ans += db[i];
     99     for (int i = 1; i <= N; ++i) scanf("%d", ma + i);
    100     for (int i = 1; i <= M; ++i) scanf("%d", mb + i);
    101     for (int i = 1; i <= N; ++i) {
    102         int la = strlen(SA[i]);
    103         for (int j = 0; j < (1 << la); ++j) dis[j] = INF;
    104         int st = get(SA[i], la);
    105         dis[st] = 0;
    106         q.push(st);
    107         while (!q.empty()) {
    108             int x = q.front();
    109             q.pop();
    110             for (int L = 0; L < la; ++L) {
    111                 for (int R = L + 1; R < la; ++R) {
    112                     int low = x & (base[L] - 1);
    113                     int high = (x >> (R + 1)) << (R + 1);
    114                     int mid = rev[R - L + 1][((x - high) >> L)] << L;
    115                     int t = low + mid + high;
    116                     if (dis[t] == INF) dis[t] = dis[x] + 1, q.push(t);
    117                 }
    118             }
    119         }
    120         for (int j = 1; j <= M; ++j)
    121             if (strlen(SB[j]) == la && dis[get(SB[j], la)] != INF)
    122                 G[i].push_back(j), D[i].push_back(dis[get(SB[j], la)] * min(ma[i], mb[j]) - da[i] - db[j]);
    123     }
    124     init();
    125     int S = N + M + 1, T = S + 1;
    126     for (int i = 1; i <= N; ++i) ad(S, i, 1, 0);
    127     for (int i = 1; i <= M; ++i) ad(N + i, T, 1, 0);
    128     for (int i = 1; i <= N; ++i)
    129         for (int j = 0; j < G[i].size(); ++j)
    130             ad(i, N + G[i][j], 1, D[i][j]);
    131     printf("%d
    ", ans + min_cost_flow(S, T));
    132     return 0;
    133 }
    Aguin

    F.K串

    哈希莫队

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 3e4 + 10;
     4 char s[maxn];
     5  
     6 int sz, ql[maxn], qr[maxn], id[maxn];
     7 bool cmp(int i, int j) {
     8     if(ql[i] / sz != ql[j] / sz) return ql[i] / sz < ql[j] / sz;
     9     return qr[i] < qr[j];
    10 }
    11  
    12 int sum[26];
    13 typedef long long LL;
    14 const LL base = 131, mod = 1e9 + 7;
    15 vector<LL> v;
    16 LL c[maxn], ans[maxn];
    17  
    18 int cnt[maxn];
    19 int main() {
    20     int K, Q;
    21     scanf("%d %s %d", &K, s + 1, &Q);
    22     for(int i = 1; i <= Q; ++i) scanf("%d %d", ql + i, qr + i), id[i] = i;
    23     sz = sqrt(Q + 0.5), sort(id + 1, id + 1 + Q, cmp);
    24     int l = strlen(s + 1);
    25     for(int j = 0; j < 26; ++j) c[0] = (c[0] * base + sum[j]) % mod;
    26     v.push_back(c[0]);
    27     for(int i = 1; i <= l; ++i) {
    28         sum[s[i] - 'a'] = (sum[s[i] - 'a'] + 1) % K;
    29         for(int j = 0; j < 26; ++j) c[i] = (c[i] * base + sum[j]) % mod;
    30         v.push_back(c[i]);
    31     }
    32     sort(v.begin(), v.end());
    33     v.erase(unique(v.begin(), v.end()), v.end());
    34     for(int i = 0; i <= l; ++i) c[i] = lower_bound(v.begin(), v.end(), c[i]) - v.begin() + 1;
    35     LL tmp = 0;
    36     int L = 1, R = 0;
    37     cnt[c[0]]++;
    38     for(int i = 1; i <= Q; ++i) {
    39         int x = id[i];
    40         while (L < ql[x]) {
    41             cnt[c[L-1]]--;
    42             tmp -= cnt[c[L-1]];
    43             ++L;
    44         }
    45         while (L > ql[x]) {
    46             --L;
    47             tmp += cnt[c[L-1]];
    48             cnt[c[L-1]]++;
    49         }
    50         while (R < qr[x]) {
    51             ++R;
    52             tmp += cnt[c[R]];
    53             cnt[c[R]]++;
    54         }
    55         while (R > qr[x]) {
    56             cnt[c[R]]--;
    57             tmp -= cnt[c[R]];
    58             --R;
    59         }
    60         ans[x] = tmp;
    61     }
    62     for(int i = 1; i <= Q; ++i) printf("%lld
    ", ans[i]);
    63     return 0;
    64 }
    Aguin
  • 相关阅读:
    数据结构3——图
    数据结构2——树
    数据结构1——堆栈和队列
    最大流——Dinic算法
    最大流——EK算法
    网络流——poj1273(入门)
    网络流(进阶)
    网络流
    并查集——poj1182(带权并查集高阶)
    并查集——poj1308(并查集延伸)
  • 原文地址:https://www.cnblogs.com/Aguin/p/9280306.html
Copyright © 2011-2022 走看看