当前位置: 首页 > news >正文

11.15 洛谷 NOIP 模拟赛

T1

题面

P14507 缺零分治 mexdnc

题目描述

给定一个正整数 \(n\)\(n\) 个二元组 \((a_i,b_i)\),表示现在有 \(b_i\) 个大小为 \(a_i\) 的数。

定义一个可重集合的 \(\operatorname{mex}\) 为最小的没有在这个集合中出现的自然数。

你需要将这 \(\sum_{i=1}^{n} b_i\) 个数划分成 \(k(k\ge 1)\) 个可重集合,使得这 \(k\) 个可重集合的 \(\operatorname{mex}\) 之和恰好\(m\),并最小化这个 \(k\)

现在有 \(q\) 组询问,对于每一组询问给定一个 \(m\),你需要输出最小的 \(k\),如果无解则输出 \(-1\)

输入格式

本题包含多组测试数据。

输入的第一行包含一个整数 \(T\),表示测试数据的组数。

接下来包含 \(T\) 组数据,每组数据的格式如下:

  • 第一行包含两个整数 \(n,q\),表示有 \(n\) 个二元组并且存在 \(q\) 次询问。

  • 对于接下来的 \(n\) 行每行输入两个整数,表示二元组 \((a_i,b_i)\)

  • 对于接下来的 \(q\) 行每行输入一个整数 \(m\) 表示一次询问。

输出格式

对于每组测试数据输出 \(q\) 行,每行包含一个整数,表示对应的答案。

输入输出样例 #1

输入 #1

1
4 5
0 3
1 4
2 1
4 1
0
3
4
7
8

输出 #1

-1
1
2
3
-1

说明/提示

【样例 1 解释】

对于 \(m=0\)\(m=8\) 都可以证明不存在划分方案使得有解。

对于 \(m=3\),可以将所有数划分为一个集合 \(S=\{0,0,0,1,1,1,1,2,4\}\),这个集合的 \(\operatorname{mex}\)\(3\)

对于 \(m=4\),可以将所有数划分为两个集合 \(S_1=\{0,0,1,1,1,1,2\}\)\(S_2=\{0,4\}\),这两个集合的 \(\operatorname{mex}\) 之和为 \(3+1=4\)

对于 \(m=7\),可以将所有数划分为三个集合 \(S_1=\{0,1,2,4\},S_2=\{0,1\},S_3=\{0,1,1\}\),这三个集合的 \(\operatorname{mex}\) 之和为 \(3+2+2=7\)

【样例 2 解释】

我们提供了一组大样例,该样例共有 \(10\) 组测试数据,其中第 \(i(1\leq i\leq 10)\) 组测试数据满足数据范围中描述的测试点 \(2i-1\)的限制。

数据范围
对于所有的数据,满足:

  • \(1\le T\le 10\)
  • \(1\le n,q\le 10^5,0\le a_i\le 10^9,a_{i-1}<a_i,1\le b_i\le 10^9,0\le m\le 10^{18}\)

::cute-table{tuack}

测试点编号 \(n,q\leq\) \(m \leq\) 特殊性质
\(1\sim 2\) \(10\) \(10\) AB
\(3\sim 4\) \(1000\) \(1000\) B
\(5\sim 8\) \(1000\) \(10^4\)
\(9\sim 12\) \(10^5\) \(10^{18}\) C
\(13\sim 14\) \(10^5\) \(10^{18}\) D
\(15\sim 20\) \(10^5\) \(10^{18}\)
  • 特殊性质 A:保证所有 \(b_i\) 均为 \(1\)

  • 特殊性质 B:保证所有 \(b_i\) 均相等。

  • 特殊性质 C:保证 \(b_i\) 单调不增。

  • 特殊性质 D:保证 \(a_i\) 在数据范围内均匀随机生成。

本题输入数据较大,请选手自行选择较快的输入方式。

首先发现 \(b_i\) 到底有几个有用取决于 \(a_i-1\) 的数量,如果超过了 \(a_i-1\) 的数量那么多出部分在凑 \(\operatorname{mex}\) 的时候没有任何作用,所以有 \(b_i=\min(b_i,b_{i-1})\)\(a_i\ne a_{i-1}+1\) 就不管了)。然后记录一下 \(b_i>0\) 的最大 \(a_i\)\(maxn-1\),特判掉 \(maxn=0\) 的情况。

