首页 > 其他分享 >[CF1019C] Sergey's problem 做题记录

[CF1019C] Sergey's problem 做题记录

时间:2025-01-10 21:12:27浏览次数:1  
标签:ch const ll CF1019C Sergey inline problem mod define

小清新构造题,会就会,不会就不会。

link

注意到走两步很特殊,尝试从走一步拼出来,考虑归纳法:

  • 随便选择一个点 \(x\),然后删掉 \(x\) 和所有 \(y\) 满足存在边 \((x, y)\)。

  • 设剩下的图的答案集合为 \(S\),若不存在 \(z\in S\) 满足存在边 \((z, x)\),则将 \(x\) 加入 \(S\)。

  • 否则 \(z\) 可以覆盖到 \(x\) 和所有 \(y\)(走两步覆盖两个走一步)。

时间复杂度 \(\mathcal O(n + m)\)。

  • 启示:这题很困难,首先是观察这个“走两步”的特点,可以拆成两个走一步;其次是直接套用归纳法,归纳 / 增量 构造是非常常用的构造方法。
点击查看代码
#include <bits/stdc++.h>

namespace Initial {
	#define ll int
	#define ull unsigned long long
	#define fi first
	#define se second
	#define mkp make_pair
	#define pir pair <ll, ll>
	#define pb push_back
	#define i128 __int128
	using namespace std;
	const ll maxn = 1e6 + 10, inf = 1e9, mod = 998244353;
	ll power(ll a, ll b = mod - 2, ll p = mod) {
		ll s = 1;
		while(b) {
			if(b & 1) s = 1ll * s * a %p;
			a = 1ll * a * a %p, b >>= 1;
		} return s;
	}
	template <class T>
	const inline ll pls(const T x, const T y) { return x + y >= mod? x + y - mod : x + y; }
	template <class T>
	const inline void add(T &x, const T y) { x = x + y >= mod? x + y - mod : x + y; }
	template <class T>
	const inline void chkmax(T &x, const T y) { x = x < y? y : x; }
	template <class T>
	const inline void chkmin(T &x, const T y) { x = x > y? y : x; }
} using namespace Initial;

namespace Read {
	char buf[1 << 22], *p1, *p2;
	// #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, (1 << 22) - 10, stdin), p1 == p2)? EOF : *p1++)
	template <class T>
	const inline void rd(T &x) {
		char ch; bool neg = 0;
		while(!isdigit(ch = getchar()))
			if(ch == '-') neg = 1;
		x = ch - '0';
		while(isdigit(ch = getchar()))
			x = (x << 1) + (x << 3) + ch - '0';
		if(neg) x = -x;
	}
} using Read::rd;

ll n, m; vector <ll> to[maxn], res;
bool vis[maxn], chs[maxn];

int main() {
	rd(n), rd(m);
	for(ll i = 1; i <= m; i++) {
		ll u, v; rd(u), rd(v);
		to[u].pb(v);
	}
	for(ll i = n; i; i--) {
		if(vis[i]) continue;
		vis[i] = chs[i] = true;
		for(ll j: to[i]) vis[j] = true;
	} memset(vis, false, sizeof vis);
	for(ll i = 1; i <= n; i++)
		if(chs[i] && !vis[i]) {
			res.pb(i);
			for(ll j: to[i]) vis[j] = true;	
		}
	printf("%d\n", (ll) res.size());
	for(ll x: res) printf("%d ", x); puts("");
	return 0;
}

标签:ch,const,ll,CF1019C,Sergey,inline,problem,mod,define
From: https://www.cnblogs.com/Sktn0089/p/18664711

