結果
問題 | No.1288 yuki collection |
ユーザー |
![]() |
提出日時 | 2020-12-05 01:21:44 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 138 ms / 5,000 ms |
コード長 | 11,314 bytes |
コンパイル時間 | 2,882 ms |
コンパイル使用メモリ | 218,136 KB |
最終ジャッジ日時 | 2025-01-16 16:46:06 |
ジャッジサーバーID (参考情報) |
judge5 / judge6 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 40 |
ソースコード
#pragma GCC optimize ("Ofast")#include<bits/stdc++.h>using namespace std;void*wmem;char memarr[96000000];template<class S, class T> inline S min_L(S a,T b){return a<=b?a:b;}template<class S, class T> inline S max_L(S a,T b){return a>=b?a:b;}template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};(*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );(*arr)=(T*)(*mem);(*mem)=((*arr)+x);}template<class T> inline void walloc1d(T **arr, int x1, int x2, void **mem = &wmem){walloc1d(arr, x2-x1, mem);(*arr) -= x1;}inline int my_getchar_unlocked(){static char buf[1048576];static int s = 1048576;static int e = 1048576;if(s == e && e == 1048576){e = fread_unlocked(buf, 1, 1048576, stdin);s = 0;}if(s == e){return EOF;}return buf[s++];}inline void rd(int &x){int k;int m=0;x=0;for(;;){k = my_getchar_unlocked();if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){x=k-'0';break;}}for(;;){k = my_getchar_unlocked();if(k<'0'||k>'9'){break;}x=x*10+k-'0';}if(m){x=-x;}}inline void rd(long long &x){int k;int m=0;x=0;for(;;){k = my_getchar_unlocked();if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){x=k-'0';break;}}for(;;){k = my_getchar_unlocked();if(k<'0'||k>'9'){break;}x=x*10+k-'0';}if(m){x=-x;}}inline void rd(char &c){int i;for(;;){i = my_getchar_unlocked();if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF){break;}}c = i;}inline int rd(char c[]){int i;int sz = 0;for(;;){i = my_getchar_unlocked();if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF){break;}}c[sz++] = i;for(;;){i = my_getchar_unlocked();if(i==' '||i=='\n'||i=='\r'||i=='\t'||i==EOF){break;}c[sz++] = i;}c[sz]='\0';return sz;}struct MY_WRITER{char buf[1048576];int s;int e;MY_WRITER(){s = 0;e = 1048576;}~MY_WRITER(){if(s){fwrite_unlocked(buf, 1, s, stdout);}}};MY_WRITER MY_WRITER_VAR;void my_putchar_unlocked(int a){if(MY_WRITER_VAR.s == MY_WRITER_VAR.e){fwrite_unlocked(MY_WRITER_VAR.buf, 1, MY_WRITER_VAR.s, stdout);MY_WRITER_VAR.s = 0;}MY_WRITER_VAR.buf[MY_WRITER_VAR.s++] = a;}inline void wt_L(char a){my_putchar_unlocked(a);}inline void wt_L(int x){int s=0;int m=0;char f[10];if(x<0){m=1;x=-x;}while(x){f[s++]=x%10;x/=10;}if(!s){f[s++]=0;}if(m){my_putchar_unlocked('-');}while(s--){my_putchar_unlocked(f[s]+'0');}}inline void wt_L(long long x){int s=0;int m=0;char f[20];if(x<0){m=1;x=-x;}while(x){f[s++]=x%10;x/=10;}if(!s){f[s++]=0;}if(m){my_putchar_unlocked('-');}while(s--){my_putchar_unlocked(f[s]+'0');}}template<class S, class T> inline S chmin(S &a, T b){if(a>b){a=b;}return a;}template <class T> struct LHeap{int*hp;int*place;int size;T*val;void malloc(int N){hp = (int*)std::malloc(N*sizeof(int));place=(int*)std::malloc(N*sizeof(int));val=(T*)std::malloc(N*sizeof(T));}void malloc(int N, int ini){hp = (int*)std::malloc(N*sizeof(int));place=(int*)std::malloc(N*sizeof(int));val=(T*)std::malloc(N*sizeof(T));if(ini){init(N);}}void walloc(int N, void **mem=&wmem){walloc1d(&hp, N, mem);walloc1d(&place, N, mem);walloc1d(&val, N, mem);}void walloc(int N, int ini, void **mem=&wmem){walloc1d(&hp, N, mem);walloc1d(&place, N, mem);walloc1d(&val, N, mem);if(ini){init(N);}}void free(){std::free(hp);std::free(place);std::free(val);}void init(int N){int i;size=0;for(i=(0);i<(N);i++){place[i]=-1;}}void up(int n){int m;while(n){m=(n-1)/2;if(val[hp[m]]<=val[hp[n]]){break;}swap(hp[m],hp[n]);swap(place[hp[m]],place[hp[n]]);n=m;}}void down(int n){int m;for(;;){m=2*n+1;if(m>=size){break;}if(m+1<size&&val[hp[m]]>val[hp[m+1]]){m++;}if(val[hp[m]]>=val[hp[n]]){break;}swap(hp[m],hp[n]);swap(place[hp[m]],place[hp[n]]);n=m;}}void change(int n, T v){T f = val[n];val[n] = v;if(place[n]==-1){place[n] = size;hp[size++] = n;up(place[n]);}else{if(f < v){down(place[n]);}else if(f > v){up(place[n]);}}}int pop(void){int res = hp[0];place[res] = -1;size--;if(size){hp[0]=hp[size];place[hp[0]]=0;down(0);}return res;}};template<class FT, class CT> struct minCostFlow{int node;int*es;int*emem;int**edge;int**rev;FT**flow;FT f_eps;CT**cost;CT*potential;CT c_eps;LHeap<CT> hp;char*reached;FT*cur_flow;CT*cur_cost;int*back_edge;void malloc(int N){int i;es = (int*)std::malloc(N*sizeof(int));emem = (int*)std::malloc(N*sizeof(int));edge = (int**)std::malloc(N*sizeof(int*));rev = (int**)std::malloc(N*sizeof(int*));flow = (FT**)std::malloc(N*sizeof(FT*));cost = (CT**)std::malloc(N*sizeof(CT*));for(i=(0);i<(N);i++){emem[i] = 0;edge[i] = rev[i] = NULL;flow[i] = NULL;cost[i] = NULL;}hp.malloc(N);reached = (char*)std::malloc(N*sizeof(char));cur_flow = (FT*)std::malloc(N*sizeof(FT));cur_cost = (CT*)std::malloc(N*sizeof(CT));potential = (CT*)std::malloc(N*sizeof(CT));back_edge = (int*)std::malloc(N*sizeof(int));node = N;for(i=(0);i<(N);i++){es[i] = 0;}f_eps = (FT)1e-9;c_eps = (CT)1e-9;}void init(int N){int i;node = N;for(i=(0);i<(N);i++){es[i] = 0;}f_eps = (FT)1e-9;c_eps = (CT)1e-9;}void memoryExpand(int i, int sz){if(sz <= emem[i]){return;}sz =max_L(max_L(sz, 3), 2*emem[i]);emem[i] = sz;edge[i] = (int*)realloc(edge[i], sz*sizeof(int));rev[i] = (int*)realloc(rev[i], sz*sizeof(int));flow[i] = (FT*)realloc(flow[i], sz*sizeof(FT));cost[i] = (CT*)realloc(cost[i], sz*sizeof(CT));}void addEdge(int n1, int n2, FT f, CT c){int s1 = es[n1]++;int s2 = es[n2]++;if(s1 >= emem[n1]){memoryExpand(n1, es[n1]);}if(s2 >= emem[n2]){memoryExpand(n2, es[n2]);}edge[n1][s1] = n2;edge[n2][s2] = n1;rev[n1][s1] = s2;rev[n2][s2] = s1;flow[n1][s1] = f;flow[n2][s2] = 0;cost[n1][s1] = c;cost[n2][s2] = -c;}template<class FTS, class CTS> void solve(int st, int ed, FTS &fres, CTS &cres, FT flim = -1, CT clim = 0){int i;int j;int k;int l;FT f;CT nc;fres = 0;cres = 0;for(i=(0);i<(node);i++){potential[i] = 0;}for(;;){if(flim >= -f_eps && flim <= f_eps){break;}hp.init(node);for(i=(0);i<(node);i++){reached[i] = 0;}reached[st] = 1;cur_cost[st] = 0;l = 0;hp.change(st, cur_cost[st]);while(hp.size){i = hp.pop();for(j=(0);j<(es[i]);j++){if(flow[i][j] <= f_eps){continue;}k = edge[i][j];nc = cur_cost[i] + cost[i][j] + potential[i] - potential[k];if(reached[k]==0 || cur_cost[k] > nc+c_eps){reached[k] = 1;cur_cost[k] = nc;cur_flow[k] = flow[i][j];if(i != st){chmin(cur_flow[k], cur_flow[i]);}back_edge[k] = rev[i][j];hp.change(k, cur_cost[k]);}}}if(reached[ed]==0){break;}if(flim==-2 && cur_cost[ed] + potential[ed] >= clim){break;}f = cur_flow[ed];if(flim >= -f_eps){chmin(f, flim);flim -= f;}if(f <= f_eps){break;}for(i=(0);i<(node);i++){if(reached[i]){potential[i] += cur_cost[i];}}fres += f;cres += f * potential[ed];i = ed;while(i != st){j = back_edge[i];k = edge[i][j];flow[i][j] += f;flow[k][rev[i][j]] -= f;i = k;}}}};int N;char S[2002];long long A[2000];int ps[4];int p[4][2001];int main(){wmem = memarr;int i;int j;int k;minCostFlow<int,long long> f;int node;int st;int ed;long long cost;long long flow;rd(N);rd(S);{int Lj4PdHRW;for(Lj4PdHRW=(0);Lj4PdHRW<(N);Lj4PdHRW++){rd(A[Lj4PdHRW]);}}node = N;st = node++;ed = node++;f.malloc(node);f.init(node);for(i=(0);i<(N);i++){if(S[i]=='y'){p[0][ps[0]++] = i;}if(S[i]=='u'){p[1][ps[1]++] = i;}if(S[i]=='k'){p[2][ps[2]++] = i;}if(S[i]=='i'){p[3][ps[3]++] = i;}}int RZTsC2BF;int FmcKpFmN;if(4==0){FmcKpFmN = 0;}else{FmcKpFmN = ps[0];for(RZTsC2BF=(1);RZTsC2BF<(4);RZTsC2BF++){FmcKpFmN = min_L(FmcKpFmN, ps[RZTsC2BF]);}}if(FmcKpFmN==0){wt_L(0);wt_L('\n');return 0;}f.addEdge(st, p[0][0], 1073709056, 0LL);for(i=(0);i<(ps[3]);i++){f.addEdge(p[3][i], ed, 1, 1000000000-A[p[3][i]]);}for(k=(0);k<(4);k++){for(i=(1);i<(ps[k]);i++){f.addEdge(p[k][i-1], p[k][i], 1073709056, 0LL);}}for(k=(0);k<(3);k++){j = 0;for(i=(0);i<(ps[k]);i++){while(j < ps[k+1] && p[k+1][j] < p[k][i]){j++;}if(j == ps[k+1]){break;}f.addEdge(p[k][i], p[k+1][j], 1, 1000000000-A[p[k][i]]);}}f.solve(st, ed, flow, cost, -2, 4000000000LL);wt_L(4000000000LL*flow - cost);wt_L('\n');return 0;}// cLay version 20201204-1 [beta]// --- original code ---// int N;// char S[2002];// ll A[2000];// int ps[4], p[4][2001];// {// int i, j, k;// minCostFlow<int,ll> f;// int node, st, ed;// ll cost, flow;// rd(N,S,A(N));//// node = N;// st = node++;// ed = node++;//// f.malloc(node);// f.init(node);//// rep(i,N){// if(S[i]=='y') p[0][ps[0]++] = i;// if(S[i]=='u') p[1][ps[1]++] = i;// if(S[i]=='k') p[2][ps[2]++] = i;// if(S[i]=='i') p[3][ps[3]++] = i;// }// if(min(ps(4))==0) wt(0), return 0;//// f.addEdge(st, p[0][0], int_inf, 0LL);// rep(i,ps[3]) f.addEdge(p[3][i], ed, 1, 1d9-A[p[3][i]]);// rep(k,4) rep(i,1,ps[k]) f.addEdge(p[k][i-1], p[k][i], int_inf, 0LL);// rep(k,3){// j = 0;// rep(i,ps[k]){// while(j < ps[k+1] && p[k+1][j] < p[k][i]) j++;// if(j == ps[k+1]) break;// f.addEdge(p[k][i], p[k+1][j], 1, 1d9-A[p[k][i]]);// }// }//// f.solve(st, ed, flow, cost, -2, 4d9);// wt(4d9*flow - cost);// }