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
原文地址:https://www.cnblogs.com/Accpted/p/11228054.html