首页 > 其他分享 >CF2061G Kevin and Teams 题解

CF2061G Kevin and Teams 题解

时间:2025-01-22 23:01:58浏览次数:1  
标签:le CF2061G int 题解 边权 链头 col top Kevin

题目描述

这是一道交互题。

\(T\) 组数据,一张 \(n\) 个点的无向完全图,边权 \(\in\{0,1\}\) ,边权未知。

你需要先输出最大的 \(k\) ,满足无论每条边的边权是什么,都能找出 \(2k\) 个不同的点 \(\{u_1,\cdots,u_n,v_1,\cdots,v_n\}\) ,使得边 \((u_i,v_i)\) 的权值同时为 \(0\) 或同时为 \(1\) 。

接下来你可以执行至多 \(n\) 次以下操作:

  • 输出 ? u v ,你需要保证 \(1\le u\neq v\le n\) ,交互库将返回这条边的边权。

然后你需要输出 ! u_1 v_1 ... u_k v_k ,表示答案。

数据范围

  • \(1\le T\le 10^4,1\le n\le 10^5,\sum n\le 10^5\) 。

时间限制 \(\texttt{4s}\) ,空间限制 \(\texttt{256MB}\) 。

分析

神题!

题目要求 \(n\) 固定时最大的 \(k\) ,我们先反向思考,求 \(k\) 固定(找不到 \(k+1\) 个点对)时最大的 \(n\) 。

结论:\(n\le 3k+1\) 。

构造:令 \(|S_1|=2k+1,|S_2|=k\) , \(S_1\) 内部边权全为 \(0\) , \(S_2\) 内部以及 \(S_1,S_2\) 之间的边全为 \(1\) 。

证明可以通过后面的交互过程完成。

怎么想到的?直觉判断应该有一个边权为 \(0\) 的完全子图,然后只要涉及到剩下的点则边权为 \(1\) ,调一调 \(S_1\) 和 \(S_2\) 的大小即可。

因此当 \(n\ge 3k+2\) 时,至少可以找到 \(k+1\) 个点对。

对于一般的 \(n\) , \(\max k=\lfloor\frac{n+1}3\rfloor\) ,这也是第一问的答案。


构造也并不容易。

首先最朴素的归纳构造毫无前途,假如你有 \(k\) 对 \(0\) 边,你是无法基于此构造出 \(k+1\) 对 \(0\) 边的,因为极端情况下其余所有边都是 \(1\) 。

根据 \(k\) 的范围,大约每 \(3\) 个点就要找一条边,我们尝试寻找 "万金油" 类型的结构。

如果 \((a,b)\) 边权为 \(0\) , \((a,c)\) 边权为 \(1\) ,那么将 \((a,b,c)\) 三个点删去,至少能找到 \(k-1\) 条颜色相同的边。无论这些边颜色是什么,我们总能从 \((a,b,c)\) 中找到一条边与它们颜色相同。

如果某个子图不存在这种 "万金油" 结构,那就只能是完全图了。当然我们也不必保证一定是完全图,因为询问次数有限。总共询问次数不超过 \(n\) ,平均每个点被询问不超过 \(2\) 次,构造一条颜色相同的链还是可以的。

基于此可以给出以下构造:

维护一条颜色相同(记为 col )的链,每次新加一个点:

  • 如果链头与新点之间的边与 col 相同,让新点成为链头。
  • 如果链头与新点之间的边与 col 不同,删去链头和次链头,这两个点与新点共同构成 "万金油" 结构。

由于每个 "万金油" 结构等价于令 n-=3,k-=1 ,对结论没有影响。而长为 \(n\) 的链可以找出 \(\lfloor\frac n2\rfloor\ge\lfloor\frac{n+1}3\rfloor\) 个点对,因此构造成立。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int k,n,t,col,top;
int st[maxn];
vector<array<int,3>> vec;
int ask(int x,int y)
{
    printf("? %d %d\n",x,y),fflush(stdout);
    return scanf("%d",&x),x;
}
int main()
{
    for(scanf("%d",&t);t--;)
    {
        scanf("%d",&n),k=(n+1)/3;
        printf("%d\n",k),fflush(stdout);
        col=top=0,vec.clear();
        for(int i=1;i<=n;i++)
        {
            if(!top) st[++top]=i;
            else if(top==1) st[++top]=i,col=ask(st[1],st[2]);
            else
            {
                int x=ask(i,st[top]);
                if(x==col) st[++top]=i;
                else
                {
                    array<int,3> tmp={st[top],st[top-1],i};
                    if(!x) swap(tmp[1],tmp[2]);
                    vec.push_back(tmp),top-=2;
                }
            }
        }
        printf("! ");
        for(int i=1;i<=min(top/2,k);i++) printf("%d %d ",st[2*i-1],st[2*i]);
        for(int i=0;i<k-top/2;i++) printf("%d %d ",vec[i][0],vec[i][col+1]);
        putchar('\n'),fflush(stdout);
    }
    return 0;
}

