【GDKOI 2024 TG Day2】不休陀螺(top) 题解
考虑一个卡牌区间怎样才不是“陀螺无限”。
一个是费用在打到一半时费用就不够了。考虑构造一个卡牌序列使其尽量能够在打到一半时费用就不够,如何构造呢?
把 \(a_i > b_i\) 的卡牌称作消耗型卡牌,其他叫做获得型卡牌。我们可以构造把消耗型卡牌全部放在前面,后面突然来个很大的 \(a_i\) 就可以让你费用耗尽了。
但是我们不能贪心地选择,因为假如我们选择这个突然来的很大的 \(a_i\) 也是一个很大的消耗型卡牌,如果把它作为“引火线”就会导致前面消耗的费用不够多,这个导火线也就导不了火。
其实我们可以储存 \(E-a_i\) 表示在使用这张卡片前最多能够消耗的费用,假如一个区间其余的消耗型卡牌起作用使得 \(E-a_i-\text{其他消耗型卡牌的消耗}<0\),那么这个区间就不是”陀螺无限“。这个可以拿线段树维护。
我们只需要枚举区间左端点,然后计算最大的右端点,这个区间内的所有卡牌区间就都是合法方案了,\(O(n^2)\)。
我们会发现,左端点向右移动一位后,对区间内的影响是什么?
如果这个左端点是个消耗型卡牌,那么区间的消耗都会补回这个消耗,这个区间可能合法了,右端点可能可以往右移动;如果左端点是获得性卡牌,对区间没有任何影响。
这说明右端点是递增的,可以均摊 \(O(n)\) 得到合法区间。
另外一个卡牌区间不是”陀螺无限“是这个区间的代价 \(\sum b_i-\sum a_i<0\),这样就算打完一周后总费用也会减少,那么以此类推会越来越少。
这个比较简单,可以维护代价前缀和,也就是求 \(s_i-s_{j-1}\ge0\) 区间个数,即 \(s_i\ge s_{j-1}\),这个可以树状数组维护。
#include <cstdio>
#include <algorithm>
#define ll long long
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define N 1000010
using namespace std;
ll n, e, ans, len;
ll a[N], b[N], c[N]; // ci表示第i个会被扣掉多少
ll s[N], ss[N], to[N];
ll t[4*N]; // 维护每个位置的数能扣多少
ll lazy[4*N];
inline ll min(ll x, ll y) {
return x > y ? y : x;
}
void pushup(ll pos) {
t[pos] = min(t[ls(pos)], t[rs(pos)]);
}
void pushdown(ll pos) {
t[ls(pos)] += lazy[pos];
t[rs(pos)] += lazy[pos];
lazy[ls(pos)] += lazy[pos];
lazy[rs(pos)] += lazy[pos];
lazy[pos] = 0;
}
void update(ll nl, ll nr, ll l, ll r, ll pos, ll k) {
if(nl > nr) return;
if(nl <= l && r <= nr) {
t[pos] += k; // 维护最小值
lazy[pos] += k;
return;
}
if(lazy[pos]) {
pushdown(pos);
}
ll mid = (l + r) >> 1;
if(nl <= mid) {
update(nl, nr, l, mid, ls(pos), k);
}
if(mid < nr) {
update(nl, nr, mid+1, r, rs(pos), k);
}
pushup(pos);
}
ll query(ll nl, ll nr, ll l, ll r, ll pos) {
if(nl <= l && r <= nr) {
return t[pos];
}
if(lazy[pos]) {
pushdown(pos);
}
ll mid = (l + r) >> 1;
ll res = 1e15;
if(nl <= mid) {
res = min(res, query(nl, nr, l, mid, ls(pos)));
}
if(mid < nr) {
res = min(res, query(nl, nr, mid+1, r, rs(pos)));
}
return res;
}
// 桶
ll tong[N];
inline ll lowbit(ll x) {
return x & (-x);
}
void update1(ll x, ll val) {
while(x<=len) {
tong[x] += val;
x += lowbit(x);
}
}
ll query1(ll x) {
ll res=0;
while(x) {
res += tong[x];
x -= lowbit(x);
}
return res;
}
ll read() {
ll x = 0;
char c = '.';
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') {
x = (x<<1)+(x<<3)+(c^'0');
c = getchar();
}
return x;
}
int main() {
freopen("top.in", "r", stdin);
freopen("top.out", "w", stdout);
n =read(),e=read();
for(ll i = 1; i <= n; i++) a[i] = read();
for(ll i = 1; i <= n; i++) b[i] = read();
for(ll i = 1; i <= n; i++) c[i] = a[i] - b[i]; // 反过来好处理
for(ll i = 1; i <= n; i++) {
s[i] = s[i-1];
s[i] -= c[i];
ss[i+1] = s[i]; // 离散化使用
}
// 离散化
sort(ss+1, ss+1+n+1); // 把0也离散化
len = unique(ss+1, ss+1+n+1)-ss-1;
for(ll i = 0; i <= n; i++) {
ll l = 1, r = len; // 考场上不会用lower_bound
while(l <= r) {
ll mid = (l + r) >> 1;
if(ss[mid] < s[i]) l = mid+1;
if(ss[mid] > s[i]) r = mid-1;
if(ss[mid] == s[i]) {
to[i] = mid;
break;
}
}
}
ll r = 1;
bool flag = 0; // 表示已经加入过r了,不用再加入了
ll cost = 0;
for(ll l = 1; l <= n; l++) {
for(; r <= n; r++, flag=0) {
if(!flag) {
if(c[r] > 0) update(l, r-1, 1, n, 1, -c[r]); // 因为加入了r,前面的数都要多扣一个r
update(r, r, 1, n, 1, e - a[r] - cost);
if(c[r] > 0) cost += c[r]; // 把这一位加入cost
flag = true;
update1(to[r], 1);
}
if(query(l, r, 1, n, 1) < 0) { // 如果存在一种方式扣完,那就没了
break;
}
// printf("%lld %lld\n", l, r);
}
// 原本是求l到r内有多少个i使得 s[i]-s[l-1]>=0,也就是有多少个 s[i]>=s[l-1]
// for(ll i = l; i < r; i++) {
// if(s[i] - s[l-1] >= 0) {
// ans++;
// printf("%lld %lld\n", l, i);
// }
// }
if(r <= n) update1(to[r], -1); // 第r位被剔除,所以第r位是不合法的
ans += query1(len) - query1(to[l-1]-1);
if(r <= n) update1(to[r], 1);
// 要剔除最左边那个cost
if(c[l] > 0) cost -= c[l];
if(c[l] > 0) update(l+1, r, 1, n, 1, c[l]);
// 把这l踢出桶
update1(to[l], -1);
}
printf("%lld", ans);
}
【GDKOI 2024 TG Day2】不休陀螺(top) 题解的更多相关文章
- 【转】TYVJ 1695 计算系数(NOIP2011 TG DAY2 1)
计算系数 题目描述 给定一个多项式(ax + by)k,请求出多项式展开后xn ym项的系数. [数据范围] 对于 30%的数据,有0≤k≤10: 对于 50%的数据,有a = 1,b = 1: 对于 ...
- 2019.11.12&13题解
写在前面: 虽然拿到了rk1,但是T3被卡常TLE90分,(考后再交就A了!?),lemon80,又丢失了一次良好的AK机会, 掐头去尾距离联赛仅剩2天,最近中午一直睡不好,可能是有些紧张, 希望自己 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
- CH Round #55 - Streaming #6 (NOIP模拟赛day2)
A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...
- 题解【洛谷P1315】[NOIP2011]观光公交
题目描述 风景迷人的小城 Y 市,拥有 \(n\) 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务. 观光公交车在第 \(0\) 分钟出现在 \( ...
- 【数论】洛谷P1313计算系数
题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...
- MATLAB-卡尔曼滤波简单运用示例
1.角度和弧度之间的转换公式? 设角度为 angle,弧度为 radian radian = angle * pi / 180; angle = radian * 180 / pi; 所以在matla ...
- NOIp2018 pj 滚粗记
NOIp2018 pj 滚粗记 考前 一个午觉睡完就到了考场 考中 \(T1\)水题切了 \(T2\)水题切了 \(T3\)好像是\(dp\),不会,先跳 \(T4\)像树上莫队一样,然后再欧拉序上面 ...
- 哈希Hash在字符串中的应用_C++
本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 哈希大家都会用撒,字符串显然都会写撒,那么哈希离散化字符串不就懂了?!(XXX的神逻辑,其实原文是:树都晓得吧,数组显然都会开呀,那么恭喜 ...
随机推荐
- Nginx安装nginx-rtmp-module模块
简介 nginx中的模块虽然就是类似插件的概念,但是它无法像VsCode那样轻松的安装扩展. nginx要安装其它模块必须同时拿到nginx源代码和模块源代码,然后手动编译,将模块打到nginx中,最 ...
- Linux环境下Minio的安装部署与启动教程(完整版)
1.概述 MinIO是一个开源.分布式的对象存储系统,专为云原生环境设计.它提供了一个基于标准的Amazon S3兼容接口,使得开发者可以使用熟悉的API在私有云或边缘环境中部署和管理大规模非结构化数 ...
- http内网穿透CYarp[开源]
0 前言 在物联网领域中,mqtt消息一直是海量设备连接到平台的标配协议,而平台向移动端开放的操作接口往往是http协议,这就要求平台为两种协议作消息一一适配.在某些情况下,这些设备是有操作系统的li ...
- FreeRTOS教程8 任务通知
1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...
- 用Vue3.0 写过组件吗?如果想实现一个 Modal你会怎么设计?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.组件设计 组件就是把图形.非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式 现在有一个场景,点击新增与编辑都弹框出来进行 ...
- [Java]细节与使用经验
[版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18032072 出自[进步*于辰的博客] 纯文字阐述,内 ...
- 【Spring注解驱动开发】你敢信?面试官竟然让我现场搭建一个AOP测试环境!
写在前面 今天是9月1号,金九银十的跳槽黄金期已拉开序幕,相信很多小伙伴也在摩拳擦掌,想换一个新的工作环境.然而,由于今年疫情的影响,很多企业对于招聘的要求是越来越严格.之前,很多不被问及的知识点,最 ...
- KingbaseES中查询对象大小的SQL及函数区别
--查看所有数据库大小 select sys_database.datname, sys_size_pretty(sys_database_size(sys_database.datname)) AS ...
- Java实现栈
package algorithm; import java.util.Arrays; import java.util.Iterator; /** @author Administrator @da ...
- Python 列表list方法clear( )和直接list [ ]的区别
x.clear()是将内存地址清空, x=[ ]会新开辟一个内存空间.