Codeforces 835E:The penguin's game

题意:
现在有 N 个数,下标从1- N 。这N个数中有 N2 个数是 x ,有2个数是 y
你可以每次向交互库提问,询问一个下标集合的数的异或和。
你需要在19次询问之内回答这两个数的下标是多少。
解答:
考虑这两个下标的二进制,由于 N1000 ,二进制串的长度至多为 10
可以用 10 次询问得到这两个数的异或值:
       每次按照二进制某一位分成两组,询问其中的一组。

知道两个数的异或值,如果我们再知道其中一个数,那么两个数的值就都知道了
任选一个异或值为 1 的二进制位,显然这样的二进制位存在,令这个二进制位为k
这样不妨求第k为是 0 的那个二进制串,还剩余9个二进制位需要确认,用 9 次操作就能算出来这个串。
这样至多总共用19次询问就能得到这两个串了,这个做法是不是很棒!

#include <bits/stdc++.h>
using namespace std;
inline int rd() {
    int x=0,f=1;char ch=getchar();
    while (ch>'9'||ch<'0') {if(ch=='-')f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return x*f;
}

int n,x,y,o[100050],l,tmp;

int main() {
    n = rd(), x = rd(), y = rd();
    for (int i=1;i<=1024;i<<=1) {
        int cnt = 0;
        for (int j=0;j<n;j++) if (j&i) o[++cnt] = j+1;
        if (!cnt) continue;
        printf("? %d ",cnt);
        for (int j=1;j<=cnt;j++) printf("%d%c",o[j],j==cnt?'\n':' ');
        fflush(stdout);
        int sum = rd();
        if (sum != (cnt&1) * x) tmp ^= i, l = i;
    }

    int p1 = 0;
    for (int i=1;i<=1024;i<<=1) if (i!=l) {
        int cnt = 0;
        for (int j=0;j<n;j++) if (((j&l) == 0) && ((j&p1) == p1) && (j&i))
            o[++cnt] = j+1;
        if (!cnt) continue;
        printf("? %d ",cnt);
        for (int j=1;j<=cnt;j++) printf("%d%c",o[j],j==cnt?'\n':' ');
        fflush(stdout);
        int sum = rd();
        if (sum != (cnt&1) * x) p1 += i;
    }

    int p2 = p1 ^ tmp;
    printf("! %d %d\n",p1+1,p2+1);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值