首页 > 其他分享 >「杂题乱刷2」CF1354E

「杂题乱刷2」CF1354E

时间:2024-11-10 23:19:50浏览次数:1  
标签:5010 forl ll k2 CF1354E 杂题 dp define

题目链接

CF1354E Graph Coloring (*2100)

解题思路

发现这个东西就是类似于二分图染色的东西。

因为 \(2\) 只能和 \(1,3\) 链接。其余种类的点都不能连接。

不妨把 \(1,3\) 都看成同一个点放到最后处理。

那么我们就相当于是要找到一种方案使得选择每个联通快的黑点或白点,使得最终选择的总节点个数为颜色 \(2\) 的个数。

这个问题可以换轻松用背包来解决。

参考代码

#include<bits/stdc++.h>
using namespace std;
//#define map unordered_map
#define re register
#define ll long long
#define forl(i,a,b) for(re ll (i)=(a);i<=(b);(i)++)
#define forr(i,a,b) for(re ll (i)=(a);i>=(b);(i)--)
#define pii pair<ll,ll>
#define mid ((l+r)>>1)
#define lowbit(x) (x&-x)
#define pb push_back
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
#define cfy cout<<"YES\n";
#define cfn cout<<"NO\n";
ll _t_;
void _clear(){}
ll n,m;
ll k1,k2,k3;
vector<ll>G[5010];
ll col[5010];
ll x,y;
ll k;
ll a[5010],b[5010];
vector<ll>A[5010],B[5010];
ll dp[5010][5010];
ll ans[5010];
void dfs(ll x,ll fa,ll y)
{
    if(y==1)
        a[k]++,
        A[k].pb(x);
    else
        b[k]++,
        B[k].pb(x);
    col[x]=y;
    for(auto i:G[x])
        if(i!=fa)
        {
            if(!col[i])
                dfs(i,x,3^y);
            else if((3^y)!=col[i])
            {
                cfn;
                exit(0);
            }
        }
}
void solve()
{
    _clear();
    cin>>n>>m>>k1>>k2>>k3;
    forl(i,1,m)
        cin>>x>>y,
        G[x].pb(y),
        G[y].pb(x);
    forl(i,1,n)
        if(!col[i])
            k++,
            dfs(i,0,1);
    dp[0][0]=1;
    forl(i,1,k)
    {
        forr(j,k2,a[i])
            dp[i][j]|=dp[i-1][j-a[i]];
        forr(j,k2,b[i])
            dp[i][j]|=dp[i-1][j-b[i]];
    }
    if(dp[k][k2])
    {
        cfy;
        forl(i,1,n)
            ans[i]=1;
        forr(i,k,1)
        {
            if(k2-a[i]>=0 && dp[i-1][k2-a[i]])
            {
                k2-=a[i];
                for(auto j:A[i])
                    ans[j]=2;
            }
            else if(k2-b[i]>=0 && dp[i-1][k2-b[i]])
            {
                k2-=b[i];
                for(auto j:B[i])
                    ans[j]=2;                
            }
            else if(dp[i-1][k2])
                continue;
            else
                exit(-1);
        }
        if(k2>0)
            exit(-1);
        ll num=0;
        forl(i,1,n)
        {
            if(ans[i]==2)
                cout<<2;
            else
            {
                num++;
                if(num<=k1)
                    cout<<1;
                else
                    cout<<3;
            }
        }
        cout<<endl;
    }
    else
        cfn;
}
int main()
{
//    freopen("tst.txt","r",stdin);
//    freopen("sans.txt","w",stdout);
    IOS;
    _t_=1;
//    cin>>_t_;
    while(_t_--)
        solve();
    QwQ;
}

标签:5010,forl,ll,k2,CF1354E,杂题,dp,define
From: https://www.cnblogs.com/wangmarui/p/18538731

