Bzoj[Usaco2018 Feb]5194 Snow Boots(线段树)
Description
Input
第一行包含两个空格分隔的整数N和B(1≤N,B≤10^5)。
Output
输出包含N行
Sample Input
0 3 8 5 6 9 0 0
0 5
0 6
6 2
8 1
10 1
5 3
150 7
Sample Output
1
1
0
1
1
1
这题的解法好像挺多,比如并查集?但是我还是用线段树了,因为讲师是这么讲的23333
#include<bits/stdc++.h>
#define ll long long
#define uint unsigned int
#define ull unsigned long long
using namespace std;
const int maxn = ;
struct enkidu {
int di, si, id;
}ask[maxn], a[maxn];
struct shiki {
int l, r, l_lin, r_lin;
int max_cnt;
}tree[maxn << ];
//l_lin表示这个区间从左边开始连续的不能走的长度
//r_lin表示这个区间从右边开始连续的不能走的长度
int n, m;
int ans[maxn]; inline int read() {
int x = , y = ;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') y = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) + ch - '';
ch = getchar();
}
return x * y;
} inline bool cmp(enkidu a, enkidu b) {
return a.si < b.si;
} inline void maintain(int pos) {
int ls = pos << , rs = pos << | ;
if(tree[ls].r - tree[ls].l + == tree[ls].max_cnt)
tree[pos].l_lin = tree[ls].max_cnt + tree[rs].l_lin;
else tree[pos].l_lin = tree[ls].l_lin;
if(tree[rs].r - tree[rs].l + == tree[rs].max_cnt)
tree[pos].r_lin = tree[ls].r_lin + tree[rs].max_cnt;
else tree[pos].r_lin = tree[rs].r_lin;
tree[pos].max_cnt = max(tree[ls].max_cnt, tree[rs].max_cnt);
tree[pos].max_cnt = max(tree[pos].max_cnt, tree[ls].r_lin + tree[rs].l_lin);
} void build(int pos, int l, int r) {
tree[pos].l = l, tree[pos].r = r;
if(l == r) {
tree[pos].l_lin = tree[pos].r_lin = tree[pos].max_cnt = ;
return;
}
int mid = l + r >> ;
build(pos << , l, mid);
build(pos << | , mid + , r);
maintain-(pos);
} void update(int pos, int aim, int l, int r) {
if(l == r && l == aim) {
tree[pos].max_cnt = tree[pos].l_lin = tree[pos].r_lin = ;
return;
}
int mid = l + r >> ;
if(aim <= mid) update(pos << , aim, l, mid);
else update(pos << | , aim, mid + , r);
maintain(pos);
} int main() {
n = read(), m = read();
for(int i = ; i <= n; ++i) {
a[i].si = read();
a[i].id = i;
}
for(int i = ; i <= m; ++i) {
ask[i].si = read(), ask[i].di = read();
ask[i].id = i;
}
sort(ask + , ask + m + , cmp);
sort(a + , a + n + , cmp);
build(, , n);
int brick = ;//砖,表示第几块砖
for(int i = ; i <= m; ++i) {
while(brick < n && a[brick + ].si <= ask[i].si) {//如果可以走
brick++;
update(, a[brick].id, , n);
}
if(tree[].max_cnt < ask[i].di) ans[ask[i].id] = ;
}
for(int i = ; i <= m; ++i) printf("%d\n", ans[i]);
return ;
}
Bzoj[Usaco2018 Feb]5194 Snow Boots(线段树)的更多相关文章
- bzoj 1593: [Usaco2008 Feb]Hotel 旅馆【线段树】
参考:https://blog.csdn.net/u010336344/article/details/53034372 神一样的线段树 线段树上维护:ll从左开始最长空段:rr从右开始最长空段:le ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
- [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】
题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过 1018,即使它在 ProblemSet 的第一页 ...
- [BZOJ 3888] [Usaco2015 Jan] Stampede 【线段树】
题目链接:BZOJ - 3888 题目分析 首先,计算出每个线段在 x 坐标 0 处出现的时间开始点和结束点,就转成了时间轴上的线段. 然后就是看每条线段是否被 y 比它小的线段完全覆盖了.注意求出的 ...
- [BZOJ 3747] [POI 2015] Kinoman【线段树】
Problem Link : BZOJ 3747 题解:ZYF-ZYF 神犇的题解 解题的大致思路是,当区间的右端点向右移动一格时,只有两个区间的左端点对应的答案发生了变化. 从 f[i] + 1 到 ...
- BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)
BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...
- BZOJ.1805.[IOI2007]sail船帆(贪心 线段树)
BZOJ 洛谷 首先旗杆的顺序没有影响,答案之和在某一高度帆的总数有关.所以先把旗杆按高度排序. 设高度为\(i\)的帆有\(s_i\)个,那么答案是\(\sum\frac{s_i(s_i-1)}{2 ...
- BZOJ.4825.[AHOI/HNOI2017]单旋(线段树)
BZOJ LOJ 洛谷 这题不难啊,我怎么就那么傻,拿随便一个节点去模拟.. 我们只需要能够维护,将最小值或最大值转到根.模拟一下发现,对于最小值,它的右子树深度不变(如果存在),其余节点深度全部\( ...
- BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)
BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. ...
随机推荐
- html5的web存储详解
以前我们在本地存储数据都是用document.cookie来存储的,但是由于其的存储大小只有4K左右,解析也很复杂,给开发带来了诸多的不便.不过现在html5出了web的存储,弥补了cookie的不足 ...
- ZOJ 3964 NIM变形
LINK 题意:n堆石子,Alice 和 Bob 轮流取石子,谁不能再取或被对方取完为败.但是对于alice拥有限制:b=0此堆正常无限制:b=1此堆Alice只能取奇数个石子:b=2只能取偶数个石子 ...
- C11线程管理:原子变量&单调函数
1.原子变量 C++11提供了原子类型std::atomic<T>,可以使用任意类型作为模板参数,使用原子变量就不需要使用互斥量来保护该变量,用起来更加简洁. 举个例子,如果要做一个计数器 ...
- AES Java加密 C#解密 (128-ECB加密模式)
在项目中遇到这么一个问题: java端需要把一些数据AES加密后传给C#端,找了好多资料,算是解决了,分享一下: import sun.misc.BASE64Decoder; import sun.m ...
- 【CodeForces】671 B. Robin Hood
[题目]B. Robin Hood [题意]给定n个数字的序列和k次操作,每次将序列中最大的数-1,然后将序列中最小的数+1,求最终序列极差.n<=5*10^5,0<=k<=10^9 ...
- java规范之checkstyle
1. 概述 随着中心的代码规范的建立和实施,项目组对代码规范要求,以及软件工程师们对自身代码的编写规范重要性的认知,“代码规范”已经成为了中心的一个“热词”.然后怎么才能写出有规范的代码,怎么才能养成 ...
- js关闭当前页面跳转新页面
页面代码: <p class="info"><span style="font-weight: bold">所属项目:</span ...
- 2017ACM暑期多校联合训练 - Team 2 1001 HDU 6045 Is Derek lying? (模拟)
题目链接 Problem Description Derek and Alfia are good friends.Derek is Chinese,and Alfia is Austrian.Thi ...
- 一个Servlet处理增删改查的方法
处理的思路是在servlet中定义不同的增删改查方法,页面请求 的时候携带请求的参数,根据参数判断调用不同的方法. package cn.xm.small.Servlet; import java.i ...
- tar解压与压缩
1.解压 tar -zxvf 压缩文件名 -C 指定的目录 (制定的目录必须存在) 2.压缩 tar -czvf 压缩后的文件名 要压缩的文件夹