比赛链接:Here

ABC水题,

D - Cutting Woods

题意:开始一根木棒长度为 \(n\) 并以 \(1\) 为单位在木棒上标记\((1\sim n)\) ,输出 \(q\) 次操作

  • 操作 \(1\) 断开 \(x\) 所在的木棒:\([1,n]\) 在 \(x\) 断开变成了 \([1,x],[x + 1,n]\)
  • 操作 \(2\) 查询 \(x\) 所在区间的长度

数据范围:\(n\le 10^{9},q\le 1e5,1\le x\le 1e9\)

题解:

一开始没有想到这个性质所以卡住了,

在分割之后左边以及右边这个区间的答案是固定的,也就是说答案只跟分割点有关,比如区间 \([l,r]\) 分割 \(x\)​ 变成了 \([l,x],[x+1,r]\)

可以发现可以发现

\(l\) 到 \(x\) 这个区间的询问答案都是 \(x−l+1\)

\(x+1\) 到 \(r\) 这个区间的询问答案都是 \(r−l+1\)

所以可以考虑二分找到所在区间相邻 \(2\) 个的分割点下标

先考虑边界问题

边界无非是:\(0\sim n + 1,0\sim n,1\sim n,1\sim n +1\) 这 \(4\)​ 种的其中一种

这个时候先假设区间是 \([1,2],[3,4],[5]\)​

分割点是 0/1 2 4 5/5+1

对于查询2

找到第一个大于等于2的数是2

第一个小于2的数应该是 0/1

答案是2

所以应该是 2 - 0 = 2

左边界应该是0

在考虑查询5

答案是1

找到第一个大于等于5的数是5/6

第一个小于5的数应该是4

所以应该是 5 - 4 = 1

右边界是n

在考虑二分操作的时候 分割点数组保持有序

所以可以用set动态维护

时间复杂度:\(\mathcal{O}(Nlog N)\)

set<int>s;
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int n, m;
cin >> n >> m;
s.insert(0);
s.insert(n);
while (m--) {
int c, x;
cin >> c >> x;
if (c == 1) s.insert(x);
else
cout << *s.lower_bound(x) - *--s.upper_bound(x) << "\n";
// 因为没 -- 调了半天
}
}

E - Sorting Queries

题意:给出一个空的序列和 \(q\) 次操作

  • 操作 \(1\):​ 在序列末尾添加一个数 \(x\)
  • 操作 \(2\) :输出序列第一个数
  • 操作 \(3\):给当前序列排序

数据范围:\(q\le 1e5,1\le x\le 1e9\)​

题解:

假设不考虑操作 \(3\),那么我们可直接模拟,

但在操作 \(3\)的影响下,需要维护排序对队列的影响,

假设队列中两个元素,\(head,fail\) 对应队头和队尾

暴力时间复杂度是 \(\mathcal{O}(n^2 logn)\) 肯定是不可取的

在排序的时候我们可以考虑边插入边排序,用 \(set\)​ 维护

然后把对头指向 \(set\) 后面的第一个下标

这样时间复杂度便降到了 \(\mathcal{O}(n logn)\)

const int N = 1e6 + 10;
ll a[N];
multiset<ll>s;
bool st[N];
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int head = 0, fail = 0;
int t; cin >> t;
int k = 1; // k = 1 表示队列第一个数的下标是1
while (t--) {
int op; cin >> op;
if (op == 1) {
int x; cin >> x;
a[++fail] = x;
} else if (op == 2) {
// 如果排序过
if (s.size()) {
cout << *s.begin() << "\n" ;
s.erase(s.begin());
} else {
cout << a[k] << "\n";
st[k] = 1;
k += 1;
}
} else {
for (int i = k ; i <= fail ; i ++) {
if (!st[i]) s.insert(a[i]) ;
}
// 插入之后 对头指向队尾的下一个下标
k = fail + 1 ;
}
}
}

AtCoder Beginner Contest 217 D~E的更多相关文章

  1. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  2. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  3. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  4. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  5. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  6. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

  7. AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】

    AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...

  8. AtCoder Beginner Contest 064 D - Insertion

    AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...

  9. AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】

    AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...

  10. AtCoder Beginner Contest 075 C bridge【图论求桥】

    AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...

随机推荐

  1. Python输入某年某月某日,判断这一天是这一年的第几天?

    while 1: year = int(input('year:\n')) #输入年.月.日 month = int(input('month:\n')) day = int(input('day:\ ...

  2. fianl详解(适合新手)

    final 1.final是Java语言中的一个关键字 2.final表示最终的,不可变的. 3.final可以修饰变量以及方法,还有类等 4.final修饰的变量? 5.final修饰的方法? 6. ...

  3. 【JMeter】使用nmon进行性能资源监控

    使用nmon进行性能资源监控 目录 使用nmon进行性能资源监控 一.前言 二.nmon的下载安装 1.查看系统信息 2.查看CPU信息 2.下载 3.解压 4.一个小问题 三.在性能测试时使用命令行 ...

  4. [NOI online2022普及C]字符串

    题目描述 Kri 非常喜欢字符串,所以他准备找 \(t\) 组字符串研究. 第 \(i\) 次研究中,Kri 准备了两个字符串 \(S\) 和\(R\) ,其中 \(S\) 长度为 \(n\),且只由 ...

  5. 1 HTTP是什么,HTTP不是什么?

    HTTP是什么? HTTP 全程超文本传输协议(HyperText Transfer Protocol). 包含三部分:超文本.传输.协议. 1. 协议 HTTP是一个用在计算机世界里的协议.它使用计 ...

  6. 聊聊GLM基座模型的理论知识

    概述 大模型有两个流程:预训练和推理. 预训练是在某种神经网络模型架构上,导入大规模语料数据,通过一系列的神经网络隐藏层的矩阵计算.微分计算等,输出权重,学习率,模型参数等超参数信息. 推理是在预训练 ...

  7. 【scikit-learn基础】--『预处理』之 正则化

    数据的预处理是数据分析,或者机器学习训练前的重要步骤.通过数据预处理,可以 提高数据质量,处理数据的缺失值.异常值和重复值等问题,增加数据的准确性和可靠性 整合不同数据,数据的来源和结构可能多种多样, ...

  8. awk所有常用语法

    awk [OPTIONS] PROGRAM FILE... 选项: -F 指定分隔符 -f 引用awk脚本 -v VAR=VALUE 定义一个变量传递给PROGRAM,但是这里的变量BEGIN读不了, ...

  9. 新报: 根据IP获取物理地址不需要调用接口啦

    一. 复制data文件夹到自己的项目当中 可以进行加载到这个文件即可 博主放入在项目的根目录当中 请移步Gitee pull 该文件 https://gitee.com/yangbuyi/ip_fil ...

  10. MySQL的事务(看看也许有帮助呢)

    MySQL的事务 一.事务的概念 在MySQL中,只有InnoDB存储引擎才支持事务. 事务的处理用来维护数据库数据的完整性,保证同一个事务里的一批SQL语句,要么全部执行,要么全部不执行. 事务用来 ...