相关文章

  • 偶斐波那契数列性质与欧拉计划第2题 Properties of Fibonacci numbers and Project Eu
    Problem2EvenFibonaccinumbersEachnewtermintheFibonaccisequenceisgeneratedbyaddingtheprevioustwoterms.Bystartingwith1and2,thefirst10termswillbe:1,2,3,5,8,13,21,34,55,89,…ByconsideringthetermsintheFibonacci......
  • [CF2043D] Problem about GCD 题解
    首先的一个观察是可以把\(G\)除掉,转化成\([\lceil\frac{l}{G}\rceil,\lfloor\frac{r}{G}\rfloor]\)中的两个互质数的差最大值。然后的性质非常神奇。令\(l'\gets\lceil\frac{l}{G}\rceil,r'\gets\lfloor\frac{r}{G}\rfloor\)。若\(r'-l'\)充分大,则一定有一组......
  • STM32CubeMX输出报错“but MDK-ARM V5.32project generation have a problem.”
    前言笔者在使用STM32CubeMX+git协同开发时,从仓库拉取的STM32CubeMX工程使用STM32CubeMX输出代码时报错butMDK-ARMV5.32projectgenerationhaveaproblem。但本地新建一个工程可正常输出。使用的软件版本为●java:23.0.1●STM32CubeMX:6.13.0参考网上其他人分享的方法,......
  • 题解:CF2044D Harder Problem
    CF2044DHarderProblem思路构造一个\(1\simn\)都出现了一次的数列(这样每个数都是众数了),然后只要保证在数组\(a\)里面出现了的数在最前面就好了。AC代码#include<bits/stdc++.h>usingnamespacestd;#defineN200005longlongt,vis[N],cnt,n,a[N];intmain(){ cin......
  • 题解:CF727F Polycarp's problems
    link。贪心做法。本题贪心做法的实质就是用整数尽量多地抵消该整数后面的负数。如果正着做,没有办法考虑全该数后面的所有负数,所以倒着做。例如当前遍历到了\(50\),此时序列如下:\[\dots,50,-50,-10,-20\]易得我们\(50\)应该抵消的是\(-10,-20\),而不是前面的\(-50\),因为......
  • 题解:CF2044C Hard Problem
    CF2044CHardProblem思路先让那\(a+b\)个学生入座,记第一、二排分别入座了\(num1,num2\)个学生。容易想到最终答案为\(2\cdotm\)和\(num1+num2+c\)取最小值。(注:\(2\cdotm\)为所有座位均坐满,\(num1+num2+c\)为所有学生均有位置)AC代码#include<bits/stdc++.h>using......
  • P1303 A*B Problem——高精度乘法
    题目背景高精度乘法模板题。题目描述给出两个非负整数,求它们的乘积。输入格式输入共两行,每行一个非负整数。输出格式输出一个非负整数表示乘积。样例#1样例输入#112样例输出#12提示每个非负整数不超过\(10^{2000}\)。我的作答#include<stdio.h>#include......
  • P1601 A+B Problem(高精)——高精度加法
    题目描述高精度加法,相当于a+bproblem,不用考虑负数。输入格式分两行输入。\(a,b\leq10^{500}\)。输出格式输出只有一行,代表\(a+b\)的值。样例#1样例输入#111样例输出#12样例#2样例输入#210019099样例输出#210100提示\(20\%\)的测试数据,\(0\le......
  • Problem about GCD
    思路首先容易发现题目相当于让你找到一个互质数对\((a,b)\)使得\(l\leqa\cdotG\leqb\cdotG\leqr\),求\(b-a\)最大化然后你发现区间缩小量并不大,简单的,问题可以视作在一个\(10^{18}\)的区间里找互质数对很快你发现,如果从左到右扫\(a\),从右到左扫......
  • 看下面这个Rust程序,我想知道 other_error => panic!("Problem opening the file: {:?}
    看下面这个Rust程序,我想知道other_error=>panic!("Problemopeningthefile:{:?}",other_error)这一行代码,为什么是other_error=>panic...而不是_=>panic...?usestd::fs::File;usestd::io::ErrorKind;fnmain(){letf=File::open("hello.txt&qu......