接下来考虑正常情况,对于 \(m\le maxn\) 特殊处理一下,\(m=0\) 无解,\(m=maxn\) 答案为 \(1\)(全在一个集合里),其它情况答案为 \(2\)(比这个 \(\operatorname{mex}\) 小的放一堆,剩下的放另一堆)。

考虑正常分组的情况,肯定是一个 \(0\)\(x-1\) 都有的集合凑出了 \(x\)。考虑 \(m\) 更大的询问,为了在尽量小的分组中凑出尽量大的和,我们希望得到的 \(\operatorname{mex}\) 尽量大,所以直接尽可能地使用还没有被使用的数凑出一个尽量大的连续序列即可。

如果在所有数都被用完了之后还有更大的 \(m\) 显然无解。

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define MAXN 1000005
using namespace std;
const int inf=1e18;
int T,n,q,a[MAXN],b[MAXN],ans[MAXN];
struct Node{int c,id;
}c[MAXN];
bool cmp(Node x,Node y){return x.c<y.c;
}
signed main(){
//	freopen("mexdnc2.in","r",stdin);
//	freopen("my.out","w",stdout);scanf("%lld",&T);while(T--){scanf("%lld%lld",&n,&q);a[0]=-1,b[0]=inf;int maxn=0,flag=0;for(int i=1;i<=n;i++){scanf("%lld%lld",&a[i],&b[i]);if(a[i]!=a[i-1]+1)b[i]=0,flag=1;else{b[i]=min(b[i],b[i-1]);if(!flag)maxn=a[i]+1;}}for(int i=1;i<=q;i++){scanf("%lld",&c[i].c);c[i].id=i;}//if(T>3)continue;sort(c+1,c+q+1,cmp);int now=1;if(maxn==0){while(c[now].c==0&&now<=q)ans[c[now].id]=1,now++;while(now<=q)ans[c[now].id]=-1,now++;for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);continue;}while(c[now].c<=maxn&&now<=q){if(!c[now].c)ans[c[now].id]=-1;else if(c[now].c==maxn)ans[c[now].id]=1;else ans[c[now].id]=2;now++;}int cnt=0,sum=0;//cout<<"!!!\n";for(int i=maxn;i;i--){//cout<<i<<"@@@\n";int tmp=b[i]-cnt;while(c[now].c<=sum+tmp*i&&now<=q){//cout<<i<<' '<<tmp<<' '<<c[now].id<<' '<<c[now].c<<"\n";ans[c[now].id]=cnt+(c[now].c-sum+i-1)/i;now++;}cnt+=tmp;sum+=tmp*i;}while(now<=q)ans[c[now].id]=-1,now++;for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);}return 0;
}

T2

题面

P14508 猜数游戏 guess

题目描述

小 P 在玩一种新型的猜数游戏。他有一个一行无数格的棋盘,在棋盘的编号为 \(1\) 的格子处有一枚棋子,这枚棋子有 \(m\) 种移动方式,第 \(i\) 种移动方式可以使这枚棋子向左或向右移动 \(a_i\) 格,使用这种方式移动的花费为 \(b_i\)。在棋盘上有一个隐藏的目标位置,当小 P 知道了目标位置时,游戏胜利。

当棋子从位置 \(x\) 移动到位置 \(x+y\) 时,它会询问 \([x,x+y)\) 是否包含目标位置。同理,当棋子从位置 \(x\) 移动到位置 \(x-y\) 时,它会询问 \([x-y,x)\) 是否包含目标位置(\(y \ge 0\))。由于棋盘无限大,所以可以移动到负数位置。

现在小 P 已经知道目标位置在 \([1,n]\) 范围内,现在请你帮他求出,在采取最优策略时(可以根据询问的结果来决定策略),最坏情况需要花费多少才能获得胜利,若无法取得胜利,输出 \(-1\)

输入格式

本题有多组测试数据

输入的第一行包含两个整数 \(c,T\),表示测试点编号和测试数据的组数。

接下来包含 \(T\) 组数据,每组数据的格式如下:

  • 第一行包含两个整数 \(n,m\),表示目标位置的范围和移动方式的数量。
  • 第二行包含 \(m\) 个整数 \(a_1, a_2, \dots,a_m\) 表示第 \(i\) 种移动方式移动的格数。
  • 第三行包含 \(m\) 个整数 \(b_1, b_2, \dots,b_m\) 表示第 \(i\) 种移动方式所需的代价。

