题解 P7971【[KSN2021] Colouring Balls】
posted on 2022-10-08 19:07:28 | under 题解 | source
problem
交互库有一个长为
solution
令
:
?
相同颜色连续:
做一个类似于去重的工作,把相邻两个颜色相同的(
:
考虑先去重,去掉相邻的相同颜色。对于连续的
,这可能吗? ,可以推出 的颜色和 的颜色相同。 ,这三个颜色互不相同,假设我们已经知道 的颜色,那么 就是异于它们的第三种颜色。实现时暴力找出 中有什么颜色,最后去掉 ,剩下的就是 的颜色(如果没有说明 是新颜色)。
这样就能通过
:
因为
考虑一个包含了
通解:
考虑一遍扫过去,用
对于
- 若
,说明 的颜色一定是 中的其中一种; - 若
,说明 的颜色不是 中的其中一种,它可能是 的其中一种,或者是一种不同于 的全新的颜色。
发现
及小优化
动态维护一个
还不能通过
code
实现时可以用并查集。
#include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
template<int N> struct dsu{
int fa[N+10],siz[N+10],cnt;
dsu(int n=N):cnt(n){for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1;}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void merge(int x,int y){
if(x=find(x),y=find(y),x!=y){
if(siz[x]<siz[y]) swap(x,y);
cnt--,siz[x]+=siz[y],fa[y]=x;
}
}
};
int n,T,f[1010][1010],last[1010],p[1010];
dsu<1010> s;
int query(int l,int r){
if(l>r) swap(l,r);
if(f[l][r]==-1){
printf("? %d %d\n",l,r);
fflush(stdout);
scanf("%d",&f[l][r]);
}
return f[l][r];
}
int flower(){
int cnt=0;
p[++cnt]=1;
for(int i=2;i<=n;i++){
if(query(p[cnt],i)==1) s.merge(p[cnt],i);
else p[++cnt]=i;
}
return cnt;
}
int main(){
memset(f,-1,sizeof f);
scanf("%d%d%*d",&T,&n);
if(T==1||T==2) flower();
else if(query(1,n)==n-1){
int L=1,R=n;
while(query(n,L)==n-L) L++;
while(query(R,1)==R-1) R--;
s.merge(L-1,R+1);
}else if(query(1,n)==3){
int cnt=flower();
if(query(p[1],p[3])==2) s.merge(p[1],p[3]);
for(int i=4;i<=cnt;i++){
if(query(p[i-2],p[i])==2) s.merge(p[i-2],p[i]);
else{
set<int> fs;
for(int j=1;j<i;j++) fs.insert(s.find(p[j]));
fs.erase(s.find(p[i-1]));
fs.erase(s.find(p[i-2]));
if(!fs.empty()) s.merge(*fs.begin(),p[i]);
}
}
}else if(query(1,n)!=n){
for(int i=1;i<=n;i++){
int cnt=0;
for(int j=1;j<=1000;j++) if(last[j]) p[++cnt]=last[j];
sort(p+1,p+cnt+1);
int L=1,R=cnt;
while(L<R){
int mid=(L+R+1)>>1;
if(query(p[mid],i)==cnt-mid+1) L=mid;
else R=mid-1;
}
if(query(1,n)==cnt||!cnt||query(p[L],i)==cnt-L+1) s.merge(p[L],i);
last[s.find(i)]=i;
}
}
printf("! ");
for(int i=1;i<=n;i++) printf("%d%c",s.find(i)," \n"[i==n]);
fflush(stdout);
return 0;
}
/*
1213
*/
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/solution-P7971.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!