NOIP 2025 订正

news/2025/12/7 21:39:30/文章来源:https://www.cnblogs.com/Tyih/p/19318797

前言

95+40+4+5=144 pts,wssb

NOIP 后两个小时加起来拿了 9 分的高分,不如冲 T2。

T1 Candy

题目

简单题,忘记特判钱是否够痛失 5 分。

T2 Sale

题目

考场上大概有些思路,但当时在发烧,脑子比较混乱,故去打 T3,T4 暴力,然后,就没有然后了,比赛结束了。。。

考虑容斥将其转换成总方案减去不是最优的方案。

可以先考虑 \(m=2\) 的部分分,我觉得是具有启发性的。

\(w_1=1\) 肯定是最优的,不符合条件。

\(w_1=2\) 时需要考虑什么时候会出现不优的情况。样例告诉我们:因为是按性价比排序,因此可能会出现一个 \(i\) 满足 \(w_i=1\)\(a_i>\frac{a_1}{2}\),此时会先去买第 \(i\) 件物品而导致买不起第 \(1\) 件物品,从而去买第一个 \(w_j=1\) 的物品或是没有买的起的物品。若 \(a_i+a_j<a_1\),则此时不是最优的,因为可以直接去买第 \(1\) 件物品。

可以枚举满足条件的 \(i,j\),从而计算答案。此时会有 \(i\) 前面所有物品的 \(w\) 均为 \(2\)\(w_{i+1\sim j-1}=2\),此时 \(j+1\sim n\) 的值可以任意取,因此贡献为 \(2^{n-j}\)

或是只有一个 \(i\) 此时除 \(i\)\(w\) 均为 \(2\),贡献为 \(1\)

代码长这样:

ll tp=0;
for(int i=2;i<=n;i++){if(a[i]*2<=a[1]) break;if(a[i]^a[1]) tp++;while(tp>=mod) tp-=mod;for(int j=i+1;j<=n;j++){if(a[i]+a[j]<a[1]) tp=(tp+K[n-j])%mod;}
}
ll ans=(K[n]-tp)%mod+mod;
if(ans>=mod) ans-=mod;

注意要特判 \(a_i=a_1\) 的情况。

正解:

会发现最后一定是最后买的物品出现不优的情况,就像 \(m=2\) 一样。

可以枚举 \(i,j\) 表示最后买 \(i\) 的物品是最优的,但去买了 \(j\) 物品。此时有两种情况:

  1. 只有 \(w_j=1\),此时可以枚举 \(w_k=2(k<i)\) 的个数,贡献为 \(\sum\limits_{p=0}^{i-1} \binom{i-1}{p}\binom{j-i-1}{m-p-i-1}=\binom{j-2}{m-i-1}\)。(范德蒙德卷积)

  2. 存在 \(w_k=2\),可以枚举 \(k\),有 \(w_{j+1\sim k-1}=2\),有贡献为 \(2^{n-k}\times \binom{j-2}{m-i-1}\)

复杂度为 \(\mathcal{O(n^3)}\)

发现可以拿指针维护最大满足条件的 \(k\),则贡献为 \(\binom{j-2}{m-i-1}+\sum\limits_{x=k}^n2^{n-x}\binom{j-2}{m-i-1}=2^{n-k+1}\binom{j-2}{m-i-1}\)

要预处理 \(2\) 的幂次。

Code

点击查看代码
#include<bits/stdc++.h>
#define IOS cin.tie(0),cout.tie(0),ios::sync_with_stdio(0)
#define ll long long
#define db double
#define pb push_back
#define eb emplace_back
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define PLL pair<ll,ll>
#define PII pair<int,int>
//#define Tp template<typename T>
//#define Ts template<typename T,typename ...args>
#define lb(x) ((x)&(-x))
using namespace std;
const int N=5e3+20,M=1e5+20,MX=5000;
const ll INF=1ll<<60,mod=998244353;
namespace H_H{int n,m;ll a[N];ll pre[N],prn[N],K[N];inline ll qpow(ll x,ll y){ll Ans=1;for(;y;y>>=1,x=x*x%mod) if(y&1) Ans=Ans*x%mod;return Ans;}inline ll binom(ll x,ll y){if(x<y) return 0;return pre[x]*prn[y]%mod*prn[x-y]%mod;}inline void init(){K[0]=1;for(int i=1;i<=MX;i++) K[i]=K[i-1]*2%mod;pre[0]=prn[0]=1;for(int i=1;i<=MX;i++) pre[i]=pre[i-1]*i%mod;prn[MX]=qpow(pre[MX],mod-2);for(int i=MX-1;i;i--) prn[i]=prn[i+1]*(i+1)%mod;}inline void solve(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n,greater<>());ll ans=0;for(int i=1;i<=n;i++){if(m-i-1<0) break;ll k=n+1;for(int j=i+1;j<=n;j++){if(a[i]==a[j]) continue;if(a[j]*2<=a[i]) break;while(k-1>j && a[k-1]+a[j]<a[i]) k--;ans=(ans+K[n-k+1]*binom(j-2,m-i-1)%mod)%mod;}}cout<<(K[n]-ans+mod)%mod<<"\n";}int main(){init();int C=0,T=1;cin>>C>>T;while(T--) solve();return 0;}
}
int main(){IOS;H_H::main();return 0;
}