总结

  • 博主赛时花 \(\texttt{1.5h}\) 过了 \(\texttt{A}\sim\texttt{E1}\) ,剩下一半时间全花在这道题上,核心难点都突破了,但是没能通过这道题,遗憾错失上大分的机会。

    下面请欣赏博主赛时犯下的弱智错误:

    for(int i=1;i<=top/2;i++) ;///输出链
    for(int i=0;i<k-top/2;i++) ;///输出三角形
    

    top/2>k 时输出过多,呜呜呜!

标签:le,CF2061G,int,题解,边权,链头,col,top,Kevin
From: https://www.cnblogs.com/peiwenjun/p/18686882

相关文章

  • Codeforces Round 998 (Div. 3)(部分题解)
    补题链接A. Fibonacciness思路:了解清楚题意,求得是最大的斐波那契的度,数组只有5个数(最多度为3),能列出其对应的式子 或 或#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){intn,m,k;vector<int>a(4);set<int>s;......
  • 题解:洛谷 P1803 凌乱的yyy / 线段覆盖
    题目https://www.luogu.com.cn/problem/P1803题目大意给定  条线段,第  条线段放在位置 ,现在你需要从这些线段中拿出一些,使得剩下的线段不会重叠。思路考虑贪心。可以发现,按照左端点从小到大排序毫无意义(虽然样例能过)。因此考虑按右端点从小到大排序。然后尽量多放......
  • AtCoder ABC326C 题解
    题目链接问题陈述Takahashi在数字线上放置了\(N\)个礼物。第\(i\)个礼物放置在坐标\(A_i\)处。您将在数轴上选择长度为\(M\)的半开区间\([x,x+M)\),并获得其中包含的所有礼物。更具体地说,你根据以下程序获得礼物。首先,选择一个实数\(x\)。然后,获取坐标满足\(......
  • C. Game of Mathletes(题解)
    首先Alice擦一个数a,然后Bob再擦一个数b,只有当a+b=k的时候才可以得分,Alice想要最小化分数而Bob想要最大化分数,所以如果给定的数中存在两个数的和为k,那么当Alice擦掉其中一个的时候Bob一定会擦掉另一个来得分,而且题目给定的数组长度为偶数,所以我们只需要运用双指针的思想找到数组......
  • 常见问题解决 --- 引用的账户当前已锁定,且可能无法登录什么意思
     当你在尝试登录Windows系统时,看到错误提示“引用的账户当前已锁定,且可能无法登录”,这意味着你使用的用户账户由于多次输入错误的密码而被系统锁定。这是一种安全机制,旨在防止暴力破解或未经授权的访问。原因分析1.多次输入错误密码:如果连续多次输入错误的密码,系统会自......
  • 题解:P11600 『Fwb』流星の陨落
    『Fwb』流星の陨落题目描述流星雨来了!当然,这场流星雨确确实实是Fwb设计的。Fwb在天空中放置了许多的流星,同时也在地面上放置了许多的烟花。当流星和烟花发生碰撞时,就会出现美丽而独特的风景。由于方便控制流星雨的发射,流星的发射是有规律的,这个发射的规律叫做流星间隔。我......
  • 「CF1437F」Emotional Fishermen 题解
    小水题一道Description有n\((n\le5000)\)个渔民,每个渔民钓了一条重\(a_i\)的鱼,渔民按任意顺序展示他们的鱼。若当前渔民的鱼的重量为\(x\),之前展示过的鱼的最大重量\(y\)。一个排列满足条件当且仅当对于每个\(x\),满足\(2y\lex\)或\(2x\ley\)。问有多少个排列满......
  • 「CF618F」Double Knapsack 题解
    只能说。。。Description给你两个可重集 \(A,B\),\(A,B\) 的元素个数都为 \(n\),它们中每个元素的大小 \(x\in[1,n]\)。请你分别找出 \(A,B\) 的子集,使得它们中的元素之和相等。\(n\leq10^6\)。Solution将找子集强化成找子段(不知道怎么想的),令\(sa_{n}\)表示\(A\)......
  • 「CF1854D」Michael and Hotel 题解
    逆天交互题、、、我只能说阈值分治赛高!!!Description有一个有 \(n\) 个点的内向基环树森林,zlsim位于 \(1\) 号节点,请你通过以下操作求出哪些节点(包括 )可以通过从这两点开始沿边行走若干步汇至一点。给出两个参数 \(u,k\) 和点集 \(S\),询问是否能够通过从 \(u\) 出......
  • 关于此题CF2061E_Kevin and And的一些总结
    传送门题目大意:给定\(n\)个数\(a[1...n]\)和\(m\)个数\(b[1...m]\),并且给定整数k,求让任意\(i,j\)使\(a[i]&b[j]\)来替代\(a[i]\)后这\(n\)个数总和最小。首先我们看到题目给的m范围非常小,最大只有10,然后又问我们k次操作之后总和的最小值,第一反应是不是可以直接先求出每个\(a[i]......