题面

天上有$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. 纯css3跑马灯demo

    我们写跑马灯一般都是用js控制定时器不断循环产生,但是定时器消耗比较大,特别是程序中很多用到定时器的时候,感觉有的时候比较卡.但是css3样式一般不会.这里主要的思路就是用css3代替js定时器实现一 ...

  2. Java虚拟机9:垃圾收集(GC)-4(垃圾收集器)

    1.前言 垃圾收集器是前一章垃圾收集算法理论知识的具体实现了,不同虚拟机所提供的垃圾收集器可能会有很大差别,另外我们必须提前说明一个道理:没有最好的垃圾收集器,更加没有万能的收集器,只能选择对具体应用 ...

  3. CF 553E Kyoya and Train

    题目分析 期望\(\text{dp}\). 设\(f_{i,j}\)表示在第\(j\)个时刻从\(i\)点出发,到达终点的期望花费. 有转移方程: \[ f_{x,t}=\min_{(x,y)\in ...

  4. 2456. mode【乱搞】

    Description 给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数. Input 第1行一个正整数n. 第2行n个正整数用空格隔开. Output 一行一个正整数 ...

  5. array和matrix

    array:数组 matrix:矩阵 list:列表 a = [[1,2,3],[4,5,6]] 两种array的定义方式,第一种方式可以看出list不是array,但却有很大的联系 a = np.a ...

  6. Lombok安装和使用

    前言 Lombok是一个开源项目,其使用简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码,特别是对于POJO. Lombok的官网:https://projectlombok ...

  7. iOS之利用腾讯Bugly程序调试,测试代码bug、卡顿等情况

    1.自己先写一个 Demo 演示一下利用bugly测试崩溃的具体情况. 在ViewController里面实现崩溃代码如下:  运行后 毫无疑问程序报错了! 2.使用到第三方的框架Bugly,官方下载 ...

  8. duplicate symbol _OBJC_IVAR

    duplicate symbol _OBJC_IVAR - Kingdev - 博客园 代码合并问题 git合并提示冲突文件为project.pbxproj,先去掉所有冲突提示<<< ...

  9. Token ,Cookie和Session的区别

    在做接口测试时,经常会碰到请求参数为token的类型,但是可能大部分测试人员对token,cookie,session的区别还是一知半解. Cookie cookie 是一个非常具体的东西,指的就是浏 ...

  10. OO第三次博客作业——规格

    OO第三次博客作业——规格 一.调研结果: 规格的历史: 引自博文链接:http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世 ...