NOIP2025模拟4

news/2025/11/9 21:58:03/文章来源:https://www.cnblogs.com/countryhuman/p/19205378

前言:

好久没写改题记录了。(真的有很久吗?)

趁着今晚有空,赶紧写一写。

T1:括号问号(bracket)

思路:

原本在和学妹“愉快地”卡最优解,结果好像把评测机玩的有点生气了,直接从 \(83 ~ ms\) 跑成了 \(94 ~ ms\)

看着括号匹配问题显然一眼 \(dp\)

我们令 " ( " 对应的值为 \(1\) ," ) " 对应的值为 \(-1\)

\(dp_{i,j}\) 表示前 \(i\) 个,前缀和为 \(j\) 的方案数。

状态转移很显然。只是要注意 " ? " 既可作 " ( " ,又可作 " ) "。

代码:

$code$
#include<iostream>
using namespace std;
const int N=5005,mod=998244353;
unsigned int dp[2][N],ans;
int n;
bool st;
char ch[N];
int main(){freopen("bracket.in","r",stdin);freopen("bracket.out","w",stdout);ios::sync_with_stdio(false);cin>>n>>(ch+1);dp[0][0]=1ll;for(int i=1;i<=n;i++){st^=1;for(int j=0;j<=i;j++) dp[st][j]=dp[st^1][j];if(ch[i]=='(') for(int j=1;j<=i;j++) dp[st][j]=(dp[st][j]+dp[st^1][j-1])%mod;else if(ch[i]==')') for(int j=0;j<=i;j++) dp[st][j]=(dp[st][j]+dp[st^1][j+1])%mod;else{for(int j=0;j<=i;j++){if(!j) dp[st][j]=(dp[st][j]+dp[st^1][j+1])%mod;else dp[st][j]=(dp[st][j]+dp[st^1][j+1]+dp[st^1][j-1])%mod;}}}cout<<dp[st][0]<<'\n';return 0;
} /*
4
(?)?50
???)??)?(?)(?(??)????(?)?))?)((?()??(??))(()()((?(*/

T2:狗卡(dog)

思路:

小狗什么的最可爱啦~~

当然,某卡除外!

首先根据题目的数据范围可以确定的是,每一个武将都可以完全升级完。

对于每一个武将来说,\(ta\) 的收益等于 \(m-time\)(该武将出现的时间)

显然我们优先升级当前升级所需时间较短的武将更优。

但是因为我们不能越过低级武将去升级高级武将。所以我们可以将一大堆同一武将的不同等级捆在一起,按照他们的平均值进行排序,最后从小到大处理就好了。

但是具体怎么搞呢?

依据小学数学可知,当往一个序列里放入一个比平均值还要小时,这个序列的平均值会减小。

那么我们可以先将每一位武将单独捆作一捆。

如果当前捆的平均值小于等于后一捆的平均值,那我们就把当前捆与后一捆合并。

最后排个序就大功告成啦~~

代码:

