codeforces:65
文章目錄
- 前言
- CF65A Harry Potter and Three Spells
- Description\text{Description}Description
- Solution\text{Solution}Solution
- Code\text{Code}Code
- CF65B Harry Potter and the History of Magic
- Description\text{Description}Description
- Solution\text{Solution}Solution
- Code\text{Code}Code
- CF65C Harry Potter and the Golden Snitch
- Description\text{Description}Description
- Solution\text{Solution}Solution
- Code\text{Code}Code
- CF65D Harry Potter and the Sorting Hat
- Description\text{Description}Description
- Solution\text{Solution}Solution
- Code\text{Code}Code
- CF65E Harry Potter and Moving Staircases
- Description\text{Description}Description
- Solution\text{Solution}Solution
- Code\text{Code}Code
前言
C和D題比較不錯,ABE都有億些很惡心的細節問題(尤其是E)
E題自己編寫1A的讀者,可以到@asta處領取8888元的現金紅包(bushi)
CF65A Harry Potter and Three Spells
Description\text{Description}Description
你可以用 aaa 克沙子得到 bbb 克葉子, ccc 克葉子得到 ddd 克金子,eee 克金子得到 fff 克沙子.
給出 a,b,c,d,e,fa,b,c,d,e,fa,b,c,d,e,f,求出是否可以通過有限的沙子得到無限的金子.
Solution\text{Solution}Solution
不難得出一個有解的條件:b×d×f>a×b×cb\times d\times f>a\times b\times cb×d×f>a×b×c.
但這是建立在六個變量均正的情況.
考慮有哪些有解的情況沒有考慮.
特判打全即可,不用開 longlong.
Code\text{Code}Code
#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=4e5+100; const int mod=998244353; //char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf; //#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }int n,m;signed main(){ #ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout); #endifint a=read(),b=read(),c=read(),d=read(),e=read(),f=read();if(b*d*f>a*c*e||(d&&c==0)||(d&&b&&a==0)) printf("Ron");else printf("Hermione"); } /* */CF65B Harry Potter and the History of Magic
Description\text{Description}Description
給你 nnn 個年份 x1...nx_{1...n}x1...n?.
請你更改一些數字,使年份按時間順序(即非遞減)排列,以使其中沒有任何日期晚于 201120112011 或早于 100010001000.
在每個日期中最多只能將一位數字改成別的數字.
1≤n≤10000,1000≤xi≤99991\le n\le10000,1000\le x_i\le99991≤n≤10000,1000≤xi?≤9999.
Solution\text{Solution}Solution
不難發現貪心策略,使前面的年份盡可能的小,一定是不劣的.
分情況討論,如果大于前一項,從高位開始嘗試往低改;如果小于前一項,就從低位開始嘗試往高改即可.
最后判一下是否超過 201120112011.
實現上,有一些上下取整的細節,但整體還不算太惡心.
Code\text{Code}Code
#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=4e5+100; const int mod=998244353; //char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf; //#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }int n,m; int a[1050],mi[5]={1,10,100,1000,10000}; inline int f(int x,int pos){return x%mi[pos+1]/mi[pos]; } signed main(){ #ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout); #endifn=read();for(int i=1;i<=n;i++) a[i]=read();a[0]=1000;for(int i=1;i<=n;i++){if(a[i]>=a[i-1]){int d=a[i]-a[i-1];for(int k=3;k>=0;k--){int o=f(a[i],k);if(!o||d<mi[k]) continue;a[i]-=min(d/mi[k]*mi[k],o*mi[k]);break;}}else{int d=a[i-1]-a[i];for(int k=0;k<=3;k++){int o=9-f(a[i],k);if(o*mi[k]<d) continue;a[i]+=(d+mi[k]-1)/mi[k]*mi[k];//printf("k=%d o=%d d=%d add=%d\n",k,o,d,(d+mi[k]-1)/mi[k]);break;}}//printf("%d\n",a[i]);if(a[i]<a[i-1]){printf("No solution");return 0;}}if(a[n]>2011) printf("No solution");else{for(int i=1;i<=n;i++) printf("%d\n",a[i]);} } /* */CF65C Harry Potter and the Golden Snitch
Description\text{Description}Description
有一個金色飛賊沿著 (x1,y1,z1)→(x2,y2,z2)→...→(xn,yn,zn)(x_1,y_1,z_1)\to (x_2,y_2,z_2)\to ...\to (x_n,y_n,z_n)(x1?,y1?,z1?)→(x2?,y2?,z2?)→...→(xn?,yn?,zn?) 的軌跡以 vsv_svs? 的速度勻速運動.
哈利的最大速度是 vpv_pvp?,初始位置是 (px,py,pz)(p_x,p_y,p_z)(px?,py?,pz?).
請求出哈利抓住金色飛賊的最快時間和抓住它的位置.
n≤10000,vp≥vsn\le 10000,v_p\ge v_sn≤10000,vp?≥vs?.
Solution\text{Solution}Solution
vp≥vsv_p\ge v_svp?≥vs? 是本題的關鍵條件,這意味著本題的答案是具有單調性的.
所以二分時間判斷是否可以抓到即可.
注意:
Code\text{Code}Code
#include<bits/stdc++.h> using namespace std; #define ll long long #define double long double #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=1e4+100; const double eps=1e-12; inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }int n,m; double t[N],sum[N],v; double x[N],y[N],z[N]; double X,Y,Z,V; inline double tim(double x,double y,double z){return sqrt((x-X)*(x-X)+(y-Y)*(y-Y)+(z-Z)*(z-Z))/V; } bool check(double w){for(int i=1;i<=n;i++){if(sum[i]>=w-eps){double o=(w-sum[i-1])/t[i];double xx=x[i-1]+(x[i]-x[i-1])*o,yy=y[i-1]+(y[i]-y[i-1])*o,zz=z[i-1]+(z[i]-z[i-1])*o;return tim(xx,yy,zz)-eps<w;}}return false; } signed main(){ #ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout); #endifn=read();for(int i=0;i<=n;i++) scanf("%Lf%Lf%Lf",&x[i],&y[i],&z[i]);scanf("%Lf%Lf%Lf%Lf%Lf",&V,&v,&X,&Y,&Z);for(int i=1;i<=n;i++){double d=sqrt((x[i]-x[i-1])*(x[i]-x[i-1])+(y[i]-y[i-1])*(y[i]-y[i-1])+(z[i]-z[i-1])*(z[i]-z[i-1]));t[i]=d/v;sum[i]=sum[i-1]+t[i];}if(tim(x[n],y[n],z[n])>sum[n]+eps){printf("NO\n");return 0;}double st=0,ed=sum[n];while(ed-st>eps){double mid=(st+ed)/2;if(check(mid)) ed=mid;else st=mid;}printf("YES\n%.10Lf\n",st);double w=st;for(int i=1;i<=n;i++){if(sum[i]>w-eps){double o=(w-sum[i-1])/t[i];double xx=x[i-1]+(x[i]-x[i-1])*o,yy=y[i-1]+(y[i]-y[i-1])*o,zz=z[i-1]+(z[i]-z[i-1])*o;printf("%.10Lf %.10Lf %.10Lf",xx+eps,yy+eps,zz+eps);return 0;}} } /* */CF65D Harry Potter and the Sorting Hat
Description\text{Description}Description
有 444 個變量 G,R,S,HG,R,S,HG,R,S,H,初始的值均為 000.
給出一個長度為 nnn 的字符串,從前往后進行以下過程:
求處理完整個字符串后,四個變量是否有可能成為(非嚴格)最小值.
n≤10000n\le 10000n≤10000
Solution\text{Solution}Solution
設計狀態為 (i,a,b,c,d)(i,a,b,c,d)(i,a,b,c,d) 表示進行到第 iii 個字符,四個變量分別為 a,b,c,da,b,c,da,b,c,d.
注意到,由于每次都只有在對相同的最小值加一時才會導致狀態的分裂,并且可能會再后面的問號時合并狀態,所以對于同一個 iii,狀態數是收斂的.
直接 dfs 暴搜加 hash 去重即可.
Code\text{Code}Code
#include<bits/stdc++.h> using namespace std; #define ll long long #define double long double #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=1e4+100; const double eps=1e-12; inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }int n,m; int x[N]; map<ll,bool>mp; bool vis[5]; void dfs(int k,int a,int b,int c,int d){int mn=min(a,min(b,min(c,d)));if(k>n){if(a==mn) vis[1]=1;if(b==mn) vis[2]=1;if(c==mn) vis[3]=1;if(d==mn) vis[4]=1;return;}ll o=1ll*a*(n+1)*(n+1)*(n+1)+1ll*b*(n+1)*(n+1)+1ll*c*(n+1)+d;if(mp[o]) return;if(x[k]){if(x[k]==1) dfs(k+1,a+1,b,c,d);else if(x[k]==2) dfs(k+1,a,b+1,c,d);else if(x[k]==3) dfs(k+1,a,b,c+1,d);else if(x[k]==4) dfs(k+1,a,b,c,d+1); }else{if(a==mn) dfs(k+1,a+1,b,c,d);if(b==mn) dfs(k+1,a,b+1,c,d);if(c==mn) dfs(k+1,a,b,c+1,d);if(d==mn) dfs(k+1,a,b,c,d+1);}mp[o]=1; } signed main(){ #ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout); #endifn=read();char c;for(int i=1;i<=n;i++){scanf(" %c",&c);if(c=='G') x[i]=1;else if(c=='H') x[i]=2;else if(c=='R') x[i]=3;else if(c=='S') x[i]=4;}dfs(1,0,0,0,0);if(vis[1]) printf("Gryffindor\n");if(vis[2]) printf("Hufflepuff\n");if(vis[3]) printf("Ravenclaw\n");if(vis[4]) printf("Slytherin\n"); } /* */CF65E Harry Potter and Moving Staircases
Description\text{Description}Description
有一個 nnn 個點 mmm 條邊的無向圖,哈利初始在結點 111,哈利可以沿著邊任意移動,過程中任意時刻可以選擇一條邊,改變它的一個端點,但是每條邊只能被修改一次.
請構造一種方案使哈利走遍所有樓層,或者報告無解.
n≤105,m≤2×105n\le 10^5,m\le 2\times10^5n≤105,m≤2×105
Solution\text{Solution}Solution
陰間大特判題.
容易找到一種比較正確的整體方案:dfs,過程中——
不難發現這樣一定是最優的.
然后就是 通過觀察 WA 的數據 處理億點點細節問題:
具體實現留給讀者自行思考.(或者參考我實現丑的一批的代碼)
Code\text{Code}Code
#include<bits/stdc++.h> using namespace std; #define ll long long #define double long double #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=4e5+100; const double eps=1e-12; inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }int n,m; struct node{int to,nxt; }p[N<<1]; int fi[N],cnt; inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return; } int jd[N],du[N]; set<int>s1,s2; int dfn[N<<2],tim,tot; struct edge{int x,y,id; }e[N]; int siz[N]; int ans[N],num; int flag,O,ID; void print(){int pl(1);if(!O) flag=0;printf("YES\n%d\n",tot+flag);for(int i=1;i<=tim+1;i++){if(dfn[i]) ans[++num]=dfn[i];else{printf("%d ",num);for(int j=1;j<=num;j++) printf("%d ",ans[j]);putchar('\n'); num=0;if(pl<=tot){printf("%d %d %d\n",e[pl].id,e[pl].x,e[pl].y); ++pl;}}if(i==1&&flag){printf("1 1\n%d %d 1\n",ID,O);num=0;}}return; } int fa[N]; vector<int> v[N]; int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} bool vis[N]; void dfs(int x){dfn[++tim]=x;vis[x]=1;for(int i=fi[x];~i;i=p[i].nxt){if(jd[i]==1) continue;int f=jd[i];jd[i]=jd[i^1]=1;int to=p[i].to;//printf("x=%d to=%d\n",x,to);dfs(to);dfn[++tim]=x;if((!s1.empty()||!s2.empty())&&!f){int o;if(!s1.empty()) o=(*s1.begin()),s1.erase(o);else o=(*s2.begin()),s2.erase(o);//printf("x=%d o=%d\n",x,o);dfn[++tim]=0;e[++tot]=(edge){x,o,i/2+1};dfs(o);dfn[++tim]=x;}}return; } int E; signed main(){ #ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout); #endifmemset(fi,-1,sizeof(fi));cnt=-1; n=read();m=read();for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++){e[i].x=read();e[i].y=read();++du[e[i].x];++du[e[i].y];if(find(e[i].x)==find(e[i].y)){E=i;}else fa[find(e[i].x)]=find(e[i].y);}if(du[1]==0){flag=1;if(E){e[E].y=1;O=e[E].x;ID=E;}else{for(int i=1;i<=m;i++){if(du[e[i].x]<=1) swap(e[i].x,e[i].y);if(du[e[i].x]>1){e[i].id=1;O=e[i].x;ID=i;e[i].y=1;break;}}}}memset(du,0,sizeof(du));for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++){int x=e[i].x,y=e[i].y;addline(x,y);addline(y,x);fa[find(x)]=find(y);++du[x];++du[y];if(e[i].id) jd[cnt]=jd[cnt^1]=2;}//for(int i=1;i<=n;i++) debug("i=%d fa=%d\n",i,fa[i]);for(int i=2;i<=n;i++){if(i==find(i)&&find(1)!=i){if(du[i]) s1.insert(i);else s2.insert(i);}}dfs(1);if(!s1.empty()||!s2.empty()) printf("NO\n");else print();return 0; } /**/總結
以上是生活随笔為你收集整理的codeforces:65的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P4169 [Violet]天使玩偶/S
- 下一篇: CF788789(div1div2)