• 2019 Multi-University Training Contest 1


    Path

     先跑两遍最短路,正着一边,反着一遍,求出最短路的图,在新图上求最小割

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 const int maxn=1e4+7;
      4 const int maxm=2e4+7;
      5 #define ll long long
      6 int v[maxn],u[maxn],w[maxn],t1;
      7 long long d[maxn],d1[maxn];
      8 struct node1
      9 {
     10     long long t,n,w;
     11 } E[maxm];
     12 
     13 const  ll inf=0x3f3f3f3f3f3f3f3f;
     14 
     15 inline read()
     16 {
     17     int f=1,res=0;
     18     char ch=getchar();
     19     while (!isdigit(ch))
     20     {
     21         if (ch=='-')
     22         {
     23             f=-f;
     24         }
     25         ch=getchar();
     26     }
     27     while (isdigit(ch))
     28     {
     29         res=res*10+ch-'0';
     30         ch=getchar();
     31     }
     32     return res*f;
     33 }
     34 
     35 struct Dinic
     36 {
     37     struct Edge
     38     {
     39         int next,  to;
     40         ll f;
     41     } e[maxm];
     42     int head[maxn], dep[maxn], tol, ans;
     43     int cur[maxn];
     44     int src, sink, n;
     45     void add(int u, int v, ll f)
     46     {
     47         tol++;
     48         e[tol].to = v;
     49         e[tol].next = head[u];
     50         e[tol].f = f;
     51         head[u] = tol;
     52         tol++;
     53         e[tol].to = u;
     54         e[tol].next = head[v];
     55         e[tol].f = 0;
     56         head[v] = tol;
     57     }
     58 
     59     bool bfs()
     60     {
     61         queue<int> q;
     62         memset(dep, -1, sizeof(dep));
     63         q.push(src);
     64         dep[src] = 0;
     65         while (!q.empty())
     66         {
     67             int now = q.front();
     68             q.pop();
     69             for (int i = head[now]; i; i = e[i].next)
     70             {
     71                 if (dep[e[i].to] == -1 && e[i].f)
     72                 {
     73                     dep[e[i].to] = dep[now] + 1;
     74                     if (e[i].to == sink)
     75                         return true;
     76                     q.push(e[i].to);
     77                 }
     78             }
     79         }
     80         return false;
     81     }
     82 
     83     ll dfs(int x, ll maxx)
     84     {
     85         if (x == sink)
     86             return maxx;
     87         for (int &i = cur[x]; i; i = e[i].next)
     88         {
     89             if (dep[e[i].to] == dep[x] + 1 && e[i].f > 0)
     90             {
     91                 ll flow = dfs(e[i].to, min(maxx, e[i].f));
     92                 if (flow)
     93                 {
     94                     e[i].f -= flow;
     95                     e[i ^ 1].f += flow;
     96                     return flow;
     97                 }
     98             }
     99         }
    100         return 0;
    101     }
    102 
    103     ll dinic(int s, int t)
    104     {
    105         ans = 0;
    106         this->src = s;
    107         this->sink = t;
    108         while (bfs())
    109         {
    110             for (int i = 0; i <= n; i++)
    111                 cur[i] = head[i];
    112             while (ll d = dfs(src, inf))
    113                 ans += d;
    114         }
    115         return ans;
    116     }
    117 
    118     void init(int n)
    119     {
    120         this->n=n;
    121         memset(head, 0, sizeof(head));
    122         tol = 1;
    123     }
    124 } G;
    125 
    126 
    127 struct Dijkstra
    128 {
    129     struct Edge
    130     {
    131         int next,  to ,w;
    132     } e[maxm];
    133     int head[maxn],v[maxn],tol;
    134     void add(int u, int v, int w)
    135     {
    136         tol++;
    137         e[tol].to = v;
    138         e[tol].next = head[u];
    139         e[tol].w = w;
    140         head[u] = tol;
    141     }
    142     priority_queue<pair<long long,int>,vector<pair<long long,int> >,greater<pair<long long,int> > >q1;
    143     void dijkstra(int s)
    144     {
    145         memset(d,inf,sizeof(d));
    146         memset(v,0,sizeof(v));
    147         d[s] = 0;
    148         q1.push(make_pair(0, s));
    149         while (!q1.empty())
    150         {
    151             int x = q1.top().second;
    152             q1.pop();
    153             if (!v[x])
    154             {
    155                 v[x] = 1;
    156                 for (register int i = head[x]; i; i = e[i].next)
    157                 {
    158                     int to=e[i].to;
    159                     if (d[to] > d[x] + e[i].w)
    160                     {
    161                         d[to] = d[x] + e[i].w;
    162                         q1.push(make_pair(d[to], to));
    163                     }
    164                 }
    165             }
    166         }
    167     }
    168 
    169     void init()
    170     {
    171         memset(head, 0, sizeof(head));
    172         tol = 0;
    173     }
    174 } H;
    175 
    176 
    177 int main()
    178 {
    179     int tt,n,m;;
    180     tt=read();
    181     while (tt--)
    182     {
    183         n=read();m=read();
    184         H.init();
    185         for (register int i=1; i<=m; ++i)
    186         {
    187             u[i]=read();v[i]=read();w[i]=read();
    188             H.add(u[i],v[i],w[i]);
    189         }
    190         H.dijkstra(1);
    191         if (d[n]==inf)
    192         {
    193             printf("0
    ");
    194             continue;
    195         }
    196         for (int i=1; i<=n; i++)
    197         {
    198             d1[i]=d[i];
    199         }
    200         H.init();
    201         for (register int i=1; i<=m; ++i)
    202         {
    203             H.add(v[i],u[i],w[i]);
    204         }
    205         H.dijkstra(n);
    206         G.init(n);
    207         for (int i=1; i<=m; i++)
    208         {
    209             if (d1[u[i]]+d[v[i]]+w[i]==d1[n])
    210             {
    211                 G.add(u[i],v[i],w[i]);
    212             }
    213         }
    214         printf("%lld
    ",G.dinic(1,n));
    215     }
    216 }
    View Code

     

     

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int N=100010;
     5 int n,l[N],s[N],v[N];
     6 double ans,len;
     7 
     8 int main()
     9 {
    10     while (~scanf("%d",&n))
    11     {
    12         ans=len=0;
    13         for (int i=0; i<=n; i++)
    14         {
    15             scanf("%d",&l[i]);
    16             if (i)
    17             {
    18                 len+=l[i];
    19             }
    20         }
    21         for (int i=0; i<=n; i++)
    22         {
    23             scanf("%d",&s[i]);
    24         }
    25         for (int i=0; i<=n; i++)
    26         {
    27             scanf("%d",&v[i]);
    28         }
    29         for (int i=n;i>=0;i--){
    30             ans=max(ans,(len+s[i])/v[i]);
    31             len-=l[i];
    32         }
    33         printf("%.10lf
    ",ans);
    34 
    35     }
    36 }
    View Code

     

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N=500010;
     4 int f[N][32],pos[N][32],t,n,m,x,ans,k,l,r,a[N],tmp;
     5 void add(int i,int x) {
     6     int k = i;
     7     for (int j = 30; j >= 0; j--) {
     8         f[i][j] = f[i - 1][j];
     9         pos[i][j] = pos[i - 1][j];
    10     }
    11     for (int j = 30; j >= 0; j--)
    12         if (x >> j) {
    13             if (!f[i][j]) {
    14                 f[i][j] = x;
    15                 pos[i][j] = k;
    16                 break;
    17             } else {
    18                 if (k > pos[i][j]) {
    19                     swap(k, pos[i][j]);
    20                     swap(x, f[i][j]);
    21                 }
    22                 x ^= f[i][j];
    23             }
    24         }
    25 }
    26 
    27 int main() {
    28     scanf("%d", &t);
    29     while (t--) {
    30 
    31         memset(f, 0, sizeof(f));
    32         memset(pos, 0, sizeof(pos));
    33 
    34         scanf("%d%d", &n, &m);
    35         for (int i = 1; i <= n; i++) {
    36             scanf("%d", &a[i]);
    37             add(i, a[i]);
    38         }
    39         ans = 0;
    40         while (m--) {
    41             scanf("%d", &k);
    42             if (k) {
    43                 scanf("%d", &x);
    44                 a[++n] = x ^ ans;
    45                 add(n, a[n]);
    46             } else {
    47                 scanf("%d%d", &l, &r);
    48                 l = (l ^ ans) % n + 1;
    49                 r = (r ^ ans) % n + 1;
    50                 if (l > r) {
    51                     swap(l, r);
    52                 }
    53                 ans = 0;
    54                 for (int j = 30; j >= 0; j--) {
    55                     if ((ans ^ f[r][j]) > ans && pos[r][j] >= l) ans ^= f[r][j];
    56                 }
    57                 printf("%d
    ", ans);
    58             }
    59         }
    60 
    61     }
    62 }
    View Code

     

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn=30;
     5 int l[maxn],r[maxn],num[maxn];
     6 int sum[100010][maxn];
     7 char s[100010],ans[100010];
     8 int len,k;
     9 int main() {
    10     while (~scanf("%s%d", s + 1, &k)) {
    11         queue<int> q[30];
    12         len = strlen(s + 1);
    13         memset(num, 0, sizeof(num));
    14         memset(sum, 0, sizeof(sum));
    15         for (int i = 0; i < 26; i++) {
    16             scanf("%d%d", &l[i], &r[i]);
    17         }
    18         for (int i = 1; i <= len; i++) {
    19             q[s[i] - 'a'].push(i);
    20         }
    21         for (int i = len; i >= 1; i--) {
    22             for (int j = 0; j < 26; j++) {
    23                 sum[i][j] = sum[i + 1][j] + (s[i] == ('a' + j));
    24             }
    25         }
    26         int now = 0;
    27         int flag = 0;
    28         int cntt = 0;
    29         for (int i = 1; i <= k; i++) {
    30             for (int j = 0; j < 26; j++) {
    31                 if (num[j] == r[j]) continue;
    32                 while (!q[j].empty() && now >= q[j].front()) q[j].pop();
    33                 if (!q[j].empty()) {
    34                     int f = 0;
    35                     int cnt = q[j].front();
    36                     num[j]++;
    37                     for (int k = 0; k < 26; k++) {
    38                         if (num[k] + sum[cnt + 1][k] < l[k]) {
    39                             num[j]--;
    40                             f = 1;
    41                             break;
    42                         }
    43                     }
    44                     if (f) continue;
    45                     int minn = 0, maxn = 0;
    46                     for (int k = 0; k < 26; k++) {
    47                         minn += max(l[k] - num[k], 0);
    48                         maxn += min(r[k] - num[k], sum[cnt + 1][k]);
    49                     }
    50                     if (minn + i <= k && maxn + i >= k) {
    51                         ans[cntt++] = 'a' + j;
    52                         now = q[j].front();
    53                         break;
    54                     } else {
    55                         num[j]--;
    56                     }
    57                 }
    58             }
    59             if (cntt != i) {
    60                 break;
    61             }
    62         }
    63         if (cntt == k) {
    64             ans[k] = '';
    65             printf("%s
    ", ans);
    66         } else {
    67             puts("-1");
    68         }
    69     }
    70 }
    View Code

    思路:先跑出每个位置的字母出现次数的后缀和,然后从前到后依次构造字符串。如果当前字符s[i]的r[i]为0,那么显然不选进入下一个判断;如果选中这个字符之后,所有字母的最小出现次数l[i]的正值之和大于剩下的长度k,那么不选择这个字符,否则比较这个字符和前一个确定的字符,如果当前的字符字典序较小,如果后面位置的前一个字符的个数大于它的最少出现次数+1,那么说明可以在后面进行选择,所以用当前字符替换掉上一个字符。直到跑出长度为k的子序列并且所有l[i]<=0。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1e5+10;
     4 char s[maxn];
     5 stack <char> st;
     6 vector <char> vec;
     7 int sum[maxn][30];
     8 int l[30],r[30];
     9 int main()
    10 {
    11     int k;
    12     while(~scanf("%s%d",s,&k)) {
    13         memset(sum,0,sizeof(sum));
    14         int len=strlen(s);
    15         vec.clear();
    16         while(!st.empty()) st.pop();
    17         for(int i=0;i<26;i++)
    18             scanf("%d%d",&l[i],&r[i]);
    19         for(int i=len-1;i>=0;i--){
    20             for(int j=0;j<26;j++)
    21                 if(s[i]-'a'==j) sum[i][j]=sum[i+1][j]+1;
    22                 else sum[i][j]=sum[i+1][j];
    23         }
    24         for(int i=0;i<len&&k;i++){
    25             int x=s[i]-'a';
    26             if(!r[x]) continue;
    27             int cnt=0;
    28             l[x]--,r[x]--,k--;
    29             for(int j=0;j<26;j++)
    30                 if(l[j]>0)
    31                     cnt+=l[j];
    32             if(cnt>k){
    33                 l[x]++,r[x]++,k++;
    34                 continue;
    35             }
    36             while(!st.empty()&&s[i]<st.top()){ //字典序比确定的前一位小
    37                 x=st.top()-'a';
    38                 if(l[x]+1>sum[i+1][x]) //判断后面是否还有l[x]+1个可供选择
    39                     break;
    40                 l[x]++,r[x]++,k++;
    41                 st.pop();
    42             }
    43             st.push(s[i]);
    44         }
    45         int flag=1;
    46         for(int i=0;i<26;i++){
    47             if(l[i]>0){
    48                 flag=0;
    49                 break;
    50             }
    51         }
    52         if(!flag||k) puts("-1");
    53         else{
    54             while(!st.empty()){
    55                 vec.push_back(st.top());
    56                 st.pop();
    57             }
    58             for(int i=vec.size()-1;i>=0;i--)
    59                 printf(i>0?"%c":"%c
    ",vec[i]);
    60         }
    61     }
    62     return 0;
    63 }
    View Code
  • 相关阅读:
    移动web性能优化从入门到进阶
    授权保存到相册
    授权通讯地址
    windows putty 链接到 linux 免密码
    my docker note
    docker run -i -t --rm
    Command Not Found
    firewall-cmd 笔记
    vim 插件 Tabularize
    vim :find
  • 原文地址:https://www.cnblogs.com/Accpted/p/11228054.html
Copyright © 2020-2023  润新知