CF833E Caramel Clouds
题面
天上有$n$朵云,每朵云$i$会在时间$[l_i,r_i]$出现,你有$\text C$个糖果,你可以花费$c_i$个糖果让云$i$消失,同时需要保证你最多让两朵云消失.现在有$m$个独立的询问,每次给你一个需要让阳光照$k$时间的植物,问你从时刻$0$开始,这个植物最快什么时候能长成. $n,m\leq 3\times10^5$
题解
看他的吧,这题真的麻烦。
代码
#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的更多相关文章
- 【CF833E】Caramel Clouds(线段树)
[CF833E]Caramel Clouds(线段树) 题面 CF 洛谷 题解 首先把区间一段一段分出来,那么只有四种情况. 要么没有被任何一朵云被覆盖,那么直接就会产生这一段的贡献. 要么被一朵云覆 ...
- 【CF833E】Caramel Clouds
[CF833E]Caramel Clouds 题面 洛谷 题目大意: 天上有\(n\)朵云,每朵云\(i\)会在时间\([li,ri]\)出现,你有\(C\)个糖果,你可以花费\(c_i\)个糖果让云 ...
- Codeforces 833E Caramel Clouds
E. Caramel Clouds time limit per test:3 seconds memory limit per test:256 megabytes input:standard i ...
- Codeforces Round #426 (Div. 1) (ABCDE)
1. 833A The Meaningless Game 大意: 初始分数为$1$, 每轮选一个$k$, 赢的人乘$k^2$, 输的人乘$k$, 给定最终分数, 求判断是否成立. 判断一下$a\cdo ...
- Clouds
1.Eucalyptus: Eucalyptus is a Linux-based software architecture that implements scalable private and ...
- Optimization on content service with local search in cloud of clouds
曾老师的这篇文章发表于Journal of Network and Computer Applications,主要解决的是利用启发式算法决定如何在cloud of clouds中进行副本分发,满足用 ...
- End-to end provisioning of storage clouds
Embodiments discussed in this disclosure provide an integrated provisioning framework that automates ...
- (论文笔记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 ...
- 论文笔记:(2021CVPR)PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds
目录 摘要 1.引言 2.相关工作 将点云映射到常规二维或三维栅格(体素) 基于MLPs的点表示学习 基于点卷积的点表示学习 动态卷积和条件卷积 3.方法 3.1 回顾 3.2 动态内核组装 Weig ...
随机推荐
- 报错 Filtered offsite request
用scrapy框架迭代爬取时报错 scrapy日志: 在 setting.py 文件中 设置 日志 记录等级 LOG_LEVEL= 'DEBUG' LOG_FILE ='log.txt' 观察 scr ...
- 「CF1025D Recovering BST」
题目 郑州讲过的题了 发现这是一个二叉搜索树,给出的还是中序遍历,我们很自然的想到我们需要可以用一个\(f[i][j][k](k\in[i,j])\)来表示区间\([i,j]\)能不能形成以\(k\) ...
- weblogic之CVE-2016-3510反序列化分析
将反序列化的对象封装进了weblogic.corba.utils.MarshalledObject,然后再对MarshalledObject进行序列化,生成payload字节码.由于Marshalle ...
- 3、RabbitMQ-work queues 工作队列
work queues 工作队列 1.模型图: 为什么会出现 work queues? 前提:使用 simple 队列的时候 我们应用程序在是使用消息系统的时候,一般生产者 P 生产消息是毫不费力的( ...
- Android签名生成和互转
原文链接:http://blog.votzone.com/2018/05/05/android_signature.html Android 的签名有两种方式,一种使用jdk 提供的jarsign ...
- ORACLE逐行累计求和方法(OVER函数)
1.RANK ( ) OVER ( [QUERY_PARTITION_CLAUSE] ORDER_BY_CLAUSE ) DENSE_RANK ( ) OVER ( [QUERY_PARTITION_ ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 021-024
忙疯警告,这两天可能进度很慢,下午打了一下午训练赛,训练赛的题我就不拿过来的,pta就做了一点点,明天又是满课的一天,所以进度很慢啦~ -------------------------------- ...
- SDL2 undefined reference to `SDL_Init' 问题
我在使用SDL2的时候,遇到undefined reference to `SDL_Init'的问题,只要使用SDL2相关的函数,就会报函数未定义.后来百度到一篇文章https://blog.csdn ...
- 三、spring成长之路——springIOC容器详解(上)
目录 一.springIOC 一.springIOC 控制反转和依赖注入: 简单的说就是将对象的创建,属性的的设置交给spring容器进行管理,而不再由用户自己创建,当用户需要使用该接口或者类的时 ...
- PHP实现多继承 - 通过接口的多继承特性(二)
原文地址:http://small.aiweimeng.top/index.php/archives/51.html 在上篇文章中写到php可以使用```Trait```实现代码的复用,下面介绍使用接 ...