241115 noip 模拟赛

news/2024/11/15 15:52:05/文章来源:https://www.cnblogs.com/System-Error/p/18548101

省流:\(90 + 100 + 25 + 10\)

T1

题意:给定一个长为 \(n\) 的排列,定义一次操作为选出排列中至多 \(4\) 个不同的数,将它们任意重排,求最少操作次数让这个排列单调递增。

\(n \leq 10^6\)

找出排列的所有置换环,设环长为 \(t_1,t_2,t_3,\cdots,t_m\),则答案为:

\[\sum_{i = 1}^m \lfloor \frac{t_i}{3} \rfloor + \lceil \frac{\sum_{i = 1}^m [t_i \% 3 = 2]}{2} \rceil \]

解释如下:

  • 若环长 \(> 4\),则一次至多只能到位 \(3\) 个数,若最后剩下 \(3\)\(4\) 个,只能多操作一次。而剩余 2 个的情况可以两对两对处理。
  • 最优的操作方案即为:环长 \(> 4\) 时,每次到位 \(3\) 个;环长为 \(3\)\(4\) 时,一次到位;两个环长为 \(2\) 的一次同时到位。

时间复杂度 \(\Theta(n)\)

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int t,n,p[N],vis[N],sum[N];
int main() {ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);cin>>t;while(t--) {cin>>n;for(int i=1; i<=n; i++) cin>>p[i];int tot=0,ans=0;for(int i=1; i<=n; i++) vis[i]=false;int cnt1=0;for(int i=1; i<=n; i++) {if(vis[i]) continue;int cur=i,cnt=0;do {vis[cur]=true;cur=p[cur];cnt++;}while(cur!=i);if(cnt<=1) continue;ans+=cnt/3;cnt%=3;if(cnt==2) cnt1++;}cout<<ans+cnt1/2+cnt1%2<<endl;}return 0;
}

闲话:赛时写了个假完了的贪心,但是发现 \(n \leq 8\) 时卡不掉,特殊性质也卡不掉,有 \(90\) 分,所以不想改了\kx

T2

题意:有一张 \(n\) 个点,\(m\) 条边的图,你可以给每个点赋予互不相同的权值。你可以选择在任意节点出发,每次你可以走向这个与这个点相连的点中点权最小的点。请你找到一种赋予权值、以及选择开始节点的方案,使得你能够访问到的节点数最大(包括开始节点和结束节点),输出这个最大值。

\(n \leq 40\)

直接暴搜,暴搜策略如下。

  • 标记当前点 \(u\),每次选择与 \(u\) 连边的未标记的点 \(v\),然后标记 \(u\) 的所有邻居,并走向 \(v\)

容易证明这样的路径一定合法,我们只需要对每条路径的长度取最大值即可。

暴搜时间复杂度为什么是对的呢?

\(n\) 个点的时间复杂度为 \(T(n)\)

若当前点 \(u\) 还有 \(k\) 个邻居没有被标记,那么走完这一步后,将会新标记 \(k\) 个点。

\(T(n) = T(n - k) \times k + \Theta(n)\),可以得出当 \(k = 3\)\(T(n)\) 取得最劣,为 \(\Theta(3^{\frac{n}{3}} n)\)

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=45;
vector<int> ve[N];
int n,m,vis[N],ans=0;
void dfs(int u,int dep) {ans=max(ans,dep);vector<int> tmp;for(int j=0; j<ve[u].size(); j++) if(!vis[ve[u][j]]) tmp.push_back(ve[u][j]),vis[ve[u][j]]=true;for(int i=0; i<tmp.size(); i++) dfs(tmp[i],dep+1);for(int j=0; j<tmp.size(); j++) vis[tmp[j]]=false;
}
int main() {ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);cin>>n>>m;for(int i=1; i<=m; i++) {int u,v;cin>>u>>v;ve[u].push_back(v);ve[v].push_back(u);}for(int i=1; i<=n; i++) dfs(i,1);cout<<ans;return 0;
}

