AtCoder Beginner Contest 217 D~E
比赛链接: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的更多相关文章
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
- AtCoder Beginner Contest 064 D - Insertion
AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...
- AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】
AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...
- AtCoder Beginner Contest 075 C bridge【图论求桥】
AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...
随机推荐
- python计算代码运行时间
记录一下自己用python编写计算运行时间的代码 时间类 import time import numpy as np # 编写时间类来方便操作 class Timer: def __init__(s ...
- 文心一言 VS 讯飞星火 VS chatgpt (150)-- 算法导论12.2 6题
六.用go语言,考虑一棵二叉搜索树 T ,其关键字互不相同.证明:如果 T 中一个结点 x 的右子树为空,且 x 有一个后继 y ,那么 y 一定是 x 的最底层祖先,并且其左孩子也是 x 的祖先.( ...
- SpringBoot项目启动过程动态修改接口请求路径
背景 最近遇到一个技术需求,需要对其他多个已有的服务进行整合打包为一个整体的服务,项目启动过程发现一个问题,在controller层多个服务之间存在相同的RequestMapping接口请求路径,导致 ...
- Vue绑定Style和Class写法
vue2写法 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- 华企盾DSC防泄密申请解密、外发等失败常见处理方法
1.检查文件是否已经打开或被占用,以及文件的权限不是只读(错误代码32或5,这种情况比较常见) 2.系统用户名不能带特殊字符.老版本文件路径中不能含特殊字符(包括备份路径) 3.备份路径是否有读写权限 ...
- Python趣味入门10:推倒繁琐化烦为简的推导式
前言 <西部世界>的德洛丽丝进入了MAZE迷宫,假设她需要列出一系列的平方数作为密码,来进入迷宫.在以往的代码生成类似的数列需要使用循环语句,写多行语句.Python有了推导式,只需要1句 ...
- 神经网络优化篇:详解梯度消失/梯度爆炸(Vanishing / Exploding gradients)
梯度消失/梯度爆炸 训练神经网络,尤其是深度神经所面临的一个问题就是梯度消失或梯度爆炸,也就是训练神经网络的时候,导数或坡度有时会变得非常大,或者非常小,甚至于以指数方式变小,这加大了训练的难度. 接 ...
- 字正腔圆,万国同音,coqui-ai TTS跨语种语音克隆,钢铁侠讲16国语言(Python3.10)
按照固有的思维方式,如果想要语音克隆首先得有克隆对象具体的语言语音样本,换句话说,克隆对象必须说过某一种语言的话才行,但现在,coqui-ai TTS V2.0版本做到了,真正的跨语种无需训练的语音克 ...
- python异步编程之asyncio高阶API
asyncio 高阶API列表 asyncio中函数可以分为高阶函数和低阶函数.低阶函数用于调用事件循环.linux 套接字.信号等更底层的功能,高阶函数是屏蔽了更多底层细节的任务并发,任务执行函数. ...
- C语言基础之因子分解
要求: 从键盘输入一个正整数,然后将该整数分解为1和各个质因子的相乘,如果输入的整数本身就是质数,则应分解为1和该数本身相乘. 输出格式: 因子分解,因子由小到大输出. 如:1* 2* 2* 3 代码 ...