[USACO18FEB]Snow Boots G
题意
现在有n块地砖,除了第一块地砖和最后一块地砖,其余每一块地砖都堆积了高度为a[i]的雪,你现在有b双鞋子,没双鞋子最多可以在高度为d的雪地上走s步,现在问你那些鞋子可以走完这段路。
思路
线段树(单点修改)+离线
(因为询问具有单调性,所以我们可以使用离线来做)
我们假设一个位置为1表示可以走,为0表示不可以走。我们在计算某双鞋子能否走过这段路,只需要判断当前情况下,这双鞋子能够走的步数是否大于连续的0的个数。
最开始,我们将所有的位置都设置为0,表示所有的位置都不可以走,这个时候我们将雪和鞋子放在一起,然后按照雪的高度进行排序,从小到大进行扫描。
如果我们扫描到当前的位置是雪,那么我们在线段树中将雪的这个位置修改为1,表示这块区域是可以到达的(因为我们是按照雪的高度进行排序的,那么后面的雪的高度更高,那么对于前面高度的雪肯定是可以到达的);如果扫描到当前的位置是鞋子,那么这个时候我们就要统计一下从1-n这段区间内的连续的0的个数。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int ans[N];
struct node
{
int l, r;
int len;
int lmax, rmax;
int maxx;
}tr[N << 2];
struct Edge
{
int id, step, deep;
int tag;
bool operator < (const Edge &t) const
{
return (deep == t.deep) ? tag < t.tag : deep < t.deep;
}
}a[N << 1];
void pushup(int u)
{
tr[u].len = tr[u