闲话:其实赛时并不会证明这个复杂度,只是发现大样例跑的特别快,就没管了(

T3

题意:给定一个长为 \(n\) 的递增序列 \(a\),其中有一个数 \(a_k\) 是答案,每次你可以询问一个数 \(x\),然后得知 \(a_k\)\(\geq x\) 还是 \(< x\),花费 \(\lvert a_k - x \rvert\) 的代价,你需要求出一个最优策略使得最坏情况下花费代价最小,输出最小值。

\(n \leq 1000,a_i \leq 10^9\)

考虑区间 dp 表示已经确定答案在这个区间内还需要花费多少的代价,记录区间 \([l,r]\) 以及 \(x\) 表示左端点以前的询问个数和 \(y\) 表示右端点以后的询问个数,方便计算贡献。时间复杂度 \(\Theta(n^5)\)。发现我们只需要记录 \(x - y\) 的值,于是时间复杂度降为 \(\Theta(n^4)\)。发现这个区间 dp 满足四边形不等式,于是可以决策单调性优化,时间复杂度降为 \(\Theta(n^3)\)稍加一点观察,发现 \(x - y\) 的值是 \(\log a_i\) 这个量级的,于是可以把这一维压成 \(\log a_i\),时间复杂度降为 \(\Theta(n^2 \log a_i)\),于是就可以通过了。

\(c\) 为最优操作中的 \(x − y\) 的值,\(\lvert c \rvert\)\(\Theta(\log a_i)\) 级别的大致证明:

  • \(v = a_n\),则答案 \(\leq v\)。策略是直接二分值域查询,代价为 \((\frac{1}{2} + \frac{1}{4} + \cdots) v \leq v\)
  • \(c = 0\) 时询问的 \(y < \frac{v}{3}\)。则 \(x\) 在右侧的代价至少为 \(\frac{2v}{3}\)\(x\) 在左侧的代价至少为 \(\frac{v}{3}\),此后也最多 \(\frac{v}{3}\)。所以左侧代价一定不超过右侧,故此时的最优询问点 \(x\) 一定在 \([\frac{v}{3},\frac{2v}{3}]\) 中。
  • \(c \neq 0\) 时,只会赋一个 \(c\) 更趋于 \(0\) 的趋势,因此 \(\lvert c \rvert\)\(\Theta(\log a_i)\) 级别的。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1005;
int n,a[N],dp[N][N][75],f[N][N][75];
signed main() {cin>>n;for(int i=1; i<=n; i++) cin>>a[i];int k=35;memset(dp,0x3f,sizeof(dp));for(int i=1; i<=n; i++) for(int j=0; j<=2*k; j++) dp[i][i][j]=(j-k)*a[i],f[i][i][j]=i;for(int len=2; len<=n; len++) {for(int l=1; l+len-1<=n; l++) {int r=l+len-1;for(int i=1; i<=2*k-1; i++) {int mn=LONG_LONG_MAX,pos;for(int j=f[l][r-1][i]; j<=min(f[l+1][r][i],r-1); j++) {int x=(dp[j+1][r][i+1]-dp[l][j][i-1])/2;x=max(x,a[j]+1),x=min(x,a[j+1]);int val=max(dp[l][j][i-1]+x,dp[j+1][r][i+1]-x);if(val<mn) mn=val,pos=j;}dp[l][r][i]=mn,f[l][r][i]=pos;}}}cout<<dp[1][n][k];return 0;
}

闲话:赛时会了 \(\Theta(n^4)\),但是边界问题一直没调出来,浪费很多时间,感觉调出来了的话赛时能写出正解。

T4

还不会。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834072.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鸣潮,原神PC端启动器】仿二次元手游PC端游戏启动器,以鸣潮为例。

二游GAMELanucher启动器 1.前言许多二次元手游(原神,鸣潮,少女前线)的PC端启动器都是使用Qt做的,正好最近正在玩鸣潮,心血来潮,便仿鸣潮启动器,从头写一个。先下载一个官方版的PC启动器,找到图标,背景图等素材,然后对着界面写代码就行。效果如下2. 划分模块游戏启动…

css动态检测视口屏幕的尺寸

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>css动态检测屏幕的视口尺寸</title><…

自定义注解进行数据脱敏

前言 有些时候,我们可能对输出的某些字段要做特殊的处理在输出到前端,比如:身份证号,电话等信息,在前端展示的时候我们需要进行脱敏处理,这时候通过自定义注解就非常的有用了。在Jackson中要自定义注解,我们可以通过@JacksonAnnotationsInside注解来实现,如下示例: 一…

openVAS安装记

项目需要使用openVAS 安装步骤 我这里使用的是Ubuntu最新版,因为Ubuntu和debian可通过官网仓库进行安装,因改名为gvm 后续直接上操作 #安装 sudo apt install gvm -y #初始化(可能时间比较长,台会去下载数据库) sudo gvm-setup# 开机自启服务 sudo systemctl enable notus-…

爆火的外卖霸王餐项目,怎么做?

微客云以下是一些做爆火的外卖霸王餐项目的方法: ### 明确项目定位与目标- **确定核心目标**:明确是为了增加新用户、提高复购率、提升品牌知名度还是收集用户反馈等,不同目标决定后续策略 。- **精准定位用户群体**:了解目标用户的消费习惯、喜好、需求及消费能力等,如上…

轮廓线DP

讲解轮廓线DP的两种常见形式以及例题。更新日志概念 类似于状态压缩DP,但我们储存的是轮廓线上的状态。 有些时候,也不需要进行状态压缩,而可以用某一点的状态代表一个区域的状态。 思路 轮廓线就是已经决策的与尚未决策的部分的分界线,我们储存分界线上已经决策过的所有节…

Nuxt.js 应用中的 schema:written 事件钩子详解

title: Nuxt.js 应用中的 schema:written 事件钩子详解 date: 2024/11/15 updated: 2024/11/15 author: cmdragon excerpt: schema:written 钩子是 Vite 提供的一种生命周期钩子,在模式写入完成后调用。通过这个钩子,开发者可以在配置被正式应用之后执行一些后续操作,比如记…

概率与期望基础

实验、结果、样本空间、事件 事件 \(A\) 是否发生取决于一系列影响它的因素,这些因素影响 \(A\) 的过程称为一次 experiment 实验 或 trial 试验 一次试验的 result 结果 称为它的 outcome 结局。\(\text{result}\) 指由原因所引起的结果 \(\text{outcome}\) 强调事件特有的结…

4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明

4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明 @目录4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明前言1. Ribbon 介绍1.1 LB(Load Balance 负载均衡)2. Ribbon 原理2.2 Ribbon 机制3. Spring Cloud Ribbon 实现负载均衡算法-应用实例4. 总结:5. 最后:前…

WSL2的介绍和使用

WSL2的介绍和使用 一、什么是WSL2? WSL是Windows Subsystem for Linux的简称,它是微软为Win10和Win11引入的一项功能。WSL允许用户在Windows上运行Linux操作系统及其相关命令和应用程序,而无需使用虚拟机或安装双系统。 1.1 WSL2与WSL1、传统虚拟机比较WSL1:没有完整的Linu…

插件大总结

加注释插件搜索接口插件mybatis-plus插件

Windows系统日志报错:生成了一个严重警告并将其发送到远程终结点。这会导致连接终止。TLS协议所定义的严重错误代码是10。Windows SChannel错误状态是1203是怎么回事?

当我们检查Windows系统日志发现有一个报错:生成了一个严重警告并将其发送到远程终结点。这会导致连接终止。TLS协议所定义的严重错误代码是10。Windows SChannel错误状态是1203。导致报错的原因是什么?该如何处理?驰网飞飞和你分享当我们检查Windows系统日志发现有一个报错:…