P14507 缺零分治 mexdnc

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$ 在数据范围内均匀随机生成。

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

#include <bits/stdc++.h>
using namespace std;
#define int long long const int N = 1e5+5;
int a[N],b[N],f[N];
int c[N],g[N],h[N];
int d[N],e[N];
int n,q; inline int read()
{
char ch = getchar();
int x= 0,f = 1;
while(ch<'0'||ch>'9'){
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0'&&ch <= '9')
{
x = x * 10 + (ch - '0');
ch = getchar();
}
return f*x;
} void solve(){
n = read();
q = read();
for(int i = 0;i <= n;i++) a[i] = b[i] = f[i] = c[i] = g[i] = h[i] = d[i] = e[i] = 0; for(int i = 1;i <= n;i++){
a[i] = read();
b[i] = read();
}
if(a[1] != 0){
while(q--){
int m;
m = read();
if(m==0) cout<<1<<"\n";
else cout<<-1<<"\n";
}
return;
} a[0] = -1;
for(int i = 1;i <= n;i++){
if(a[i] != a[i-1] + 1){
n = i-1;
break;
}
}
f[1] = b[1],g[1] = 1;
for(int i = 2;i <= n;i++){
if(b[i] < f[i-1]) f[i] = b[i] , g[i] = i;
else f[i] = f[i-1] , g[i] = g[i-1];
} int now = n;//下标
int sum = 0;//已经用了d个
int cnt = 0;
while(now != 0){
c[++cnt] = a[now] + 1;//值
d[cnt] = f[now] - sum;
sum += d[cnt];
now = g[now] - 1;
} for(int i = 1;i <= cnt;i++){
e[i] = e[i-1] + c[i] * d[i];//加起来的值
h[i] = h[i-1] + d[i];//数的个数
} while(q--){
int m;
m = read();
// cout<<" "<<m<<"\n";
if(m == 0 || m > e[cnt]){
cout<<-1<<"\n";
}
else if(m < c[1]){
cout<<2<<"\n";
}
else{
int t = upper_bound(e + 1, e + cnt + 1, m) - e - 1;//最后一个 <= m的数的下标
if(e[t] == m){
cout<<h[t]<<"\n";
continue;
}
else{
int ans = h[t] + (m - e[t]) / c[t+1] + ((m - e[t]) % c[t+1] != 0);
cout<<ans<<"\n";
} } }
return;
} signed main()
{ int T;
T = read();
while(T--){
solve();
}
return 0;
}

11.15 P14507 缺零分治 mexdnc的更多相关文章

  1. Sprint1(第二天11.15)

    Sprint1(第二天11.15) Sprint1第一阶段 1.类名:软件工程-第一阶段 2.时间:11.14-11.23 3.选题内容:web版-餐厅到店点餐系统 4.团队博客地址: http:// ...

  2. Notes of Daily Scrum Meeting(11.15)

    Notes of Daily Scrum Meeting(11.15) 今天周六我们的主要工作是把这周落下的一些工作补回来,这是写程序的最后阶段,准备进入测试阶段了,所以之前的工作 要补齐,今天大家的 ...

  3. 11.15 Daily Scrum

    今天是假期回来的第一个周末,也是我们团队的又一次进度汇总总结和调试工作开展,鉴于一周以来大家的工作有了很大的成果,所以,本次召开的会议主旨在于解决一些开发方面的细节问题,达成共识,为日后进一步的功能方 ...

  4. 2017.11.15 String、StringBuffer、StringBuilder的比较(todo)

    参考来自:http://blog.csdn.net/jeffleo/article/details/52194433 1.速度 一般来说,三者的速度是:StringBuilder > Strin ...

  5. 2017-3-13 leetcode 4 11 15

    ji那天居然早起了,惊呆我了,眼睛有点儿疼,一直流泪....继续保持 ========================================================== leetco ...

  6. 比较两个时间的大小 举例:CompareDate("12:00","11:15")

    //比较两个时间的大小 举例:CompareDate("12:00","11:15") function CompareDate(t1, t2) { var d ...

  7. Python3.7&Django1.11.15 兼容性问题

    环境: 1. Windows10 2. python3.7 3. Django1.11.15 启动Django时抛出以下异常: Unhandled exception in thread starte ...

  8. JZOJ 【NOIP2016提高A组集训第16场11.15】兔子

    JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...

  9. JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线

    JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...

  10. CSP-S 2019文澜中学游记(11.15~11.17)

    前言 今年的\(CSP-S\),本以为自己的实力与去年的\(NOIP\)相比,能有较大的提升的. 没想到,菜是原罪,弱就是弱,依然逃脱不了被吊锤的命运. \(Nov\ 15th\):\(Day\ 0\ ...

随机推荐

  1. mysql 定位问题集锦(持续更新...)

    事务 // 查询当前数据库执行时间在10秒以上的事务 SELECT t.trx_mysql_thread_id ,t.trx_state ,t.trx_tables_in_use ,t.trx_tab ...

  2. 手把手教你实现C++高性能内存池,相比 malloc 性能提升7倍!

    大家好,我是小康. 写在前面 你知道吗?在高并发场景下,频繁的malloc和free操作就像是程序的"阿喀琉斯之踵",轻则拖慢系统响应,重则直接把服务器拖垮. 最近我从0到1实现了 ...

  3. 效率翻倍新技能:JDK8后的新特性

    以下是 JDK 8 至 JDK 21 中最具实用性的新特性整理,涵盖语言特性.工具类增强.性能优化等方向,附代码示例和注释说明: 一.JDK 8(2014):函数式编程与现代化API JDK 8 是 ...

  4. 解码C语言基础

    main函数-程序的入口 主函数有且只有一个 main无参形式 /* 函数名:main 函数参数:无 函数返回值: 返回0:表示函数正常退出 返回非0:表示函数异常退出 */ int main(voi ...

  5. 李子柒事件“余震”:网红纷纷翻合同,IP究竟是谁的?

    最近一段时间,在全球拥有上亿粉丝的顶流网红李子柒"消失",成为网络舆论的一个热点.该事件的起因,是自七月中旬开始,她在各平台的账号均陷入长时间停更状态.而李子柒本人,也是几天前参加 ...

  6. HarmonyOS 3:操作系统一小步,万物互联一大步

    「 三年三代,作为全球发展最快的操作系统,华为今天正式发布了HarmonyOS 3. 」 到今天为止,搭载HarmonyOS 2的华为设备数就超过了3亿,HarmonyOS Connect生态设备累计 ...

  7. shell/Linux 任务学习笔记整理3:grep/ps/top

    注: 原文链接:https://blog.csdn.net/yjclsx/article/details/81508455 原文链接:ps命令之排序 - 海东潮 - 博客园 (cnblogs.com) ...

  8. 《SMCPhub:智能应用开发的高效利器》

    智能应用开发神器:SMCPhub 使用体验与深度解析 一.产品介绍:重新定义智能应用开发 定位:聚焦 MCP(Model Context Protocol)服务集成 的智能应用开发平台,帮助开发者快速 ...

  9. 删除数据库文件并部分覆盖情况下Oracle恢复---惜分飞

    联系:手机/微信(+86 17813235971) QQ(107644445) 标题:删除数据库文件并部分覆盖情况下Oracle恢复 作者:惜分飞版权所有[未经本人同意,不得以任何形式转载,否则有进一 ...

  10. Linux开机启动脚本(cron 的 @reboot 特性)

    cron 的 @reboot 特性是一种简洁的定时任务配置,专门用于让脚本或命令在 Linux 系统开机完成后自动执行一次,无需指定复杂的时间表达式(如 0 0 * * *),适合轻量级的开机自启需求 ...