输出格式

对于每组测试数据输出一个整数,表示取得胜利的最小花费。若无法取得胜利,输出 \(-1\)

输入输出样例 #1

输入 #1

0 3
3 1
1
1
3 2
2 3
1 1
4 2
2 4
2 3

输出 #1

2
3
-1

说明/提示

【样例 1 解释】

对于第一组数据,最坏情况目标位置为 \(3\),棋子向右移动 \(2\) 格,可以判断出不是 \(1\)\(2\),即可得出答案。

对于第二组数据,一种可能的跳法为 \(1\to3\to0\to2\),可以证明没有更优的方法。

【样例 2】

见附件的 guess/guess2.in 与 guess/guess2.ans。

该样例满足测试点 \(2\sim 3\) 的约束条件。

【样例 3】

见附件的 guess/guess3.in 与 guess/guess3.ans。

该样例满足测试点 \(4\) 的约束条件。

【样例 4】

见附件的 guess/guess4.in 与 guess/guess4.ans。

该样例满足测试点 \(7\sim 11\) 的约束条件。

【样例 5】

见附件的 guess/guess5.in 与 guess/guess5.ans。

该样例满足测试点 \(15\sim 25\) 的约束条件。

【数据范围】

对于所有的数据,满足:

  • \(1\le T\le 10\)
  • \(1\le n\le 10^4\)\(1\le m\le 1000\)\(1\le a_i\le \min(n,1000)\)\(1\le b_i\le 10^9\)
    ::cute-table
测试点编号 \(n\leq\) \(m \leq\) 特殊性质
\(1\) \(10\) \(10\) A
\(2\sim 3\) ^ ^
\(4\) \(100\) \(20\) B
\(5\sim 6\) ^ ^
\(7\sim 11\) \(3000\) \(100\) ^
\(12\sim 14\) \(10^4\) \(1000\) B
\(15\sim 25\) ^ ^
  • 特殊性质 A:保证所有 \(a_i\) 均相同。
  • 特殊性质 B:保证所有 \(b_i\) 均相同。

\(f_i\) 表示从 \(1\) 验证到 \(i\) 的最小花费,\(cost_i\) 为移动 \(i\) 步的花费,则有 \(f_i=\min_{j=1}^{i-1}{\max(f_j,f_{i-j})+cost_j}\)。直接转移是 \(O(n^2)\) 的,但是记 \(V=\max_{i=1}^{m}a_i\),注意到对于大于 \(V\)\(j\) 其花费必然是走两步或更多转移而来的,所以 \(j\) 只要遍历到 \(\min(i-1,V)\) 即可,转移的复杂度优化为 \(O(nV)\)

