首页 > 其他分享 >[ICPC2020 WF] QC QC

[ICPC2020 WF] QC QC

时间:2024-08-28 22:15:48浏览次数:5  
标签:WF 连通 ICPC2020 int 询问 真话 tp QC include

有 \(n\) 个人,有些人只会说真话有些人不一定,多于一半的人说真话,你需要进行不超过 12 轮询问确定哪些人一定说真话,每轮可以问每个人另一个人是不是一定说真话。

离谱题目,就要用离谱做法。这个题其实可以压到 6 轮的!

\(1\) 代表一定说真话,\(0\) 代表不一定。考虑只询问二元环,也就是每一对人互相问,这样的话如果返回 \(1,1\) 那么说明这两个人要么是 \((1,1)\) 要么是 \((0,0)\)。那么直接把这两个人的状态合并起来就行了。

接下来一个想法是如果经历若干轮之后所有的 \(1\) 都合并起来了,那么绝对众数的那个连通块就是答案。但是你发现你很难合理安排策略使得很大概率能全部合并。

考虑一些启发式的想法,第一个想法是我们询问同一个连通块的边或者同一轮询问询问同一对连通块的边一定是不优的,所以说我们只需要考虑连通块之间连边。第二个观察是真连通块趋向于很大而且能连很多边,所以说我们启发式地每次拿大点的连通块优先连。

写一个这样的算法:每次拿一个最大的连通块随机与一个没连边的其它连通块相连,发现这能过不一定话的人随机返回的交互库,但是当不一定说真话的人一直说真话时,最大的连通块并不倾向于是真的,我们需要更多的信息。

考虑我们询问一条边,如果结果是 \(1,1\) 就连边,否则说明这一对连通块间永远不可能连边了。于是你存储所有询问失效的边,然后你就可以得出所有不能问的连通块对,每次随机选取时忽略这些连通块对。这个乱搞特牛,6 轮就可以以极大概率完成操作。

添加 LOCAL 宏用于交互库本地测试。直到我写完了这题代码,zhy 才告诉我 LOJ 上有 python 交互库可以用。

#include <map>
#include <cstdio>
#include <vector>
#include <random>
#include <cassert>
#include <algorithm>
using namespace std;
mt19937 rng(random_device{}());
int read(){
	char c=getchar();int x=0;
	while(c<48||c>57) c=getchar();
	do x=x*10+(c^48),c=getchar();
	while(c>=48&&c<=57);
	return x;
}
const int N=103;
int n,rk;
int f[N],w[N];
vector<int> vec[N];
int rt(int x){
	if(f[x]==x) return x;
	return f[x]=rt(f[x]);
}
int tp,sx[N],sy[N];
inline void add(int u,int v){++tp;sx[tp]=u;sy[tp]=v;}
int p[N];bool q[N],ans[N];
bool res[N],mp[N][N];
bool anti[N][N],non[N][N];
inline void sol(){
	for(int i=1;i<=n;++i) p[i]=0;
	for(int i=1;i<=tp;++i) p[sx[i]]=sy[i],p[sy[i]]=sx[i];
	printf("test");
	for(int i=1;i<=n;++i) printf(" %d",p[i]);
	putchar('\n');
	fflush(stdout);
#ifdef LOCAL
	for(int i=1;i<=n;++i)
		if(p[i]) q[i]=mp[i][p[i]];
		else q[i]=1;
#else
	char cc=getchar();
	while(cc!='0'&&cc!='1'&&cc!='-') cc=getchar();
	for(int i=1;i<=n;++i) q[i]=cc^48,cc=getchar();
#endif
	for(int i=1;i<=tp;++i)
		if(q[sx[i]]&&q[sy[i]]) f[rt(sx[i])]=rt(sy[i]);
		else anti[sx[i]][sy[i]]=1;
}
int arr[N];
void solve(){
	n=read();
	for(int i=1;i<=n;++i) f[i]=i,ans[i]=0;
#ifdef LOCAL
	int cnt;
	do{
		cnt=0;
		for(int i=1;i<=n;++i) cnt+=(res[i]=rng()&1);
	}while(cnt*2<=n);
	for(int i=1;i<=n;++i)
		if(res[i]) for(int j=1;j<=n;++j) mp[i][j]=res[j];
		else for(int j=1;j<=n;++j) mp[i][j]=1;
#endif
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j) anti[i][j]=0;
	for(int it=0;it<6;++it){
		tp=0;rk=0;
		for(int i=1;i<=n;++i){
			vec[i].clear();
			if(f[i]==i) w[rk++]=i;
		}
		for(int i=1;i<=n;++i) vec[rt(i)].emplace_back(i);
		for(int i=1;i<=n;++i)
			for(int j=1;j<=n;++j)
				non[i][j]=0;
		for(int i=1;i<=n;++i)
			for(int j=1;j<=n;++j)
				if(anti[i][j]) non[rt(i)][rt(j)]=non[rt(j)][rt(i)]=1;
		sort(w,w+rk,[](int x,int y){return vec[x].size()>vec[y].size();});
		for(int i=0;i<rk;++i){
			int x=w[i],sz=0;
			if(vec[x].empty()) continue;
			for(int j=i+1;j<rk;++j) if(!vec[w[j]].empty()&&!non[x][w[j]]) arr[sz++]=w[j];
			for(int j=0;j<sz&&!vec[x].empty();++j){
				add(vec[x].back(),vec[arr[j]].back());
				vec[x].pop_back();vec[arr[j]].pop_back();
			}
		}
		sol();
	}
	for(int i=1;i<=n;++i) vec[i].clear();
	for(int i=1;i<=n;++i) vec[rt(i)].emplace_back(i);
	for(int i=1;i<=n;++i)
		if(vec[i].size()*2>n) for(int x:vec[i]) ans[x]=1;
	printf("answer ");
	for(int i=1;i<=n;++i)
		printf("%d",ans[i]);
	putchar('\n');
	fflush(stdout);
