题面

天上有$n$朵云,每朵云$i$会在时间$[l_i,r_i]$出现,你有$\text C$个糖果,你可以花费$c_i$个糖果让云$i$消失,同时需要保证你最多让两朵云消失.现在有$m$个独立的询问,每次给你一个需要让阳光照$k$时间的植物,问你从时刻$0$开始,这个植物最快什么时候能长成. $n,m\leq 3\times10^5$

题解

神仙$blog$

看他的吧,这题真的麻烦。

代码

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<map>
#include<set>
#define RG register
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define clear(x, y) memset(x, y, sizeof(x)) inline int read()
{
int data = 0, w = 1; char ch = getchar();
while(ch != '-' && (!isdigit(ch))) ch = getchar();
if(ch == '-') w = -1, ch = getchar();
while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar();
return data * w;
} template<typename T> inline void Chkmax(T &a, const T &b) { if(a < b) a = b; }
const int maxn(3e5 + 10);
#define LESS(a, b) inline bool operator < (const a &lhs, const a &rhs)\
{ return lhs.b < rhs.b; }
struct cloud { int l, r, c; } cl[maxn];
struct Query { int id, t; } q[maxn];
struct node { int t, opt, id; } a[maxn << 1]; int cnt_node;
LESS(cloud, c) LESS(Query, t) LESS(node, t); using std::map; using std::set;
int n, m, C, Len[maxn], Inc[maxn], ans[maxn];
map<int, int> cover[maxn];
set<int> s; set<int>::iterator It;
int Empty, Max, max[maxn << 2]; #define son(i) ((root << 1) | i)
void update(int id, int v, int root = 1, int l = 1, int r = n)
{
if(l == r) return (void) (max[root] = v);
int mid = (l + r) >> 1;
if(id <= mid) update(id, v, son(0), l, mid);
else update(id, v, son(1), mid + 1, r);
max[root] = std::max(max[son(0)], max[son(1)]);
} int findMax(int root, int l, int r)
{
if(l == r) return l;
int mid = (l + r) >> 1;
if(max[son(0)] > max[son(1)]) return findMax(son(0), l, mid);
else return findMax(son(1), mid + 1, r);
} int query(int ql, int qr, int root = 1, int l = 1, int r = n)
{
if(ql <= l && r <= qr) return findMax(root, l, r);
int mid = (l + r) >> 1, ans = 0;
if(ql <= mid) ans = query(ql, qr, son(0), l, mid);
if(qr > mid)
{
int res = query(ql, qr, son(1), mid + 1, r);
if(Len[res] > Len[ans]) ans = res;
}
return ans;
} inline int sum(int x, int y)
{
if(x > y) std::swap(x, y);
return Len[x] + Len[y] + cover[x][y];
} void calc()
{
int now = 0, pos = 1;
for(RG int i = 1; i <= cnt_node; i++)
{
int delta = a[i].t - now; now = a[i].t;
if(s.size() == 0) Empty += delta;
else if(s.size() == 1)
{
int x = *s.begin();
Len[x] += delta; update(x, Len[x]);
Inc[x] += delta; int cost = C - cl[x].c;
if(cost >= 0)
{
int val = Len[x];
if(cost >= cl[1].c)
{
int l = 1, r = n, res = 1;
while(l <= r)
{
int mid = (l + r) >> 1;
if(cl[mid].c <= cost) res = mid, l = mid + 1;
else r = mid - 1;
} int ql = 1, qr = res;
if(x == qr) --qr;
if(x < qr)
{
ql = x + 1;
if(ql <= qr) Chkmax(val, sum(x, query(ql, qr)));
ql = 1, qr = x - 1;
} if(ql <= qr) Chkmax(val, sum(x, query(ql, qr)));
} Chkmax(Inc[x], val), Chkmax(Max, Inc[x]);
}
}
else if(s.size() == 2)
{
It = s.begin(); int x = *It;
++It; int y = *It; cover[x][y] += delta;
if(cl[x].c + cl[y].c <= C)
{
Chkmax(Inc[x], sum(x, y)), Chkmax(Inc[y], sum(x, y));
Chkmax(Max, Inc[x]);
}
}
while(pos <= m && Max + Empty >= q[pos].t)
ans[q[pos].id] = now - (Max + Empty - q[pos].t), ++pos;
if(pos > m) break;
if(a[i].opt == 1) s.insert(a[i].id); else s.erase(a[i].id);
}
} int main()
{
#ifndef ONLINE_JUDGE
file(cpp);
#endif
using std::sort;
n = read(), C = read();
for(RG int i = 1; i <= n; i++) cl[i] = (cloud) {read(), read(), read()};
sort(cl + 1, cl + n + 1);
for(RG int i = 1; i <= n; i++)
a[++cnt_node] = (node) {cl[i].l, +1, i},
a[++cnt_node] = (node) {cl[i].r, -1, i};
sort(a + 1, a + cnt_node + 1);
a[++cnt_node] = (node) {(int)(2e9 + 7), 1, n + 1};
m = read();
for(RG int i = 1; i <= m; i++) q[i] = (Query) {i, read()};
sort(q + 1, q + m + 1); calc();
for(RG int i = 1; i <= m; i++) printf("%d\n", ans[i]);
return 0;
}

