2020牛客暑期多校训练营(第三场)
A | Clam and Fish |
B | Classical String Problem |
C |
D | Points Construction Problem |
E | Two Matchings |
我的我的锅,这道题没看,后期约等于挂机了
题意:给你一个序列a,你要找到两种完全不同的整个序列的两两匹配,使得所有两两匹配差的绝对值的和最小,输出这个和
思考:因为需要两个不同序列的的绝对值最小,只需要:
第一个序列价格相邻最小的进行匹配即可
第二个序列只需要在4和6之间找最小的匹配即可
卡了一下cin
#include <iostream> #include <cstring> #include <string> #include <cmath> #include <cstdio> #include <stdio.h> #include <cstdlib> #include <algorithm> #include <vector> #include <set> #include <map> #include <queue> #include <iomanip> #define rep(i,a,b) for(int i = a; i <= b ; i ++ ) #define pre(i,a,b) for(int i = b ; i >= a ; i --) #define ll long long #define inf 0x3f3f3f3f3f3f3fll #define ull unsigned long long #define ios ios::sync_with_stdio(false),cin.tie(0) using namespace std; typedef pair<int,int> PII ; const int N=2e6+10,mod=998244353,p=233; int t,n; int a[N],f[N]; int main() { ios; scanf("%d",&t); while(t--) { scanf("%d",&n); rep(i,1,n) scanf("%lld",&a[i]); sort(a+1,a+1+n); rep(i,1,n) f[i]=inf; f[0]=0; for(int i = 4; i <= n; i += 2) { if(i >= 6) f[i] = min(f[i], f[i - 6] + a[i] - a[i - 5]); f[i] = min(f[i], f[i - 4] + a[i] - a[i - 3]); } printf("%lld\n", 2 * f[n]); } return 0; }
F | Fraction Construction Problem |
G | Operating on a Graph |
题意:
当时没有看这道题,当时估计是看了也不会,因为不熟悉并查集的操作,注意点:
1、将相同颜色的使用并查集连接起来就好
2、然后使用vector或者是list来记录相邻的点就好
/*** * ii. ;9ABH, * SA391, .r9GG35&G * i3X31i;:,rB1 * iMs,:,i5895, .5G91:,:;:s1:8A * 33::::,,;5G5, ,58Si,,:::,sHX;iH1 * Sr.,:;rs13BBX35hh11511h5Shhh5S3GAXS:.,,::,,1AG3i,GG * .G51S511sr;;iiiishS8G89Shsrrsh59S;.,,,,,..5A85Si,h8 * :SB9s:,............................,,,.,,,SASh53h,1G. * .r18S;..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,....,,.1H315199,rX, * ;S89s,..,,,,,,,,,,,,,,,,,,,,,,,....,,.......,,,;r1ShS8,;Xi * i55s:.........,,,,,,,,,,,,,,,,.,,,......,.....,,....r9&5.:X1 * 59;.....,. .,,,,,,,,,,,... .............,..:1;.:&s * s8,..;53S5S3s. .,,,,,,,.,.. i15S5h1:.........,,,..,,:99 * 93.:39s:rSGB@A; ..,,,,..... .SG3hhh9G&BGi..,,,,,,,,,,,,.,83 * G5.G8 9#@@@@@X. .,,,,,,..... iA9,.S&B###@@Mr...,,,,,,,,..,.;Xh * Gs.X8 S@@@@@@@B:..,,,,,,,,,,. rA1 ,A@@@@@@@@@H:........,,,,,,.iX: * ;9. ,8A#@@@@@@#5,.,,,,,,,,,... 9A. 8@@@@@@@@@@M; ....,,,,,,,,S8 * X3 iS8XAHH8s.,,,,,,,,,,...,..58hH@@@@@@@@@Hs ...,,,,,,,:Gs * r8, ,,,...,,,,,,,,,,..... ,h8XABMMHX3r. .,,,,,,,.rX: * :9, . .:,..,:;;;::,.,,,,,.. .,,. ..,,,,,,.59 * .Si ,:.i8HBMMMMMB&5,.... . .,,,,,.sMr * SS :: h@@@@@@@@@@#; . ... . ..,,,,iM5 * 91 . ;:.,1&@@@@@@MXs. . .,,:,:&S * hS .... .:;,,,i3MMS1;..,..... . . ... ..,:,.99 * ,8; ..... .,:,..,8Ms:;,,,... .,::.83 * s&: .... .sS553B@@HX3s;,. .,;13h. .:::&1 * SXr . ...;s3G99XA&X88Shss11155hi. ,;:h&, * iH8: . .. ,;iiii;,::,,,,,. .;irHA * ,8X5; . ....... ,;iihS8Gi * 1831, .,;irrrrrs&@ * ;5A8r. .:;iiiiirrss1H * :X@H3s....... .,:;iii;iiiiirsrh * r#h:;,...,,.. .,,:;;;;;:::,... .:;;;;;;iiiirrss1 * ,M8 ..,....,.....,,::::::,,... . .,;;;iiiiiirss11h * 8B;.,,,,,,,.,..... . .. .:;;;;iirrsss111h * i@5,:::,,,,,,,,.... . . .:::;;;;;irrrss111111 * 9Bi,:,,,,...... ..r91;;;;;iirrsss1ss1111 狗头真帅*/ #include <iostream> #include <cstring> #include <string> #include <cmath> #include <cstdio> #include <stdio.h> #include <cstdlib> #include <algorithm> #include <vector> #include <set> #include <map> #include <queue> #include <iomanip> #include <list> #define pub(n) push_back(n) #define pob(n) pop_back(n) #define sf(n) scanf("%d",&n) #define pf(n) printf("%d\n",n) #define slf(n) scanf("lld",&n) #define plf(n) printf("lld\n",&n) #define rep(i,a,b) for(int i = a; i <= b ; i ++ ) #define pre(i,a,b) for(int i = a ; i >= b ; i --) #define ll long long #define PII pair<int,int> #define inf 0x3f3f3f3f3f3f3fll #define ull unsigned long long #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; const int N=2e6+10,mod=1e9+7; int f[N],t,i,n,m,x,y,q,u; int find(int x) { if (x!=f[x]) f[x]=find(f[x]); return f[x]; } list<int> G[N]; int main() { sf(t); while (t--) { sf(n),sf(m); for (i=0;i<n;i++) { f[i]=i; G[i].clear(); } while (m--) { sf(x),sf(y); G[x].push_back(y); G[y].push_back(x); } sf(q); while (q--) { sf(u); if (u!=find(u)) continue; list<int> s; for (auto v:G[u]) { x=find(v); if (x==u) continue; else f[x]=u; s.splice(s.end(),G[x]); } swap(s,G[u]); } for (i=0;i<n;i++) cout<<find(i)<<" "; cout<<endl; } return 0; }
H | Sort the Strings Revision |
补这道题完全是因为我看到笛卡尔树的时候是懵的, 所以想学学,结果细节操作没有学会,只学会了使用板子(差点把我心态搞炸)
通过二分来解:每次找到最小的Pi,将数列分成两部分,再继续递归,知道只有一个为止,然后比较大小就好
然后对于快速求区间内pi的值,可以使用笛卡尔树
/*** * ii. ;9ABH, * SA391, .r9GG35&G * i3X31i;:,rB1 * iMs,:,i5895, .5G91:,:;:s1:8A * 33::::,,;5G5, ,58Si,,:::,sHX;iH1 * Sr.,:;rs13BBX35hh11511h5Shhh5S3GAXS:.,,::,,1AG3i,GG * .G51S511sr;;iiiishS8G89Shsrrsh59S;.,,,,,..5A85Si,h8 * :SB9s:,............................,,,.,,,SASh53h,1G. * .r18S;..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,....,,.1H315199,rX, * ;S89s,..,,,,,,,,,,,,,,,,,,,,,,,....,,.......,,,;r1ShS8,;Xi * i55s:.........,,,,,,,,,,,,,,,,.,,,......,.....,,....r9&5.:X1 * 59;.....,. .,,,,,,,,,,,... .............,..:1;.:&s * s8,..;53S5S3s. .,,,,,,,.,.. i15S5h1:.........,,,..,,:99 * 93.:39s:rSGB@A; ..,,,,..... .SG3hhh9G&BGi..,,,,,,,,,,,,.,83 * G5.G8 9#@@@@@X. .,,,,,,..... iA9,.S&B###@@Mr...,,,,,,,,..,.;Xh * Gs.X8 S@@@@@@@B:..,,,,,,,,,,. rA1 ,A@@@@@@@@@H:........,,,,,,.iX: * ;9. ,8A#@@@@@@#5,.,,,,,,,,,... 9A. 8@@@@@@@@@@M; ....,,,,,,,,S8 * X3 iS8XAHH8s.,,,,,,,,,,...,..58hH@@@@@@@@@Hs ...,,,,,,,:Gs * r8, ,,,...,,,,,,,,,,..... ,h8XABMMHX3r. .,,,,,,,.rX: * :9, . .:,..,:;;;::,.,,,,,.. .,,. ..,,,,,,.59 * .Si ,:.i8HBMMMMMB&5,.... . .,,,,,.sMr * SS :: h@@@@@@@@@@#; . ... . ..,,,,iM5 * 91 . ;:.,1&@@@@@@MXs. . .,,:,:&S * hS .... .:;,,,i3MMS1;..,..... . . ... ..,:,.99 * ,8; ..... .,:,..,8Ms:;,,,... .,::.83 * s&: .... .sS553B@@HX3s;,. .,;13h. .:::&1 * SXr . ...;s3G99XA&X88Shss11155hi. ,;:h&, * iH8: . .. ,;iiii;,::,,,,,. .;irHA * ,8X5; . ....... ,;iihS8Gi * 1831, .,;irrrrrs&@ * ;5A8r. .:;iiiiirrss1H * :X@H3s....... .,:;iii;iiiiirsrh * r#h:;,...,,.. .,,:;;;;;:::,... .:;;;;;;iiiirrss1 * ,M8 ..,....,.....,,::::::,,... . .,;;;iiiiiirss11h * 8B;.,,,,,,,.,..... . .. .:;;;;iirrsss111h * i@5,:::,,,,,,,,.... . . .:::;;;;;irrrss111111 * 9Bi,:,,,,...... ..r91;;;;;iirrsss1ss1111 Õ桪¡ªÊÖ¶¯¹·Í·*/ #include <iostream> #include <cstring> #include <string> #include <cmath> #include <cstdio> #include <stdio.h> #include <cstdlib> #include <algorithm> #include <vector> #include <set> #include <map> #include <queue> #include <iomanip> #include <list> #define pub(n) push_back(n) #define pob(n) pop_back(n) #define sf(n) scanf("%d",&n) #define pf(n) printf("%d\n",n) #define slf(n) scanf("lld",&n) #define plf(n) printf("lld\n",&n) #define rep(i,a,b) for(int i = a; i <= b ; i ++ ) #define pre(i,a,b) for(int i = a ; i >= b ; i --) #define ll long long #define PII pair<int,int> #define inf 0x3f3f3f3f3f3f3fll #define ull unsigned long long #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) // ull gethash(int i,int j) { return hs[j]-hs[i-1]*base[j-i+1]; } // int Find(int x) {return fa[x]==x? x : fa[x]=Find(fa[x]);} using namespace std; const int MAXN=2e6+10; const int MOD=1e9+7; int st[MAXN],ls[MAXN],rs[MAXN]; ll p[MAXN],d[MAXN]; int r[MAXN]; ll sd,a,b,mod,ans,M; int n; void init(int n) { st[0]=0; for(int i=0; i<n; i++) { int k=st[0]; while(k>0&&p[st[k]]>p[i]) k--; if(k) rs[st[k]]=i; if(k<st[0]) ls[i]=st[k+1]; st[++k]=i; st[0]=k; } }//笛卡尔树 void dfs(int k,int left,int right,int rnk) { if(p[k]==inf||left>=right) { for(int i=left; i<=right; i++) r[i]=rnk+(i-left); //边界直接标记名次 return; } dfs(ls[k],left,k,rnk+(p[k]%10>d[k])*(right-k)); dfs(rs[k],k+1,right,rnk+(p[k]%10<d[k])*(k-left+1));//注意rnk的转移 } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); scanf("%lld%lld%lld%lld",&sd,&a,&b,&mod); for(int i=0; i<n; i++) p[i]=i; for(int i=1; i<n; i++) swap(p[sd%(i+1)],p[i]),sd=(sd*a%mod+b)%mod; scanf("%lld%lld%lld%lld",&sd,&a,&b,&mod); for(int i=0; i<n; i++) d[i]=sd%10,sd=(sd*a%mod+b)%mod; for(int i=0; i<n; i++) if(p[i]%10==d[i]) p[i]=inf;//如果无意义设为极大值 init(n);//建树 dfs(st[1],0,n,0);//dfs跑分治 ans=0; M=1; for(int i=0; i<=n; i++) ans=(ans+((r[i])*M)%MOD)%MOD,M=(M*10000019)%MOD;//按题意哈希 printf("%lld\n",ans); } }
I | Sorting the Array |
J | Operating on the Tree |
K | Eleven Game |
L | Problem L is the Only Lovely Problem |