#ifdef LOCAL
	for(int i=1;i<=n;++i) assert(ans[i]==res[i]);
#endif 
}
int main(){
	int tc=read();
	while(tc--) solve();
	return 0;
}

标签:WF,连通,ICPC2020,int,询问,真话,tp,QC,include
From: https://www.cnblogs.com/yyyyxh/p/18385600/QCQC

相关文章

  • Android Qcom USB Driver学习(十)
    本章主要是基于之前的学习,实现一个hidraw的驱动,发现有两种用于识别usb设备的方式,放别是usb_device_id和hid_device_idhid_probe(1)hid_device_idkernel/msm-4.19/drivers/hid/usbhid/hid-core.cbus=usbusb_register注册驱动->sys/bus/usb/driver↓↓↓↓↓↓......
  • Android Qcom USB Driver学习(九)
    本章主要是基于之前的学习,实现一个hidraw的驱动,发现有两种用于识别usb设备的方式,放别是usb_device_id和hid_device_idhid_probe(1)hid_device_idkernel/msm-4.19/drivers/hid/usbhid/hid-core.cbus=usbusb_register注册驱动->sys/bus/usb/driver↓↓↓↓↓↓......
  • Android Qcom USB Driver学习(九)
    高通的某些平台将电源管理移植到了ADSPSubsystem,分析一下其中比较关心的部分Architecture———————————————————————————————————————|GenericTypeCDrvierPowerSupplyFramework| |G......
  • Android Qcom USB Driver学习(八)
    因为要看usbcharging的问题,所以需要补充一下battery的相关知识,算是入门吧BATSCH(1)VBATT_VSNS_P(2)BAT_THERM(3)I2C_SDA(4)I2C_SCL(5)VBATT_VSNS_Msbl1_hw_pre_ddr_init:(1)pm_device_init(2)pm_driver_init(3)pm_sbl_chg_init(1)pm_device_init没有研究过,也是......
  • Android Qcom USB Driver学习(七)
    最近遇到了USB插拔后,系统重启的问题,抓取串口log发现如下问题,log中查看trace分析就是空指针造成的panicUnabletohandlekernelreadfromunreadablememoryatvirtualaddress0000000000000000Memabortinfo:ESR=0x96000005Exceptionclass=DABT(currentEL),......
  • Android Qcom USB Driver学习(六)
    眼图基础知识与详解10分钟教会你看眼图USB2.0HUB眼图调试经验总结一篇文章教你如何全面了解眼图测试!预加重与去加重对眼图的影响关于USB通信阻抗匹配的问题硬件调试——眼图几个经典案例眼图常见问题分析包含双眼皮的情况PHYTunningdevicetree:qusb_phy0:qusb@1613......
  • Android Qcom USB Driver学习(五)
    前面的几篇都有涉及,所以本文学习一下pmicusbcharger都相关的vote机制OVP:OverVoltageProtection过压保护USB_IN:Inputcurrentlimit一般仅支持USB_IN即VBUS在输入(有些能支持DC_IN),APSD:autonomouspowersourcedetection运行于BC1.2SDP/CDP的检测完成......
  • JSP学校小卖部收银系统uwf3w(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
    系统程序文件列表项目功能:用户,员工,商品分类,商品信息,供应商,商品进货开题报告内容JSP学校小卖部收银系统 开题报告一、项目背景与意义1.1项目背景随着校园数字化管理的推进,学校小卖部作为学生日常消费的重要场所,其运营效率和服务质量受到了广泛关注。传统的小卖部......
  • [开题报告]FLASK框架长株潭旅游舆情系统e48wf(源码+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景长株潭地区作为湖南省的经济与文化中心,拥有丰富的自然风光和深厚的人文底蕴,吸引了大量游客前来观光旅游。然而,随着旅游业的蓬勃发展,旅游舆......
  • 闲鱼卖2000元的带腾讯备案的 gaapqcloud.com.cn 域名低成本获取方法!
    最近在闲鱼看到有人卖域名,声称是腾讯的备案,还卖1000多元!逆天了!这个信息差是真能割韭菜,我一查,这不就是腾讯云的全球应用加速域名吗?????这样也能赚到钱??获取方法进入腾讯云全球应用加速进行开通就可以了,当然确实是有门槛的,就是你得是企业认证的腾讯云账号才可以,然后开通这个,账户得有......