CF833E Caramel Clouds的更多相关文章

  1. 【CF833E】Caramel Clouds(线段树)

    [CF833E]Caramel Clouds(线段树) 题面 CF 洛谷 题解 首先把区间一段一段分出来,那么只有四种情况. 要么没有被任何一朵云被覆盖,那么直接就会产生这一段的贡献. 要么被一朵云覆 ...

  2. 【CF833E】Caramel Clouds

    [CF833E]Caramel Clouds 题面 洛谷 题目大意: 天上有\(n\)朵云,每朵云\(i\)会在时间\([li,ri]\)出现,你有\(C\)个糖果,你可以花费\(c_i\)个糖果让云 ...

  3. Codeforces 833E Caramel Clouds

    E. Caramel Clouds time limit per test:3 seconds memory limit per test:256 megabytes input:standard i ...

  4. Codeforces Round #426 (Div. 1) (ABCDE)

    1. 833A The Meaningless Game 大意: 初始分数为$1$, 每轮选一个$k$, 赢的人乘$k^2$, 输的人乘$k$, 给定最终分数, 求判断是否成立. 判断一下$a\cdo ...

  5. Clouds

    1.Eucalyptus: Eucalyptus is a Linux-based software architecture that implements scalable private and ...

  6. Optimization on content service with local search in cloud of clouds

    曾老师的这篇文章发表于Journal of Network and Computer Applications,主要解决的是利用启发式算法决定如何在cloud of clouds中进行副本分发,满足用 ...

  7. End-to end provisioning of storage clouds

    Embodiments discussed in this disclosure provide an integrated provisioning framework that automates ...

  8. (论文笔记Arxiv2021)Walk in the Cloud: Learning Curves for Point Clouds Shape Analysis

    目录 摘要 1.引言 2.相关工作 3.方法 3.1局部特征聚合的再思考 3.2 曲线分组 3.3 曲线聚合和CurveNet 4.实验 4.1 应用细节 4.2 基准 4.3 消融研究 5.总结 W ...

  9. 论文笔记:(2021CVPR)PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds

    目录 摘要 1.引言 2.相关工作 将点云映射到常规二维或三维栅格(体素) 基于MLPs的点表示学习 基于点卷积的点表示学习 动态卷积和条件卷积 3.方法 3.1 回顾 3.2 动态内核组装 Weig ...

随机推荐

  1. Windows7下安装配置PostgreSQL10

    PostgreSQL安装: 一.windows7下安装过程首先上PostgreSQL官方网站的下载页面https://www.postgresql.org/download/windows/,下载本软 ...

  2. 超慢速移动动画使用CSS3实现流畅效果

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVpbGVpZm9yZXZlcg==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  3. 使用highmaps制作中国地图

    Highmaps 所需文件 http://code.highcharts.com/maps/highmaps.js(地图渲染的核心文件 必须引用)http://code.highcharts.com/ ...

  4. 洛谷P1832 A+B Problem(再升级)

    放题解 题目传送门 放代码 #include<bits/stdc++.h> using namespace std; ];//n为被分解数 a数组用于存储素数 ];//dp数组用于存储方案 ...

  5. nginx下配置多个web服务

    参考 nginx配置详解  nginx反向代理与负载均衡详解 一.nginx简介: Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能 ...

  6. 去掉C#中Guid.NewGuid().ToString()自动生成的短横线

    别人设计的ID类型为varchar(32),使用Guid.NewGuid().ToString()自动生成ID值,本来大小32位妥妥的.可C#在生成的ID值中自动生成了几根小横杠,你说是不是讨嫌. 岂 ...

  7. standby_file_management 参数为manual 导致ORA-01111问题

    情景: Dataguard 物理备库执行恢复报错: Errors in file /home/u01/app/diag/rdbms/rzorcl11g/ORCL/trace/ORCL_pr00_358 ...

  8. 线程队列-queue

    使用队列的目的: 解耦,使程序之间实现松耦合:提高处理效率   FIFO = 先进先出,first in first out LIFO = 后入先出,last in first out   生产者消费 ...

  9. js 时间转换毫秒的四种方法(转)

    将时间转换为毫秒数的方法有四个: Date.parse()Date.UTCvalueOf()getTime() 1. Date.parse():该方法接受一个表示日期的字符串参数,然后尝试根据这个日期 ...

  10. 解决win10安装MySQL数据库出现服务无法启动的问题

    安装mysql的时候一直出现这个问题,在网上找了很多种方法,终于解决了这个问题. 我在官网下载的安装包解压后没有my.ini文件,需要自己添加(红字不要复制) [mysql]# 设置mysql客户端默 ...