首页 > 其他分享 >好题记录 8.8

好题记录 8.8

时间:2024-08-08 16:53:52浏览次数:17  
标签:lceil 记录 int 8.8 好题 sqrt dep maxn rceil

CF1325F Ehab’s Last Theorem

题意

给定一个 n n n 个点, m m m 条边的无向图。让你找出一个至少有 ⌈ n ⌉ \lceil\sqrt n\rceil ⌈n ​⌉ 个点的环 正好有 ⌈ n ⌉ \lceil\sqrt n\rceil ⌈n ​⌉ 个点的独立集。

解析

  1. 构造环

    考虑将原图放到 DFS 树上考虑,在 DFS 树上记录每个点的深度 dep \text{dep} dep 值,如果一条非树边连接的两个点 u , v u,v u,v,使得 d e p u − d e p v + 1 ≥ ⌈ n ⌉ dep_u-dep_v+1\ge \lceil\sqrt n\rceil depu​−depv​+1≥⌈n ​⌉,则我们在原图找到了一个至少有 ⌈ n ⌉ \lceil\sqrt n\rceil ⌈n ​⌉ 个点的环。

    结论显而易见嘛,在树边上 u,v 这条链上至少有 d e p u − d e p v + 1 dep_u-dep_v+1 depu​−depv​+1 个节点,又因为有返祖边就形成了环。

  2. 构造独立集

    如果用上述方法找不到满足条件的环,我们就只能考虑构造独立集,根据第一问的结论,运用反证法,我们就可以得到结论:

如果图上不存在一个至少有 ⌈ n ⌉ \lceil\sqrt n\rceil ⌈n ​⌉ 个点的环,那么最多存在一个至少有 ⌈ n ⌉ − 2 \lceil\sqrt n\rceil-2 ⌈n ​⌉−2 个点的环,即图上每个节点至多只存在 ⌈ n ⌉ − 3 \lceil\sqrt n\rceil-3 ⌈n ​⌉−3 条返祖边。

证明很简单,假设有节点存在 ⌈ n ⌉ − 1 \lceil\sqrt n\rceil-1 ⌈n ​⌉−1 条返祖边,那么必然有一条返祖边所连接的点与自己就会形成一个至少有 ⌈ n ⌉ \lceil\sqrt n\rceil ⌈n ​⌉ 个点的环,矛盾。

接下来我们就可以构造独立集了,每次我们可以选择一个节点放入独立集,并将与该点相连接的点删除,重复此操作 ⌈ n ⌉ \lceil\sqrt n\rceil ⌈n ​⌉ 次,我们就可以得到一个 ⌈ n ⌉ \lceil\sqrt n\rceil ⌈n ​⌉ 个点的独立集了。

这时候可能会有人有疑惑:为什么你能保证一定可以重复 ⌈ n ⌉ \lceil\sqrt n\rceil ⌈n ​⌉ 此操作呢?

根据上面的结论,一个节点最多只有 ⌈ n ⌉ − 3 \lceil\sqrt n\rceil-3 ⌈n ​⌉−3 条返祖边,再算上该节点的父亲和自己本身,每次操作最多只会删除 ⌈ n ⌉ − 1 \lceil\sqrt n\rceil-1 ⌈n ​⌉−1 个节点,所以前 ⌈ n ⌉ − 1 \lceil\sqrt n\rceil-1 ⌈n ​⌉−1 次操作最多只会删除 ( ⌈ n ⌉ − 1 ) × ( ⌈ n ⌉ − 1 ) ≤ n (\lceil\sqrt n\rceil-1)\times(\lceil\sqrt n\rceil-1)\le n (⌈n ​⌉−1)×(⌈n ​⌉−1)≤n 各节点,所以一定删不完,所以最后还能再取一次,所以能取 ⌈ n ⌉ \lceil\sqrt n\rceil ⌈n ​⌉ 次。

做到这里整道题目就做完了,总结一下,能构造出第二问的充分条件就是构造不出第一问。

最后附上代码:

#include <bits/stdc++.h>

using namespace std;
const int maxn = 2e5 + 10;

int n, m, k;
int dep[maxn];
bool vis[maxn];
vector<int> e[maxn], ans, st;

void dfs(int u, int fa) {
	dep[u] = dep[fa] + 1;
	st.push_back(u);
	for (auto v: e[u]) {
		if (!dep[v]) dfs(v, u);
		if (dep[u] - dep[v] + 1 >= k) {
			cout << 2 << '\n' << dep[u] - dep[v] + 1 << '\n';
			for (int i = dep[v]; i <= dep[u]; ++i) cout << st[i - 1] << ' ';
			exit(0);
		}
	}
	if (!vis[u]) {
		ans.push_back(u);
		for (auto v: e[u]) vis[v] = 1;
	}
	st.pop_back();
}

signed main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m;
	k = sqrt(n - 1) + 1;
	for (int i = 1, u, v; i <= m; ++i) {
		cin >> u >> v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs(1, 0);
	cout << 1 << '\n';
	for (int i = 1; i <= k; ++i) cout << ans[i - 1] << ' ';
}

CF1476C Longest Simple Cycle

思路

一眼题,考虑 dp 做法

