20191028 Codeforces Round #534 (Div. 1) - Virtual Participation
菜是原罪。
英语不好更是原罪。
题解
的格子,两种放法。
发现这两种在一起时候很讨厌,于是强行拆分这个格子
上面 给横的,下面给竖的。
#include<bits/stdc++.h> using namespace std; template <typename Tp> void read(Tp &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar(); if(ch=='-') ch=getchar(),fh=-1; else fh=1; while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); x*=fh; } int n; char s[1007]; int a[8][8]; void del(){ for(int i=1;i<=4;i++){ int sum=0; for(int j=1;j<=4;j++){ sum+=a[i][j]; } if(sum==4){ for(int j=1;j<=4;j++) a[i][j]=0; } } } int ex1[3][3],ex2[3][3]; void solve(int x){ if(x==1){ if(!ex1[1][1]){ printf("%d %d\n",1,1); ex1[1][1]=1; } else if(!ex1[1][2]){ printf("%d %d\n",1,3); ex1[1][2]=1; } else if(!ex1[2][1]){ printf("%d %d\n",2,1); ex1[2][1]=1; } else if(!ex1[2][2]){ printf("%d %d\n",2,3); ex1[2][2]=1; } if(ex1[1][1]&&ex1[1][2]) ex1[1][1]=ex1[1][2]=0; if(ex1[2][1]&&ex1[2][2]) ex1[2][1]=ex1[2][2]=0; } else{ if(!ex2[1][1]){ printf("%d %d\n",3,1); ex2[1][1]=1; } else if(!ex2[1][2]){ printf("%d %d\n",3,2); ex2[1][2]=1; } else if(!ex2[2][1]){ printf("%d %d\n",3,3); ex2[2][1]=1; } else if(!ex2[2][2]){ printf("%d %d\n",3,4); ex2[2][2]=1; } if(ex2[1][1]&&ex2[1][2]&&ex2[2][1]&&ex2[2][2]) ex2[1][1]=ex2[1][2]=ex2[2][1]=ex2[2][2]=0000; // if(ex1[1][1]&&ex1[1][2]) ex1[1][1]=ex1[1][2]=0; // if(ex1[2][1]&&ex1[2][2]) ex1[2][1]=ex1[2][2]=0; } } int main(){ cin>>(s+1); n=strlen(s+1);memset(a,1,sizeof(a)); for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) a[i][j]=0; for(int qwq=1;qwq<=n;qwq++){ int k=s[qwq]-'0'; solve(k); } return 0; }
题解
真是一个神仙交互题。
首先需要想到一个结论,函数 是一个周期函数, 。
这个题目一开始的想法就是二分,但是由于 取模的问题,不太满足可二分性。
但是在一个周期内,是可以二分的。
于是倍增确定 的取值范围,二分答案。
次询问卡的紧紧的...
cyz同学问了 次...
#include<bits/stdc++.h> using namespace std; template <typename Tp> void read(Tp &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar(); if(ch=='-') ch=getchar(),fh=-1; else fh=1; while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); x*=fh; } string s; int main(){ while(1){ cin>>s; if(s=="end") break; if(s=="mistake") break; int l=0,r=1; while(1){ printf("? %d %d\n",l,r); fflush(stdout); cin>>s; if(s=="y") l=r,r*=2; else break; } int ans; while(l<r-1){ int mid=(l+r)>>1; printf("? %d %d\n",mid,l); fflush(stdout); cin>>s; if(s=="x") l=mid; else r=mid; } ++l; printf("! %d\n",l); fflush(stdout); } return 0; }
题解
首先 STO hkk。
hkk:由于这个和环有关,所以可以想到生成树。
随便画个生成树,可以得到如果有深度超过 的点,则肯定有成立的路径。
否则叶子结点一定超过 个。
又有每个点的度超过 ,则在 树上至少有两条返祖边,构成 个环,且至少有一个长度不是 的倍数。
于是构建出 树,搞一搞即可。
xxxxx
即得易见平凡,由上自证显然,留作习题答案略,读者自证不难。
反之亦然同理,推论自然成立,略去过程Q.E.D,由上可知证毕。
xxxxx
#include<bits/stdc++.h> using namespace std; template <typename Tp> void read(Tp &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar(); if(ch=='-') ch=getchar(),fh=-1; else fh=1; while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); x*=fh; } const int maxn=250007; int n,m,k; int lim; int Head[maxn],Next[1000007],to[1000007],tot=1; void add(int x,int y){ to[++tot]=y,Next[tot]=Head[x],Head[x]=tot; } int dfn[maxn],dep[maxn]; int fa[maxn],mx,pos; bool vis[maxn]; vector<int>lea; void dfs(int x,int f,int dp){ fa[x]=f,dep[x]=dp,vis[x]=1; if(dep[x]>mx){ mx=dep[x],pos=x; if(mx>=(n+k-1)/k){ puts("PATH"); printf("%d\n",mx); int p=x; while(p){ printf("%d ",p);p=fa[p]; } puts("");exit(0); } } bool res=false; for(int i=Head[x];i;i=Next[i]){ int y=to[i]; if(vis[y]) continue; dfs(y,x,dp+1);res=true; } if(!res) lea.push_back(x); } bool comp(int a,int b){ return dep[a]<dep[b]; } int main(){ read(n);read(m);read(k); if(n%k) lim=n/k; else lim=n/k+1; for(int i=1,x,y;i<=m;i++){ read(x);read(y); add(x,y);add(y,x); } dfs(1,0,1); puts("CYCLES"); bool res; for(int i=0;i<k;i++){ int x=lea[i]; res=false;vector<int>v;v.clear(); for(int i=Head[x];i;i=Next[i]){ int y=to[i]; if(v.size()!=2) v.push_back(y); if(y==fa[x]||(dep[x]-dep[y]+1)%3==0) continue; printf("%d\n",dep[x]-dep[y]+1); int p=x; while(p!=fa[y]){ printf("%d ",p); p=fa[p]; } puts(""); res=1;break; } if(res) continue; sort(v.begin(),v.end(),comp); printf("%d\n",dep[v[1]]-dep[v[0]]+2); int a=v[0],b=v[1]; while(fa[a]!=fa[b]) printf("%d ",b),b=fa[b]; printf("%d %d\n",b,x); } return 0; }
题解
一个萌萌萌新的看题解心路...
截止2019.10.30 17:45,我还没有A掉这道题...
神仙多项式题,不会。
分类:
OI / Contests
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现