// 为了方便处理区间长度为奇数的情况,将坐标全部 *2,这样的话保证区间中心点为整数坐标。
#include <bits/stdc++.h>
using namespace std;
struct node {
long long pos, rad;
node() = default;
node(long long pos) : pos(pos), rad() {}
node(long long pos, long long rad) : pos(pos), rad(rad) {}
bool operator<(const node &b) const {
return pos < b.pos;
}
};
// node 的含义:在 0 时刻,中心坐标为 pos,半径为 rad。于是 t 时刻的半径为 rad + 2 * t。rad 可以为负数。
node tonode(long long t, long long l, long long r) {
return node((l + r) / 2, (r - l) / 2 - 2 * t);
}
long long mergetime(node a, node b) {
return (abs(a.pos - b.pos) - a.rad - b.rad + 3) / 4;
}
node merge(node a, node b) {
if (a.pos > b.pos)
swap(a, b);
long long t = mergetime(a, b);
long long l = a.pos - a.rad - 2 * t;
long long r = b.pos + b.rad + 2 * t;
return node((l + r) / 2, (r - l) / 2 - 2 * t);
}
enum etype { MRG,
DEL,
QRY };
struct event {
etype type;
long long t, x, y;
event(etype type, long long t) : type(type), t(t), x(), y() {}
event(etype type, long long t, long long x, long long y) : type(type), t(t), x(x), y(y) {}
bool operator<(const event &b) const {
return t != b.t ? t < b.t : (type != b.type ? type < b.type : (x != b.x ? x < b.x : y < b.y));
}
};
event mergeevent(node a, node b) {
return event(MRG, mergetime(a, b), a.pos, b.pos);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
int m, q;
cin >> m >> q;
set<node> nds({node(0, 1)});
set<event> es;
long long radsum = 1;
while (m--) {
int t, l, r;
cin >> t >> l >> r;
es.insert(event(DEL, t, l * 2ll - 1, r * 2ll + 1));
}
while (q--) {
int t;
cin >> t;
es.insert(event(QRY, t));
}
bool firstquery = true;
while (es.size()) {
event e = *es.begin();
es.erase(es.begin());
switch (e.type) {
case DEL: {
auto [type, t, l, r] = e;
auto it = nds.lower_bound(node(l));
if (it != nds.begin())
it--;
while (it != nds.end()) {
node nd = *it;
long long ndl = nd.pos - nd.rad - 2 * t;
long long ndr = nd.pos + nd.rad + 2 * t;
if (ndl >= r || ndr <= l) {
if (it->pos >= r)
break;
it++;
continue;
}
it = nds.erase(it);
radsum -= nd.rad;
bool haveprend = it != nds.begin();
node prend;
if (haveprend) {
prend = *prev(it);
es.erase(mergeevent(prend, nd));
}
bool havenxtnd = it != nds.end();
node nxtnd;
if (it != nds.end()) {
nxtnd = *it;
es.erase(mergeevent(nd, nxtnd));
}
if (ndl >= l && ndr <= r) {
if (haveprend && havenxtnd)
es.insert(mergeevent(prend, nxtnd));
continue;
}
if (l > ndl && r < ndr) {
node lnd = tonode(t, ndl, l);
node rnd = tonode(t, r, ndr);
nds.insert(lnd);
radsum += lnd.rad;
nds.insert(rnd);
radsum += rnd.rad;
if (haveprend)
es.insert(mergeevent(prend, lnd));
es.insert(mergeevent(lnd, rnd));
if (havenxtnd)
es.insert(mergeevent(rnd, nxtnd));
continue;
}
if (r < ndr)
ndl = r;
if (l > ndl)
ndr = l;
nd = tonode(t, ndl, ndr);
nds.insert(nd);
radsum += nd.rad;
if (haveprend)
es.insert(mergeevent(prend, nd));
if (havenxtnd)
es.insert(mergeevent(nd, nxtnd));
}
break;
}
case MRG: {
auto [type, t, x, y] = e;
auto it = nds.lower_bound(node(x));
node lnd = *it;
it = nds.erase(it);
radsum -= lnd.rad;
node rnd = *it;
it = nds.erase(it);
radsum -= rnd.rad;
node nd = merge(lnd, rnd);
if (it != nds.begin()) {
auto pre = prev(it);
es.erase(mergeevent(*pre, lnd));
es.insert(mergeevent(*pre, nd));
}
if (it != nds.end()) {
es.erase(mergeevent(rnd, *it));
es.insert(mergeevent(nd, *it));
}
nds.insert(nd);
radsum += nd.rad;
break;
}
case QRY: {
auto [type, t, x, y] = e;
if (firstquery)
firstquery = false;
else
cout << ' ';
cout << radsum + 2 * t * nds.size();
break;
}
}
}
cout << '\n';
}
}
小嗷犬
- 粉丝: 3w+
- 资源: 1347
最新资源
- IP网络的仿真及实验.doc
- Metropolis-Hastings算法和吉布斯采样(Gibbs sampling)算法Python代码实现
- 高效排序算法:快速排序Java与Python实现详解
- 基于stm32风速风向测量仪V2.0
- 多边形框架物体检测27-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 国产文本编辑器:EverEdit用户手册 1.1.0
- 3.0(1).docx
- 多种土地使用类型图像分类数据集【已标注,约30,000张数据】
- 智慧校园数字孪生,三维可视化
- GigaDevice.GD32F4xx-DFP.2.1.0 器件安装包
- 基于 Spring Cloud 的一个分布式系统套件的整合 具备 JeeSite4 单机版的所有功能,统一身份认证,统一基础数据管理,弱化微服务开发难度
- opcclient源码OPC客户端 DA客户端源码(c#开发) C#开发,源码,可二次开发 本项目为VS2010开发,可转为VS其他版本的编辑器打开项目 已应用到多个行业的几百个应用现场,长时间运
- IMG_4525.jpg
- STM32F427+rtthread下的bootload 网口(webclient)+串口(ymodem)传输,代码无质量,谨慎使用
- FastAdmin后台框架开源且可以免费商用,一键生成CRUD, 一款基于ThinkPHP和Bootstrap的极速后台开发框架,基于Auth验证的权限管理系统,一键生成 CRUD,自动生成控制器等
- GD32F5XX系列的产品数据手册,学习手册,器件安装包
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