T3

T4

\(qn^2\log n\) 跑不过 \(qn^3\)。这就是人傻常数大吗?

好题。

先求前缀和,为 \(a_{0\dots n-1}\)

考虑固定 \(r\) 求所有 \(l\) 造成的贡献。

由于区间长度为 \([L,R]\),因此 \(l\in [r-R,r-L]\)。可以维护一个 \(a\) 递减的序列 \(q_1,\dots,q_k\)

对于序列里的两个位置 \(q_i,q_{i+1}\)。对于答案 \((q_i,q_{i+1}]\) 的贡献为 \(a_r-a_{q_i}\),序列的最后一个数对答案 \((q_k,r]\) 的贡献为 \(a_r-a_{q_k}\)(贡献即为对 ans 取 max)。。可以分别计算贡献。

  1. 维护序列最后一个数的贡献:可以倒着枚举 \(r\),会有 \(q_k\) 是不增的,用 ST 表维护 \(q_k\),单调队列维护 \(q_k\)\(r\) 的贡献,可以看代码。

  2. 维护序列中间的贡献:会有 \(q_{i+1}\)\(q_i\) 右边第一个 \(a\) 比它小的数,可以单调栈预处理。对于 \(i\),设其右边第一个比它小的数的位置为 \(nxt_i\)(没有则 \(nxt_i=n\))。可以看做对于区间 \((i,nxt_i]\)\(\max\limits_{r,r-L\ge nxt_i \wedge r-R\le i} a_r-a_i=\max\limits_{r=nxt_i+L}^{i+R} a_r-a_i\) 可以拿 ST 表维护。可是每一个点会被很多个区间覆盖,最简单的方法是拿线段树维护,但会 TLE。
    会发现每个区间的关系为包含但不交,因此可以把区间看成编号为 \(i+1\) ,权值为这个区间的贡献的点,\(i+1\)\(j+1\) 有一条边,其中 \(j\) 为最大的满足 \((j,nxt_j]\) 包含 \((i,nxt_i]\)。那么 \(i\) 点的答案为它所有祖先的权值的 \(\max\) 遍历一遍树就可以了。

Tip:可以不用建树,对于 \(i\) 点它父亲的编号一定比它小,可以用类似于 dp 的方式处理。

Code