$code$
#include<iostream>
#include<algorithm>
#include<vector>
#define int long long
using namespace std;
const int N=6e5+5;
int n,m,k,x,cnt,tim,ans,q[N];
struct flower{int sum,num,id;bool operator < (const flower &css)const{return sum*css.num<css.sum*num; }
}d[N<<1];
vector<int> a[N];
vector<flower> v[N];
inline void work(int sum,int num,int id){flower x=v[id].back();v[id].pop_back();x.sum+=sum;x.num+=num;if(!v[id].empty()&&x.sum*v[id].back().num<=x.num*v[id].back().sum) work(x.sum,x.num,id);else v[id].push_back(x);
}
signed main(){freopen("dog.in","r",stdin);freopen("dog.out","w",stdout);ios::sync_with_stdio(false);cin>>n>>m;for(int i=1;i<=n;i++){cin>>k;for(int j=1;j<=k;j++){cin>>x;a[i].push_back(x);flower t={x,1,i};//这捆武将的和,个数,武将编号 if(j==1){v[i].push_back(t);continue;}if(x<=v[i].back().sum/v[i].back().num) work(x,1,i);//合并 else v[i].push_back(t);}for(auto b:v[i]) d[++cnt]=b;}sort(d+1,d+1+cnt);//排序 for(int i=1;i<=cnt;i++){flower t=d[i];for(int j=q[t.id];j<=q[t.id]+t.num-1;j++){//把这一捆升级了 tim+=a[t.id][j];ans+=m-tim;}q[t.id]+=t.num;//该武将升到几级了 }cout<<ans<<'\n';return 0;
}

T3:均衡区间(interval)

我做主(疑似放假怒追小说的后遗症),T3严格简单于T2。

朕先送诸爱卿原(黑) (毫无意义,纯交着玩)

思路:

这里只拿左端点举例,右端点同理哈

首先肯定要枚举一下哪个点作为左端点。

一个点可以作为左端点的条件是它的右面既有比它大的数,又有比它小的数。

那么我们首先要做的就是统计这个点的右面出现的第一个大于/小于这个点的数的位置

然后我们可以很惊奇地发现:这玩意假了

为啥呢?

因为第一个大于左端点的数的下一个数可能会更大,这一段显然也不是能使左端点合法的右端点,所以我们要去掉它们。

怎么去呢?

我们可以再统计一下从这个点开始的递增/减区间的长度

这部分就是不合法的部分,把它们减去就好了。

代码:

$code$
#include<iostream>
#include<queue>
using namespace std;
const int N=1e6+5;
int n,id,a[N];
int rmax[N],rmin[N],ranum[N],rbnum[N],r[N];
int lmax[N],lmin[N],lanum[N],lbnum[N],l[N];
deque<int> qmax,qmin;
int main(){freopen("interval.in","r",stdin);freopen("interval.out","w",stdout);ios::sync_with_stdio(false);cin>>n>>id;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){while(!qmax.empty()&&a[qmax.front()]<=a[i]) rmax[qmax.front()]=i,qmax.pop_front();while(!qmin.empty()&&a[qmin.front()]>=a[i]) rmin[qmin.front()]=i,qmin.pop_front();qmax.push_front(i);qmin.push_front(i);}//统计这个点的右面出现的第一个大于/小于这个点的数的位置 while(!qmax.empty()) qmax.pop_front();while(!qmin.empty()) qmin.pop_front();for(int i=n;i>=1;i--){while(!qmax.empty()&&a[qmax.front()]<=a[i]) lmax[qmax.front()]=i,qmax.pop_front();while(!qmin.empty()&&a[qmin.front()]>=a[i]) lmin[qmin.front()]=i,qmin.pop_front();qmax.push_front(i);qmin.push_front(i);}for(int i=1;i<=n;i++){if(!rmin[i]) rmin[i]=n+1;if(!rmax[i]) rmax[i]=n+1;if(!lmin[i]) lmin[i]=0;if(!lmax[i]) lmax[i]=0;}ranum[n+1]=rbnum[n+1]=-1;for(int i=n;i>=1;i--){ranum[i]=ranum[rmax[i]]+1;rbnum[i]=rbnum[rmin[i]]+1;if(!ranum[i]||!rbnum[i]||id==2){r[i]=0;continue;}int r1=rmax[i],r2=rmin[i],ans=0;if(r1<r2){while(r1<r2) r1=rmax[r1];ans=n-r2+1-(ranum[r1]+rbnum[r2]+2);}else{while(r2<r1) r2=rmin[r2];ans=n-r1+1-(ranum[r1]+rbnum[r2]+2);}r[i]=ans;}for(int i=1;i<=n;i++) cout<<r[i]<<' ';cout<<'\n';lanum[0]=lbnum[0]=-1;for(int i=1;i<=n;i++){lanum[i]=lanum[lmax[i]]+1;lbnum[i]=lbnum[lmin[i]]+1;if(!lanum[i]||!lbnum[i]||id==2){l[i]=0;continue;}int l1=lmax[i],l2=lmin[i],ans=0;if(l1>l2){while(l1>l2) l1=lmax[l1];ans=l2-(lanum[l1]+lbnum[l2]+2);}else{while(l2>l1) l2=lmin[l2];ans=l1-(lanum[l1]+lbnum[l2]+2);}l[i]=ans;}for(int i=1;i<=n;i++) cout<<l[i]<<' ';return 0;
}

后言

我说开这篇博客有一小部分原因是为了放图你们信吗?

我终于在放假的时候想起来往博客园上传图了!

(不过其实也没传几张,因为手机传图真的太太太太费劲了)

$picture$

image

image

image

image

image

闲话

嘿嘿,明天再写~~

(嘻嘻,少见还有咕闲话的吧)

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

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

相关文章

【前端知识】npm依赖升级以及冲突解决 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

# MBTI人格测试系统 - 课程设计选题博客

MBTI人格测试系统 - 课程设计选题博客 一、AI工具辅助选题 本次选题使用DeepSeek大模型辅助完成。通过AI工具检索了MBTI测试系统的主流实现方案、核心功能模块及技术难点,同时借助AI生成了初步的功能架构图和类设计思…

完整教程:详细介绍C++中捕获异常类型的方式有哪些,分别用于哪些情形,哪些异常捕获可用于通过OLE操作excel异常

完整教程:详细介绍C++中捕获异常类型的方式有哪些,分别用于哪些情形,哪些异常捕获可用于通过OLE操作excel异常pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; di…

jmeter基础测试1

一.基础HTTP GET接口请求测试打开JMeter,新建测试计划,右键添加“线程组”(线程数1、循环次数1)。线程组下添加“HTTP请求”,服务器名称/IP填写httpbin.org,端口80,请求方法选GET,路径填写/get。添“察看结果树…

网页中的三次握手,四次挥手

目的:在客户端和服务器之间建立一个可靠的TCP连接,确保双方都具有发送和接收数据的能力。 这个过程就像一个双方确认通话的过程: 第一次握手 - SYN 客户端 向 服务器 发送一个TCP数据包。 第二次握手 - SYN-ACK 服务…

设计驱动开发实战

设计驱动开发(Specification/SDD Driven Development, 简称 SDD)” 前提:安装OpenSec已完成(SDD介绍) 如果觉得有用,请关注微信公众号:阿呆-bot() 目标:生成多租架构+元数据管理资源的服务,整体安装先设计、后…

Linux - 11 Shell(脚本、变量、条件判断)

Linux Shell 是操作系统的命令行界面(CLI),也是用户与内核交互的桥梁 —— 用户输入命令后,Shell 解析并执行,最终将结果返回。它不仅是执行单个命令的工具,更是强大的脚本语言环境,可自动化重复任务、批量处理…

pythontip 字符串转列表

编写一个程序将字符串转换为字典。 定义函数convert_str_list_to_dict(),参数为str_list(输入的字符串)。 在函数内部,创建一个字典,其中每个字符串使用=进行分割,第一部分为键,第二部分为值。 返回字典。这道题主…

flask: 用click自定义flask的命令

一,安装第三方库 $ pip3 install click 二,代码: import click...@app.cli.command(hellocmd) def hello():"""命令说明:hello命令向你说hello"""click.echo(Update version ...)pri…

arXiv论文管理RAG系统:从零构建生产级AI研究助手

一个完整的生产级RAG系统,能够自动获取arXiv论文、理解内容并回答研究问题。项目涵盖基础设施搭建、PDF处理、混合搜索和LLM集成,适合学习现代AI工程技能。arXiv论文管理RAG系统 一个完整的生产级检索增强生成(RAG)系…

双亲委派模型?就是【Java开发日记】请介绍类加载过程,什么

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

#20232408 2025-2026-1 《网络与系统攻防技术》实验四实验报告 - 20232408

一、实验内容 1.1 实验要求 (1)对恶意代码样本进行识别文件类型、脱壳、字符串提取操作。 (2)使用IDA Pro静态或动态分析所给的exe文件,找到输出成功信息的方法。 (3)分析恶意代码样本并撰写报告,回答问题。 (…

2025.11.10~2025.11.16

周计划 除了当天学习任务之外只搞dp相关练习 提前把练习的内容准备好 模拟赛尽快全部拿到会的分数,只有这一个目标 每天晚上8:30开始总结今天一天的题目收获(做法) 然后补充周计划,NOIP前计划,个人原则 作息规律…

性能学习

1.性能测试理论 01.性能测试理论 02.性能测试指标 03.性能测试流程 2.Jmeter学习 01.jmeter介绍与安装 02.线程组 03.setup线程组 04.tearDown线程组 05.http请求 06.分布式jmeter

实用指南:苹果手机误删照片?别慌,这些找回方法助你找回珍贵回忆

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

前端三剑客——javascript-BOM-DOM-http协议-异步

大纲:1.BOM(浏览器对象模型) window对象 location对象 本地存储2.DOM(文档对象模型)元素操作(直接获取/间接获取)事件操作3.js异步PromiseAsync/await4.HTTP协议URL地址解释HTTP协议概述常见HTTP请求方法请求…

npm: 无法加载文件

在VSCODE终端窗口里运行 编译 TYPESCIPT脚本时(node hello.ts),提示 :npm: 无法加载文件 D:\Program Files\Nodejs\node_global\nmp.ps1, 因为在此系统禁止运行脚本。简单例子: 在VSCODE终端窗口里运行 编译 TYP…

C语言中的算术类型转换

1.寻常算数转换 在C语言中,当不同类型的操作数参与到算术运算时,编译器会将操作数转换成同一类型,再运算。这一过程被称为寻常算术转换,由于这个过程我们程序员看不见,所以它也是一种隐式类型转换(见整型提升) …

OIFHA251108(成都嘉祥)

吐槽 虽然难,但全部都是比较好玩的题目(除了 \(T_1\))。 T1 幸好没做这题(doge)。 其核心思想在于看到有向图以及每条边可以走很多次且只算一次需要很快想到 tarjan,为什么要很快?因为你还要调代码。 然后这是一…

NOIP 模拟赛 4 总结

分数:\(40 + 0 + 0 + 0 = \color{red}{40}\)我恨子任务! 我恨全是坑的贪心! 我很码量超大的数据结构! 我恨 ad-hoc !当然,还是要承认自己很菜,不然分数不可能如此惨淡。 T1 众所周知,贪心本身并不难,难的是这…