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 }

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 }

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 }

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] = '