https://codeforces.com/gym/101964/problem/H
这题没时间思考了。。。感觉是有可能想出来的。。。主要是前期G和I题做太久了,前期签到也是各种wa。。。
题面剧毒就不说了,1-M写成1-N,那么if and only if感觉出题人根本不懂什么叫充分必要,然后样例输入还是错的。。。
意思是对于每条边有向边如果x是开心,y是不开心,那么x->y这条wish就被满足了,题目给你M条边,让你找出某种情况下至少有M/4+1条边满足了,然后给出任意一种方案,只要给出哪些边被满足了
我们知道对于每一条边x->y,对于x,y随机开心不开心,那么x->y被满足的概率就是1/4了,那么这题随机一下每个点时开心还是不开心,有M/4+1条边被满足的概率是很大的,所以随机到满足就行了。。。有点像ccpc2017哈尔滨的那个几何题
#include<bits/stdc++.h>
using namespace std;
const int maxl=2e5+10;
mt19937 rnd(time(NULL));
int n,m,sum;
int a[maxl];
struct node
{
int x,y;
}e[maxl];
inline void prework()
{
scanf("%d%d",&n,&m);
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
e[i]=node{u,v};
}
}
inline void mainwork()
{
sum=0;int lim=m/4+1;
while(sum<lim)
{
sum=0;
for(int i=1;i<=n;i++)
a[i]=rnd()%2;
for(int i=1;i<=m;i++)
if(a[e[i].x] && !a[e[i].y])
++sum;
}
}
inline void print()
{
printf("%d\n",sum);
for(int i=1;i<=m;i++)
if(a[e[i].x] && !a[e[i].y])
printf("%d ",i);
puts("");
}
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}