[APIO2018] New Home 新家 [线段树,multiset]
线段树的每个点表示当前点的前驱,即这个颜色上一次出现的位置,这个玩意multiset随便写写就完了。
重要的是怎么查询答案,无解显然先判掉。
线段树上二分就可以了
#include <bits/stdc++.h>
using namespace std;
int read() {
int x = 0;
char c = getchar();
while (c < 48) c = getchar();
while (c > 47) x = x * 10 + (c - 48), c = getchar();
return x;
}
int min(int x, int y) { return x < y ? x : y; }
int max(int x, int y) { return x > y ? x : y; }
int n, k, q;
const int maxn = 3e5 + 53;
const int maxm = 1e7;
multiset<int> st[maxn];
int ans[maxn];
struct node {
int x, t, id, type;
bool operator<(const node& other) const {
if (t != other.t) return t < other.t;
return type < other.type;
}
} t[maxn << 2];
int R;
int rt, cnt = 0;
int ls[maxm], rs[maxm], mn[maxm];
multiset<int> ms[maxm];
void build(int& p, int l, int r) {
p = ++cnt;
if (l == r) {
for (int i = 1; i <= k; i++) ms[p].insert(0);
return;
}
int mid = l + r >> 1;
build(rs[p], mid + 1, r);
}
void modify(int& p, int l, int r, const int& x, const int& inc, const int& del) {
if (!p) p = ++cnt;
if (l == r) {
if (inc >= 0) ms[p].insert(inc);
if (del >= 0) ms[p].erase(ms[p].find(del));
mn[p] = ((ms[p].size()) ? *ms[p].begin() : R);
return;
}
int mid = l + r >> 1;
if (x <= mid)
modify(ls[p], l, mid, x, inc, del);
else
modify(rs[p], mid + 1, r, x, inc, del);
mn[p] = min(mn[ls[p]], mn[rs[p]]);
}
int qry(int x) {
int l = 1, r = R;
int p = rt, chk = x << 1, tmn = R;
while (l < r) {
int mid = l + r >> 1, d = min(tmn, mn[rs[p]]);
if (mid < x || d + mid < chk || d < 1)
l = mid + 1, p = rs[p];
else
tmn = d, r = mid, p = ls[p];
}
return l - x;
}
int main() {
// freopen("testdata.in", "r", stdin);
n = read(), k = read(), q = read();
int cnt = 0;
for (int i = 1; i <= n; i++) {
int x = read(), id = read(), a = read(), b = read();
R = max(R, x);
t[++cnt] = { x, a, id, 0 }, t[++cnt] = { x, b + 1, id, 1 };
}
for (int i = 1; i <= q; i++) {
int x = read(), time = read();
t[++cnt] = { x, time, i, 2 };
}
R = R << 1 | 1, build(rt, 1, R), mn[0] = R;
for (int i = 1; i <= k; i++) st[i].insert(0), st[i].insert(R);
sort(t + 1, t + cnt + 1);
int tot = 0;
for (int i = 1; i <= cnt; i++) {
int x = t[i].x, id = t[i].id;
if (t[i].type == 0) {
auto it = st[id].lower_bound(x);
auto it2 = it;
it2--;
modify(rt, 1, R, x, *it2, -1);
modify(rt, 1, R, *it, x, *it2);
if (st[id].size() == 2) ++tot;
st[id].insert(x);
}
if (t[i].type == 1) {
st[id].erase(st[id].find(x));
auto it = st[id].lower_bound(x);
auto it2 = it;
it2--;
modify(rt, 1, R, x, -1, *it2);
modify(rt, 1, R, *it, *it2, x);
if (st[id].size() == 2) --tot;
}
if (t[i].type == 2) {
if (tot == k)
ans[id] = qry(x);
else
ans[id] = -1;
}
}
for (int i = 1; i <= q; i++) printf("%d\n", ans[i]);
return 0;
}
[APIO2018] New Home 新家 [线段树,multiset]的更多相关文章
- luogu P4632 [APIO2018] New Home 新家 线段树 set 二分
写了一种比较容易理解 但是常数很大的sol. 容易发现可以扫描线. 维护好序列之后发现很难查距离 考虑二分. 这里二分可以在线段树上进行 当然可能存在一些问题 如果离散化的话需要处理一些比较麻烦的细节 ...
- LOJ 2585 「APIO2018」新家 ——线段树分治+二分答案
题目:https://loj.ac/problem/2585 算答案的时候要二分! 这样的话,就是对于询问位置 x ,二分出一个最小的 mid 使得 [ x-mid , x+mid ] 里包含所有种类 ...
- [BZOJ5462][APIO2018]新家(线段树+堆)
其实这个题第一反应一定是线段树分治,但是这样反而更难考虑了(实际上是可做的但很难想到),可见即使看上去最贴切的算法也未必能有效果. 考虑这个DS题,没有什么模型的转化,可能用到的无非就是线段树.平衡树 ...
- [JLOI2014]松鼠的新家(线段树,树链剖分)
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前 ...
- 洛谷P4632 [APIO2018] New Home 新家(动态开节点线段树 二分答案 扫描线 set)
题意 题目链接 Sol 这题没有想象中的那么难,但也绝对不简单. 首先把所有的询问离线,按照出现的顺序.维护时间轴来处理每个询问 对于每个询问\((x_i, y_i)\),可以二分答案\(mid\). ...
- 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交
E - 秋实大哥与家 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...
- CF487E Tourists + 圆方树学习笔记(圆方树+树剖+线段树+multiset)
QWQ果然我已经什么都学不会的人了. 这个题目要求的是图上所有路径的点权和!QWQ(我只会树上啊!) 这个如果是好啊 这时候就需要 圆方树! 首先在介绍圆方树之前,我们先来一点简单的前置知识 首先,我 ...
- [APIO2018] New Home 新家
扫描线+线段树+二分答案+set+STL 就是把区间数颜色做得很好 时间看成线段,扫描线 对于某一个询问位置x 二分答案转化,看区间内有没有k种颜色.. 一个区间数颜色的套路是,prei上一个该颜色出 ...
- [JLOI2014]松鼠的新家(树链剖分)
[JLOI2014]松鼠的新家(luogu) Description 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间 ...
随机推荐
- Exception:Request processing failed; nested exception is org.apache.ibatis.binding.BindingException
异常 在测试Spring MVC+Mybatis整合时,运行 Maven build -> tomcat7:Run 遇到如下异常 从异常信息上看,是找不到mapper对应的xml文件,于是我到t ...
- AWS 入门使用
AWS官方参考文档:https://docs.aws.amazon.com/s3/index.html AWS基本介绍:https://docs.aws.amazon.com/zh_cn/Amazon ...
- python笔记13
今日内容 装饰器 推导式 模块[可选] 内容回顾 函数 参数 def (a1,a2):pass def (a1,a2=None):pass 默认参数推荐用不可变类型,慎用可变类型. def(*args ...
- 基于HTTPS的接口测试——nginx配置SSL
目录 基于HTTPS的接口测试--nginx配置SSL 1. 背景 2. 所需环境与域名备案解析 2.1 云服务器 2.2 域名 2.3 SSL证书 2.4 网站备案 2.5 域名解析 3.nginx ...
- 《考研机试》(一)C/C++基础
1.setfill/setw使用 2.定义结构体 3.关于字符串读取 4.排序问题:复试不要求一般用:冒泡排序 5.数字和字符之间转换 6.进制转化:10进制转8进制 7.质数判断 8.字符串拷贝函数 ...
- 记一个实时Linux的中断线程化问题
背景 有一个项目对实时性要求比较高,于是在linux内核上打了RT_PREEMPT补丁. 最终碰到的一个问题是,芯片本身性能不强,CPU资源不足,急需优化. 初步分析 看了下cpu占用率,除了主应用之 ...
- Java7循环结构综合练习
import java.util.Scanner; public class jh_01_学员操作_选择游戏 { public static void main(String[] args) { Sc ...
- <七>对于之前的一些遗漏的地方的补充
1.线程的状态: 我们可以通过wait,start,notify等关键字来切换线程的状态,但是我们如何知道线程目前是处于哪一种状态呢?使用Thread.getState()来获取,有下面几种常见的状态 ...
- Shell: 定期存档日志文件
简介 对于日志的分割删除我们一般会使用logratate,但对于项目较多的情况下,会让开发直接将日志分割写在代码里面,对于分割后过期的日志定期删除就很有必要,不然膨胀的日志会占满你的磁盘,将多余的日志 ...
- 虚拟机 .NAT模式下 配置静态ip后无法ping域名,但可以ping公网ip 问题处理
在之前的文章 https://www.cnblogs.com/dxxdsw/p/10643540.html 中,在虚拟机中给linux配置了静态ip.[.NAT模式] centos系统: 今天连接发现 ...