相关文章

  • 「杂题乱刷2」CF1370F2
    题目链接CF1370F2TheHiddenPair(HardVersion)(*2700)题目描述真的很难吗?我们首先考虑找出第一个特殊点。我们可以先求出这两个点路径中的任意一个点。发现询问\(1\simn\)就使我们需要的询问、接下来以这个路径中的一个点为根来确定每个节点的深度。接下来考虑二......
  • 并查集+最小生成树 学习笔记+杂题 1
    图论系列:前言:相关题单:戳我算法讲解:戳我代码可能过多啊,到时候页面别卡死了,所以就把代码最前面的缺省源删了(反正就是几个头文件/defineintlonglong,自己加一下即可)。并查集记得初始化,最小生成树记得排序。P3367【模板】并查集板子题,给定\(n\)个元素,有2种操作,一种合并,......
  • 「杂题乱刷2」P11267
    题目链接P11267【MX-S5-T1】王国边缘解题思路先考虑对于\(1\simn\)中的每一个点往后跳\(1\)次会跳的距离。那么为什么只用处理\(1\simn\)这些点而不去处理其余的点往后跳的距离呢?我们可以发现,由于字符串是无线循环的,所以对于位置模\(n\)的结果相同时,那么往后跳......
  • 双连通分量学习笔记+杂题
    图论系列:前言:もしも明日がくるのならあなたと花を育てたいもしも明日がくるのならあなたと愛を語りたい走って笑って転んで相关题单:https://www.luogu.com.cn/training/641352一.割点与桥双连通分量是针对无向图来说的,有向图是强连通分量。在了解双连通分量之前需要先......
  • AGC 杂题
    AGC029CLexicographicconstraints有\(n\)个字符串,现在告知它们的长度\(a_i\),求使得\(\foralli\in[1,n),s_i<s_{i+1}\)的最小字符集大小。\(n\le2\times10^5,a_i\le10^9\)二分字符集大小\(|\Sigma|\),分类讨论,设起始字符为a:\(a_i<a_{i+1}\):显然\(s_{i+1}\leftarr......
  • ABC 杂题
    ABC186EThrone有\(n\)个圆形排列的椅子,一开始你在\(s+1\)上,每次可以向右移动\(k\)个位置,求移动到\(1\)的最小步数,或报告无解。\(2\len,k\le10^9\)很容易想到构造方程:\[s+qk\equiv0\pmodn\]\[q\equiv(n-s)k^{-1}\pmodn\]直接exgcd求逆元,算出在\([1,n-1]\)......
  • 杂题选做1
    杂题选做1[ARC112F]DieSiedler注意到如果存在某一个\(j\)满足这种牌的数量大于等于\(2j\),那么一定会兑换为\(j\bmodn+1\)的牌。所以我们考虑这个过程的逆过程,就是将一张牌\(j\)换成\((j-1)!2^{j-1}\)张\(1\)号牌,最终全部的牌都被转化为了\(1\)号牌,但是结果并......
  • 数据结构杂题乱记
    由于是杂题乱记所以题目大多数不会太难。目录P2572[SCOI2010]序列操作题目内容思路代码P2572[SCOI2010]序列操作题目内容给你一个\(01\)序列,支持\(5\)种操作:0lr区间赋值为\(0\);1lr区间赋值为\(1\);2lr区间取反,即\(0\)变\(1\)、\(1\)变\(0\);3lr询......
  • 杂题随笔 10.31 两道LIS相关的题
    https://www.luogu.com.cn/problem/AT_abc354_f题意:给定一个序列a,求出所有的i使得任意一个a的最长子序列包含i。解法:我们先求这个序列的LIS的长度maxx,然后再去正着求一遍最长上升子序列和反着求一遍最长下降子序列即可,如果拼起来等于maxx那么说明i这个点是满足要求的点。注意细......
  • Day65 小贪心 & 自选杂题
    哎怎么必可公益赛被爆破了,怎么lifan还加了几道我们的训练题目作为补偿。CF不知道死了多久了,一上午都没有打成duel!今天上午精神状态明显好了很多,可能和咖啡有点关系吧。按照时间顺序写题吧。AT_arc070_b可以进行撤销背包,也可以算前后缀背包,都是记录方案数。不难的。AT_a......