题意
一共有n件商品,编号为1~n,有两种操作。
M X Y:在第X天会卖出编号为Y的商品。D X Y:询问[1,X]中卖出的商品编号>=Y中编号最小的一个是哪个,没有的话输出-1。
对于每个询问D,输出相应的答案。
数据范围1<=n<=2e5,1 <=x<=1e9。
题解
对商品建立一颗线段树,线段树的结点维护的是当前区间里最找卖出的时间。
对于一个查询,我们可以二分答案,即二分编号最小的物品,令l=Y, r = n,然后二分答案,对于每个二分的mid,如果[l,mid]的中有符合<=X的(在编号l,mid]之间的物品里有小等于第X天卖出的物品),那么r = mid-1,否则l=mid+1。
时间复杂度为:O(nlognlogn),2e5*14*14 ≈ 4e7
代码
#include <bits/stdc++.h>
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
using namespace std;
const int N = 200000 + 5;
const int INF = 0x7fffffff;
int n, q;
int val[N<<2];
void pushup(int rt) {
val[rt] = min(val[rt<<1], val[rt<<1|1]);

最低0.47元/天 解锁文章
545

被折叠的 条评论
为什么被折叠?