很容易看出,如果是成环的话有两种情况

  • 与上一条链连接的起点,终点所连节点重合( a i = b i a_i=b_i ai​=bi​),那么前一个的最大值要舍去,环长度为 f i = a i + 1 f_i=a_i + 1 fi​=ai​+1。

  • 起点,终点不重合( a i ≠ b i a_i\ne b_i ai​=bi​),那么可以对前一条链组成的环进行选择。容易得到 f i = max ⁡ ( f i − 1 + a i + 1 − ∣ b i − c i ∣ , a i + 1 + ∣ b i − c i ∣ ) f_i=\max(f_{i - 1} + a_i + 1 - \left|b_i - c_i\right|,a_i + 1 + \left|b_i - c_i\right|) fi​=max(fi−1​+ai​+1−∣bi​−ci​∣,ai​+1+∣bi​−ci​∣)。

代码

#include <bits/stdc++.h>
#define int long long
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)

using namespace std;
const int maxn = 1e5 + 10;

int n;
int a[maxn], b[maxn], c[maxn];
int f[maxn];

inline void solve() {
	cin >> n;
	int ans = 0;
	for (int i = 1; i <= n; ++i) cin >> a[i];
	for (int i = 1; i <= n; ++i) cin >> b[i];
	for (int i = 1; i <= n; ++i) cin >> c[i];
	f[1] = 1;
	for (int i = 2; i <= n; ++i) {
		if (b[i] == c[i]) f[i] = (a[i] - 1) + 2;
		else f[i] = max(f[i - 1] + a[i] - 1 + 2 - abs(b[i] - c[i]), a[i] - 1 + 2 + abs(b[i] - c[i]));
		ans = max(ans, f[i]);
	}
	cout << ans << '\n';
}

signed main() {
	ios;
	int t;
	cin >> t;
	while (t--) solve();
}

标签:lceil,记录,int,8.8,好题,sqrt,dep,maxn,rceil
From: https://blog.csdn.net/fanchengyou/article/details/141031182

相关文章

  • Pikachu靶场练习记录--2--Cross-Site Scripting(xss)
        1.简述        XSS攻击,即跨站脚本攻击,是一种网络安全威胁。为了避免与层叠样式表(CascadingStyleSheets,CSS)的缩写混淆,因此将跨站脚本攻击缩写为XSS。此类攻击通过在Web页面中插入恶意的脚本代码,用户在访问该页面时,这些嵌入的脚本代码会被执行,从而对用户......
  • Pikachu靶场练习记录--1--Burt Force(暴力破解漏洞)
        1.基于表单的暴力破解随便输入点东西,打开bp拦截抓包。准备好开始进攻          下面显示登陆成功。    2.验证码绕过(onserver)依然使用暴力破解对目标登录成功。    3.验证码绕过(onclient)但是下面的英文显......
  • Java使用POI导入excel记录
    1.controller:@PostMapping("/import-excel")@TransactionalpublicAjaxResultimportExcel(@RequestPart(value="file")MultipartFilefile)throwsException{Stringresult=manufacturerService.importExcel(file);returnAjaxResult.......
  • Redis-Sentinel部署记录
    目录Sentinel哨兵模式介绍Sentinel状态持久化Sentinel作用Sentinel工作方式(每个Sentinel实例都执行的定时任务)三个定时监控任务Sentinel搭建过程所有主机创建sentinel目录所有主机创建sentinel配置文件启动sentinel模拟主库宕机Sentinel常用命令PINGSENTINELmasterSENTINELslave......
  • 2024.8.8 test
    A对于长度为\(2^n\)的序列\(A,B\),求\(c_{k}=\max_{i|j}a_i+b_j\),\(n\le18\)。考虑分治:每次分成\(A_0,A_1,B_0,B_1\)。那么,\(C_0=\max(A_0+B_0),C_1=\max(A_0+B_1,A_1+B_0,A_1+B_1)\)。我们继续分治下去,即上面四种情况每种都要做一遍。不妨合并同类项,\(C_1=\max(A_1+\ma......
  • Redis-主从复制部署记录
    目录主从模式介绍作用工作原理全量同步增量同步主库是否要开启持久化?主从搭建过程主机规划下载redis安装依赖关闭防火墙编译安装redis所有主机配置环境变量所有主机创建Redis的数据存储目录所有主机创建配置文件启动redis使用system管理启动警告处理开启主从从库开启主从主库查看......
  • 百洋医药上半年利润预增:股权质押下,8.8亿高溢价关联收购引关注
    《港湾商业观察》廖紫雯日前,青岛百洋医药股份有限公司(以下简称:百洋医药,301015.SZ)发布2024年半年度业绩预告,披露今年上半年公司利润端得到一定增长,但相较于2023年上半年利润增速有所下滑。此前7月12日,公司发布公告披露已完成对上海百洋制药股份有限公司共60.199%的股权收购,......
  • 工作日志(记录自己的日常学习和腹诽)
    工作日志为了纪念自己的学习经历,也为了记录自己的试错过程创建于2024.6.11作者:刘佳琪[email protected]安装Keil5,破解软件需要防止被电脑病毒查杀功能删掉。24.06.18proteus8.13版本,51单片机串口无效,需替换MCS8051_7.DLL文件到MCS8051.DLL文件并改名为......
  • 8.8 Day2 - 嘿嘿黑黑黑
    0记住题有三不做。第一,yyn出的题不做。第二,码量不小的黑不做。第三,超过NOIP范围的不做(多项式……)。你不会真的想爆切IOI???所以一天的任务就非常轻松了。1.1TreeGenerator™做过不讲。1.2PuddingMonsters做过。把等号变成不等号维护最值。1.3CuttingaFence笛卡......
  • 刷题记录2
    小白逛公园注意线段树的分块思维,以及分治的思维,写了好久,还看了题解ACcode#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong//P4513小白逛公园intread(){intx=0,f=1;charch=getchar();while(!isdigit(ch)){if(ch=='-')f......