接下来考虑 \(cost_i\) 如何计算,注意到除了直接输入的 \(cost_{a_i}\) 以外,其它 \(cost_i\) 都是通过往一个方向走 \(x\) 步在反着走 \(y\) 步(\(x>y\))得到的 \(cost_{x-y}=cost_x+cost_y\)。这个转移很像最短路的形式,由于 \(b_i\) 都是正的,新计算出的状态不可能被它后面的状态更新,所以直接把所有 \(-V\le j\le V\) 视作一个点,建 \(2m\) 条边到 \(j+a_i\)\(j-a_i\),边权为 \(b_i\),跑最短路即可,得到的 \(dis_j\) 即为 \(cost_j\),复杂度 \(O(nV+mV\log mV)\)

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define MAXN 200005
#define mk make_pair
#define pi pair<int,int>
using namespace std;
const int inf=1e18,N=1e4;
int Tc,n,m,T,a[MAXN],b[MAXN],dis[MAXN],f[MAXN];
priority_queue<pi,vector<pi>,greater<pi> >q;
void upd(int x,int y,int w){if(dis[x+N]+w<dis[y+N]){dis[y+N]=dis[x+N]+w;q.push(mk(dis[y+N],y));}
}
signed main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);scanf("%lld%lld",&Tc,&T);while(T--){scanf("%lld%lld",&n,&m);int maxn=0;for(int i=1;i<=m;i++)scanf("%lld",&a[i]),maxn=max(maxn,a[i]);for(int i=1;i<=m;i++)scanf("%lld",&b[i]);for(int i=-maxn;i<=maxn;i++)dis[i+N]=inf;dis[N]=0;q.push(mk(0,0));while(!q.empty()){int x=q.top().second,d=q.top().first;q.pop();if(d!=dis[x+N])continue;//cout<<x<<' '<<dis[x+N]<<"\n";for(int i=1;i<=m;i++){if(x+a[i]<=maxn){int y=x+a[i];upd(x,y,b[i]);}if(x-a[i]>=-maxn){int y=x-a[i];upd(x,y,b[i]);}}}for(int i=0;i<=n;i++)f[i]=inf;f[1]=0;for(int i=2;i<=n;i++){for(int j=1;j<=min(maxn,i-1);j++){//cout<<f[i]<<' '<<j<<' '<<f[j]<<' '<<f[i-j]<<' '<<dis[j+N]<<"\n";f[i]=min(f[i],max(f[j],f[i-j])+dis[j+N]);}//cout<<i<<' '<<f[i]<<"!!!\n";}printf("%lld\n",f[n]<inf?f[n]:-1);}return 0;
}
http://www.jsqmd.com/news/42765/

相关文章:

  • 2025年安徽合肥速冻肉制品企业综合实力排行榜
  • 从技术骨干到卓越领导者的转型
  • 【连续十届EI稳定,JPCS出版】第十一届机械制造技术与工程材料国际学术会议(ICMTEM 2025)
  • 【MySQL】组成部分
  • 2025年苏州海边婚纱照公司权威推荐:欧式宫廷婚纱照/中式秀禾服婚纱照/园林婚纱照服务机构精选
  • 【前端从0到1实战】第8篇:构建“轮播图/滑块” (Carousel)
  • 2025年11月教育资源优质学习机品牌哪家好?基于多维评估与行业数据解析
  • 2025年11月学习机品牌哪家好?基于多维度评估与行业数据解析
  • 【前端从0到1实战】第6篇:构建“手风琴折叠菜单” (Accordion)
  • 2025年11月小学生学习机品牌哪家好?基于教育科技趋势与用户需求深度解析
  • 流固热力学耦合仿真机构优选蓝图心算
  • 2025/11/16 分享
  • 教育资源优质学习机品牌全面解析与实用指南:2025年11月最新版TOP5推荐榜单
  • 小学生学习机品牌全面解析与选购指南:2025年11月最新版TOP10权威推荐
  • Rust: 面向生产的 hex 替代方案
  • 银河麒麟服务器版 TigerVNC 远程桌面完整安装配置指南
  • 2025年塑胶跑道厂家推荐:湖北中奥特体育,预制型塑胶跑道/EPDM塑胶跑道/环保塑胶跑道/混合型塑胶跑道/专业打造环保运动场地
  • 十八、sed命令
  • 别再被VO、BO、PO、DTO、DO绕晕!今天用一段代码把它们讲透
  • 2025 最新推荐!装盒机厂家权威榜单发布,覆盖多行业专用设备及创新解决方案内外盒 / 面膜 / 电子产品 / 玩具 / 日用品装盒机厂家推荐
  • 2025 年试验仪厂家最新推荐榜:乳化沥青 / 沥青混合料 / 高低温等全品类检测设备权威品牌排行榜马歇尔稳定度/沥青动力黏度/高低温试验仪公司推荐
  • 2025少儿免费编程体验课怎么选?5大优质机构推荐,家长收藏
  • 2025年11月复合型塑胶跑道厂家最新推荐,透气型塑胶跑道/自结纹塑胶跑道/老国标塑胶跑道/全塑型塑胶跑道/综合表现突出厂家推荐
  • 2025 最新推荐折盒机制造厂家权威排行榜:半自动 / 全自动 / 定制型设备优选,国际测评认证实力品牌全解析
  • 2025 最新推荐!自动包装生产线厂家权威榜单:食品 / 日化 / 智能 / 柔性等多场景高效解决方案测评发布
  • 2025年11月国内旧房翻新公司权威排行:专业服务商综合实力大比拼
  • 2025年11月国内旧房翻新公司排名前十推荐榜单
  • 2025年国内旧房翻新公司口碑推荐排行榜前十强
  • 2025年国内旧房翻新公司排名Top5推荐榜单
  • LLaMA-Factory 使用 Qwen2-1.5B-Instruct 在华为 Ascend NPU docker环境上进行模型微调