首页 > 其他分享 >Codeforces Round 913 (Div. 3) G.

Codeforces Round 913 (Div. 3) G.

时间:2024-02-06 14:12:06浏览次数:33  
标签:int Codeforces flag tag push idg Div 913 nw

题目链接

G.

把灯看成节点,灯之间的关系看成有向边
得到基环树森林
若节点的入度为0,那么它一定要用一次开关,这是可以确定的
所以用拓扑,把这些确定贡献的节点删去
然后就剩下了若干个环
若环上有奇数个权值为1的节点,那么不可能全部关上
对于环上一个打开的灯,它要么直接用自己的开关关上,要么等其他灯对它的影响,这两种情况都跑一次,取最小值即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;

void solve() {
    int n;cin>>n;
    vector<int>idg(n+1),tag(n+1);
    queue<int>q;
    vector<int>a(n+1);
    string s;cin>>s;
    for(int i=0;i<s.size();i++)tag[i+1]=s[i]-'0';
    for(int i=1;i<=n;i++){
        cin>>a[i];
        idg[a[i]]++;
    }
    for(int i=1;i<=n;i++){
        if(idg[i]==0)q.push(i);
    }
    vector<int>ans;
    while(q.size()){
        int x=q.front();q.pop();
        int y=a[x];
        idg[y]--;
        if(tag[x])tag[y]=!tag[y];
        if(idg[y]==0)q.push(y);
        if(tag[x]){
            tag[x]=0;
            ans.push_back(x);
        }
    }
    for(int i=1;i<=n;i++){
        if(idg[i]&&tag[i]){
            vector<int>ansa,ans_b;
            int nw=i;
            bool flag=false;
            do{
                idg[nw]--;
                if(tag[nw])flag=!flag;
                if(flag)ansa.push_back(nw);
                else ans_b.push_back(nw);
                nw=a[nw];
            }while(idg[nw]);
            if(flag){
                cout<<-1<<'\n';return ;
            }
            if(ansa.size()<ans_b.size())ans.insert(ans.end(),ansa.begin(),ansa.end());
            else ans.insert(ans.end(),ans_b.begin(),ans_b.end());
        }
    }
    cout<<ans.size()<<'\n';
    for(int e:ans)cout<<e<<' ';
    cout<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

标签:int,Codeforces,flag,tag,push,idg,Div,913,nw
From: https://www.cnblogs.com/wwww-/p/18009608

相关文章

  • Codeforces Round 921 (Div. 1) 题解
    HelloAd-HocForces!A字符集为前\(k\)个小写字母,给定长度为\(m\)的字符串,求所有的长度为\(n\)的字符串是否是这个字符串的子串。(此处字串不连续)如果不是需要给出反例。\(1\len,k\le26\),\(1\lem\le1000\)。\(\sumn,\summ\le10^6\)sol.D1A就是神秘贪心,汗流浃背......
  • Codeforces Round 917 (Div. 2)
    https://codeforces.com/contest/1917A.LeastProduct*800给定整数数组,可以把数组中的数\(a_i\)改为\(0\sima_i\)中的任意整数,最小化所有数的乘积,在此基础上使操作次数最少讨论一下负数的个数和\(0\)的个数#include<bits/stdc++.h>usingnamespacestd;usingll......
  • left 3 Codeforces Round 913 (Div. 3)
    题目链接A.把同行同列除了起点都输出即可#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=2e5+10;voidsolve(){charc;inta;cin>>c>>a;for(inti=1;i<=8;i++){if(i==a)continue;cout<<c<......
  • CodeCraft-22 and Codeforces Round 795 (Div. 2)C. Sum of Substrings(分类讨论、贪
    感觉分类讨论的能有点弱。遇到复杂一点的分类讨论的题目,代码就写的巨长。首先观察到处在中间位置的1对答案的贡献是11,具体在中间哪个位置是没有关系的。只有两端的两个位置是比较特殊的\(1位置处的1对答案的贡献是10\)\(2位置处的1对答案的贡献是1\)所有我们考虑将最左端第一......
  • SMU Winter 2024 div2 ptlks的周报Week 2(1.29-2.4)
    这周学习到的知识点有斯特林数(F鸡数题!)F鸡数题!思路第二类斯特林数代码#include<bits/stdc++.h>#defineintlonglong#defineMOD1000000007usingnamespacestd;intn,m,f[100005],fi[100005];intqpow(inta,intn){ intans=1; while(n){ if(n&1){ ......
  • CodeForces 1918E ace5 and Task Order
    洛谷传送门CF传送门世纪难题。首先我们考虑先固定\(x\),比如让\(x=a_1\)(重复问\(1\)直到回答为=),那么此时我们可以知道任意一个\(a_i\)和\(a_1\)的大小关系(问一次\(i\)再问一次\(1\)),并且可以知道\(a_i\)的具体值。那么剩下的数被分成了两个集合,一个\(<a_1\)......
  • left 2 Codeforces Round 916 (Div. 3)
    题目链接A.遍历字符串,用map记录下每个字符出现的次数最后遍历26个字母,若出现了相应次数答案+1#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;voidsolve(){intn;cin>>n;strings;cin>>s;map<char,int>mp;......
  • 【解题报告】CodeForces523D:Statistics of Recompressing Videos
    CF523D解题报告CF523D先上结果:前两次语言选错了,编译一直不过(做这题是因为集训老师让我做我就做了,要不然我都快忘了我有CF账号了(思路省流:STL大法开一个小根堆存目前正在运行的服务器(也可以大根堆,但是存时间进去的时候存负的),如果有空机就直接处理,这个视频处理完的时间就......
  • Codeforces Round 734 (Div. 3)B2. Wonderful Coloring - 2(贪心构造实现)
    思路:分类讨论:当一个数字出现的次数大于等于k,那么最多有k个能被染色,当一个数字出现的次数小于k,南那么这些数字都可能被染色还有一个条件就是需要满足每个颜色的数字个数一样多,这里记出现次数小于k的所有数字的出现次数总和为sum,将所有这些数字排序后,前sum-sum%k个数字是都可以......
  • Codeforces Round 919 (Div. 2)
    A一笔带过,维护可能的最大值和最小值,并对于3操作特殊维护一下即可。B枚举第一个人删多少个数(贪心的想,一定删最大的几个,因为假如留着一定会对第二个人有利)第二个人一定是翻的越多越好,且翻的都是最大的几个数。使用前缀和容易计算答案。C妙妙题。枚举\(k\),接着发现\(a_i......