zoukankan      html  css  js  c++  java
  • AT2348 HonestOrUnkind

    传送门

    显然(a>b)的情况下才有解
    考虑先找出一个诚实的人,然后剩下的都可以在(n)次以内问出来了
    发现如果一个人说另一个人是说谎的那么这两个人必有一个是说谎的,由于诚实的人严格多于不诚实的人,我们就可以把他们都丢掉
    我们可以考虑维护一个栈,这样找出来的栈顶一定是诚实的人,总次数也在(2n)以内
    代码:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define rg register
    void read(int &x){
    	char ch;bool ok;
    	for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-') ok=1;
    	for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok) x=-x;
    }
    const int maxn=1e6+10;
    int n,a,b,st[maxn],top,ans[maxn];char s[maxn];
    void query(int x,int y){printf("? %d %d
    ",x,y);fflush(stdout);scanf("%s",s);}
    int main(){
    	read(a),read(b),n=a+b;
    	if(a<=b){printf("Impossible
    ");return 0;}
    	for(rg int i=0;i<n;i++){
    		if(!top)st[++top]=i;
    		else {query(st[top],i);if(s[0]=='Y')st[++top]=i;else top--;}
    	}
    	int now=st[top];
    	for(rg int i=0;i<n;i++){
    		query(now,i);
    		if(s[0]=='Y')ans[i]=1;
    	}
    	printf("! ");
    	for(rg int i=0;i<n;i++)printf("%d",ans[i]);
    }
    
  • 相关阅读:
    ARC071 简要题解
    ARC070 简要题解
    ARC069 简要题解
    ARC068 简要题解
    ARC067 简要题解
    ARC066 简要题解
    ARC065 简要题解
    长链剖分优化dp三例题
    CF815D Karen and Cards 官方题解翻译
    [九省联考2018] IIIDX 线段树+贪心
  • 原文地址:https://www.cnblogs.com/lcxer/p/10736900.html
Copyright © 2011-2022 走看看