点击查看代码
#include<bits/stdc++.h>
#define IOS cin.tie(0),cout.tie(0),ios::sync_with_stdio(0)
#define ll long long
#define db double
#define pb push_back
#define eb emplace_back
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define PLL pair<ll,ll>
#define PII pair<int,int>
#define fi first
#define se second
//#define Tp template<typename T>
//#define Ts template<typename T,typename ...args>
#define lb(x) ((x)&(-x))
using namespace std;
const int N=5e4+20,M=1e5+20;
const ll INF=1ll<<60,mod=998244353;
namespace H_H{int n,m,ff[N],pre[N],mn[N][17],nxt[N];ll a[N],ans[N],ans1[N],ans2[N];ll K[N],mx[N][17];set<PII> s;inline int get(int x,int y){if(x>y) swap(x,y);return a[x]<=a[y]?x:y;}inline int qmn(int l,int r){while(l>r) return -1;int k=K[r-l+1];return get(mn[l][k],mn[r-(1<<k)+1][k]);}inline ll qmx(int l,int r){while(l>r) return -INF;int k=K[r-l+1];return max(mx[l][k],mx[r-(1<<k)+1][k]);}int st[N],top;PII b[N];inline void init(){ans1[0]=-INF;for(int i=1;i<=n;i++) a[i]+=a[i-1];for(int i=2;i<=n+1;i++) K[i]=K[i>>1]+1;for(int i=1;i<=n;i++){mn[i][0]=i;mx[i][0]=a[i];}for(int j=1;j<=K[n];j++){//ST 表for(int i=1;i+(1<<j)-1<=n;i++){mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);}}for(int j=1;j<=K[n+1];j++){for(int i=0;i+(1<<j)-1<=n;i++){mn[i][j]=get(mn[i][j-1],mn[i+(1<<(j-1))][j-1]);}}st[0]=n;for(int i=n-1;~i;i--){//单调栈while(top && a[st[top]]>a[i]) top--;nxt[i]=st[top];st[++top]=i;b[i]={i+1,nxt[i]};}for(int i=n-1;~i;i--){//找到第一个把它覆盖的点int r=nxt[i];auto itt=s.upper_bound({r,n+1});for(auto it=s.begin();it!=itt;it++) ff[(*it).second]=i+1;s.erase(s.begin(),itt);s.insert({r,i+1});}}inline void Init(){for(int i=1;i<=n;i++){ans[i]=ans1[i]=ans2[i]=-INF;pre[i]=0;}}inline void get_ans(){for(int i=1;i<=n;i++){//与其祖先取 maxans1[i]=max(ans1[i],ans1[ff[i]]);}for(int i=1;i<=n;i++){ans[i]=max(ans1[i],ans2[i]);}}int fr,tl;PLL q[N];int main(){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];init();cin>>m;for(int tt=1,L,R;tt<=m;tt++){cin>>L>>R;Init();fr=1,tl=0;for(int i=n;i;i--){if(i>=L){int pos=qmn(max(0,i-R),i-L);ll tp=a[i]-a[pos];while(fr<=tl && q[tl].se<=tp) tl--;//单调队列维护q[++tl]={pos+1,tp};}while(fr<=tl && q[fr].fi>i) fr++;if(fr<=tl) ans2[i]=q[fr].se;}for(int i=0;i<n;i++){ans1[i+1]=qmx(nxt[i]+L,min(n,i+R))-a[i];}get_ans();unsigned ll Ans=0;for(int i=1;i<=n;i++) Ans^=ans[i]*i;cout<<Ans<<"\n";}return 0;}
}
int main(){IOS;H_H::main();return 0;
}

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

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

相关文章

20232407 2025-2026-1 《网络与系统攻防技术》 实验八实验报告

1.实验内容 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。 (2)Web前端javascipt理解JavaScript的基本功能,理解DOM。在(1)的基础上,编写JavaScript验…

北京陪诊服务专业排行榜出炉,守嘉、翌家、华夏天和位居三甲

就医路上不再孤单,专业陪诊服务为患者点亮一盏灯。行业调研揭示,专业化与人性化并重成为优质服务核心准则。 挂号排队、科室迷茫、异地就医流程不熟,这些就医过程中的常见难题,如今正被新兴的陪诊服务有效化解。随…

Linux 运维100 条命令

Linux 运维100 条命令1. 系统信息查看 查看系统版本cat /etc/os-release lsb_release -a uname -a 查看内核信息uname -r 查看 CPU 信息cat /proc/cpuinfo lscpu 查看内存使用情况free -h cat /proc/meminfo 查看系统运…

个人电脑上的本地私有知识库解决方案:访答知识库深度解析

个人电脑上的本地私有知识库解决方案:访答知识库深度解析 在信息爆炸的时代,如何有效管理和利用个人知识资产成为了许多专业人士面临的挑战。随着数据隐私意识的增强,越来越多的用户开始寻求既安全又高效的知识管理…

[豪の算法奇妙冒险] 代码随想录算法训练营第十六天 | 513-找树左下角的值、112-路径总和、113-路径总和Ⅱ、106-从中序与后序遍历序列构造二叉树、105-从前序与中序遍历序列构造二叉树

LeetCode513 找树左下角的值、 LeetCode112 路径总和、 LeetCode113 路径总和Ⅱ、 LeetCode106 从中序与后序遍历序列构造二叉树、 LeetCode105 从前序与中序遍历序列构造二叉树代码随想录算法训练营第十六天 | 513-找…

Spark-3.5.7文档1 - 快捷开始

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

北京上门收画回收名家字画机构公司推荐和排行

京城名家字画如何“变现”?媒体联合行业协会调研,四家机构凭专业与服务入选推荐榜 随着传统文化热潮的兴起和艺术品资产属性的增强,越来越多的北京市民开始关注家中珍藏的字画如何妥善“变现”。然而,字画回收市场…

2025.12.7——1蓝

提高+/省选- P13825 【模板】线段树 1.5 被vector内存分配问题卡住,真的,太无语了。

虚拟机设置网络适配器为桥接模式,并且设置固定ip

将虚拟机设置为桥接模式: vmware -> 虚拟机 -> 设置 -> 网络适配器:桥接模式 vmware -> 虚拟网络编辑器 -> VMNet信息:选择桥接模式:选择宿主机对应的网卡 -> 应用 -> 确定: 宿主机网卡查看…

洛谷P3287 [SCOI2014] 方伯伯的玉米田 (二维树状数组+dp枚举)

原题链接 题解 难点一:区间右端点的确定首先,一个拔高区间的右端点一定是最右端n,接下来假设区间 [ L , R ] L>1 && R<n 我们按照左右区间情况讨论1、对于区间左边而言——从左边到右,区间对于左侧的…

北京上门收字画机构推荐榜单

我根据近期对北京地区上门收字画市场的调研情况,结合多家机构在资质合规性、鉴定专业性、报价透明度、服务完善度四个维度的表现,为您梳理了以下排行与推荐。 这份榜单旨在帮助市民在处置闲置字画时,能快速匹配到最…

某机构推出AI模型深度定制服务,重塑品牌专属生成式AI

某中心发布了一项名为“AI Foundry”的新型模型定制服务,旨在为企业客户重构和重新训练其旗舰AI模型“Firefly”,打造理解品牌IP的多模态专属模型,而不仅仅是进行微调。某机构推出AI模型深度定制服务,重塑品牌专属…

Nano-vLLM-Ascend

参考 https://github.com/linzm1007/nano-vllm-ascend Nano-vLLM-Ascend nano-vllm是开源的一个gpu推理项目,基于开源版本弄的一个ascend npu版本推理小demo,旨在帮助初学者了解推理的整体流程,区别于vllm,nano-vl…

【SPI】SPI与QSPI异同与使用

SPI及其衍生协议 SPI协议包括:标准SPI协议,Dual SPI和Queued SPI三种协议接口。标准SPI协议,有4根线,分别为CS(片选)、CLK(时钟)、MISO(主入从出)和MOSI(主出从入)。支持全双工通信 Dual SPI,针对SPI Flash,全双工…

ES2T 34托盘相关报警

座板线: 报警文字:缓存工位无托盘报警/工作位无托盘报警 只跟托盘感应有关,跟RFID无关 3种触发条件: 1.前工位放行后持续30s未接收到托盘 2.发出放行指令时托盘并不存在(之前接受到的托盘感应不到了) 3.发出放行…

20251207 之所思 - 人生如梦

20251207 之所思今天是一个值得纪念的日子,我的第一本英文小说《追风筝的人》抄录完成。从2025年5月2日开始到今天,历时7个月零5天,期间有过无数次的想要放弃,但是为了心中的那个信念(学好英语)一次又一次的咬牙…

2025NOIP游记(有空更新)

2025 NOIP游记:此时此刻。马上就要奔赴考场了,这两天也看到了不少朋友或陌生人AFO的帖子。此时此刻,恰如彼时彼刻,我想明年的今天,我应该也会加入这些写AFO祭的一员。去年的我这样写道。 day—— -1 11.28 下午五…

【2025年12月最新】英语四级历年真题试卷、听力音频及答案解析~PDF电子版(2015-2025年6月) - 详解

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

不同深度学习框架中实现人工神经元基本计算单元的模块对比

不同深度学习框架中实现人工神经元基本计算单元的模块对比 在人工神经网络中,最核心的计算单元遵循统一的数学形式: \[\mathbf{y} = f(\mathbf{W}\mathbf{x} + \mathbf{b}) \]其中:\(\mathbf{x}\) 是输入向量, \(\…

[容器] Podman : 一款新型的容器引擎与容器管理工具

1 概述: Podman当我们谈论容器时,我们首先想到的默认工具就是Docker。但自从 Docker 诞生以来,容器领域已经有了很多发展,特别是在容器安全方面。Podman 是解决安全问题的项目之一。Podman(POD Manager)是一个开源…