首页 > 其他分享 >CF2049C 题解

CF2049C 题解

时间:2024-12-21 15:19:31浏览次数:3  
标签:CF2049C int 题解 构造 偶数 填数 情况

CF2049C 题解

关于MEX的构造题。

题意

有一个 \(n\) 元环,每个元素都和它的相邻元素是“朋友”。此外,额外给定一组 \(x,y\),\(x\) 和 \(y\) 彼此也是 “朋友”。

求一种给 \(n\) 个元素填数的方案,使得对于任意一个 \(i\in[1,n]\),填在 \(i\) 这个位置的数 \(a_i\),是它所有“朋友”的数组成的集合的 MEX。

分析

从样例可以初步推测,我们填数用到的 \(a\) 并不会很大,只需要尝试在 \(0,1,2,3...\) 交替填就好了。

首先考虑不存在 \(x,y\) 限制的情况:

\(n\) 为偶数

这种情况很简单,不难想到随便选一个起点,一直按照 \(0,1\) 交替填就行。

\(n\) 为奇数

由于多了一个位置出来,我们发现刚刚的填数方案行不通了,这时候想一想是否能先钦定一个位置为 \(2\) ,然后剩下没填的坑只有偶数个了,回到了偶数情况,于是我们往后按照 \(0,1\) 交替填即可。

最后发现和 \(2\) 这个位置相邻的一定是一个 \(1\) 和一个 \(0\),是合法的,所以这种构造成立。

考虑 \(x,y\)

如果说引入 \(x,y\),相当于多了一条限制,需要去思考如何小幅度地修改,使得方案合法。

\(n\) 为偶数

如果 \(x\) 和 \(y\) 是不相同的,那这条多出的限制对于原来的构造实际上没有影响,所以仍然成立。

如果 \(x\) 和 \(y\) 相同,我们任意把其中一个修改为 \(2\) 即可。

\(n\) 为奇数

首先还是有:\(x\) 和 \(y\) 不相同,不需要做任何修改,即使这里多了一个为 \(2\) 的数。

然后如果 \(x\) 和 \(y\) 相同呢?这里赛时想了各种天马行空的构造,加了一堆特判,最后可能还是有corner case没判全,遗憾离场。

然而大可不必这样大费周折,只需要在构造的时候把 没有解决的情况 化归到 已经解决的情况上 即可。

这种情况的独特之处就在于:\(2\) 这个数是独一无二的,整个问题又是建立在环的意义下,所以我们不妨把所有的数同时顺时针移动,直到 \(2\) 旋转到 \(x\) 或者 \(y\) 的位置,就一定能保证 \(x\) 和 \(y\) 处填的数不同,那么这样的构造就是合法的了。

Code

#include<bits/stdc++.h>
using namespace std;
int T,n,x,y;
const int N=2e5+10;
int a[N];
int get(int t)
{
    return t==n?1:t+1;
}
inline void solve()
{
    cin>>n>>x>>y;
    if(n%2==0)
    {
        for(int i=1;i<=n;++i)a[i]=i%2;
        if(a[x]==a[y])a[y]=2;
    }
    else
    {
        a[x]=2;
        for(int i=get(x),w=0,cnt=1;cnt<=n-1;i=get(i),w^=1,++cnt)a[i]=w;
    }
    for(int i=1;i<=n;++i)cout<<a[i]<<" ";
    cout<<'\n';
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>T;
    while(T--)
    {
        solve();
    }
}

总结

构造题从特殊情况开始考虑,然后尝试用特殊情况的解稍作变换,推及一般情况。

卡题太久就跳。

标签:CF2049C,int,题解,构造,偶数,填数,情况
From: https://www.cnblogs.com/Hanggoash/p/18620798

相关文章

  • redis-cli (error) NOAUTH Authentication required问题解决
    1.查找redis-cli所在目录whichredis-cli2.切换到redis-cli目录3.切换到usr/bin目录执行以下命令redis-cli-hip-pport4.验证redis登录密码auth'password'5.获取redis数据......
  • Luogu P8112 [Cnoi2021] 符文破译 题解 [ 蓝 ] [ KMP ] [ 线性 dp ] [ 决策单调性 dp
    符文破译:KMP+dp的好题。暴力dp不难打出一个暴力dp:设计\(dp_i\)表示当前前\(i\)位全部完成了匹配,所需的最小分割数。转移也是简单的,我们在KMP的过程中进行dp转移,每次选取next不断跳向再前面的next,然后进行转移即可。很显然一个字符集大小为\(1\)的串就能轻松......
  • Hexo Next主题本地搜索功能不可用问题解决
    个人博客地址:HexoNext主题本地搜索功能不可用问题解决|一张假钞的真实世界。按照Next主题官网配置步骤(LocalSearch)配置后,站点的“搜索”菜单点击无响应。查看Next主题源代码({Next主题根目录}/hexo-theme-next/layout/_partials/search/index.njk),发现站点优先使用Algolia......
  • GESP202412 八级【树上移动】题解(AC)
    》》》点我查看「视频」详解》》》[GESP202412八级]树上移动题目描述小杨有一棵包含nnn个节点的树,其中节点的编号从1......
  • CF1477D Nezzar and Hidden Permutations 题解
    Description给定一张\(n\)个点\(m\)条边的简单无向图,构造两个排列\(p,q\),使得:对任意\((u,v)\inE\),\((p_u-p_v)(q_u-q_v)>0\).在此基础上,最大化\(\left|\left\{i\|\p_i\neqq_i\right\}\right|\).\(1\leqn,m\leq5\times10^5\)。Solution首先显然如果存在一个......
  • [CERC2014] Parades 题解
    感觉长脑子了。考虑在路线两端点的\(lca\)计算贡献,那么线段可以分两类:\(u\)为\(v\)祖先。\(u,v\)互不为祖先。设\(dp_i\)表示只考虑\(i\)子树内的路线时的答案。引理\(1\):若插入一条以\(i\)为\(lca\)的路径会使以\(i\)的儿子为\(lca\)的路径数量减少,......
  • 题解:AT_arc008_3 [ARC008C] THE☆たこ焼き祭り2012
    思路看到$N\leq1000$,我们立马想到Floyd,把每个人都当作点,把传递小丸子所需的时间当作边权去建边。最后直接跑一遍Floyd就好了。AC代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=1e3+10;intx[N],y[N],t[N],r[N],n;doubled......
  • 题解:CF917A The Monster
    思路分别枚举连续子序列所有起点的可能。用变量来记录左括号和右括号的数量,左括号\(+1\),右括号\(-1\)。对于问号,则通过当前左括号和右括号的数量来判断应该变为右括号还是变为左括号。当右括号数量大于左括号数量时,就可以停止枚举以当前起点为起点的连续子序列了,因为无论怎......
  • 题解:CF603A Alternative Thinking
    思路你猜这个题为什么是A题?很思维的解法。只允许翻转一次,所以最多只会在原答案上加\(2\)。所以我们来讨论仅有的三种可能:加\(2\),要有两段连续的\(0\)或\(1\)。加\(1\),要有一段连续的\(0\)或\(1\)。不加,没有连续的\(0\)或\(1\)。我们的代码模拟上面的三种......
  • 题解:CF626B Cards
    思路枚举三种能够得到该颜色的方法。全是该颜色的卡牌。另外两种卡牌的数量都大于等于一张。另外的两种卡牌,一种大于等于两张,一种为零张,该颜色的卡牌大于等于一张。我们用三个变量来记录每种卡牌出现的次数,然后按照以上的三种方法模拟即可。AC代码#include<bits/stdc++.......