首页 > 其他分享 >P10083 [GDKOI2024 提高组] 不休陀螺

P10083 [GDKOI2024 提高组] 不休陀螺

时间:2024-01-26 16:36:02浏览次数:33  
标签:tmp GDKOI2024 lg int sum tn 陀螺 P10083 rep

前置题目:石头剪刀布大赛

很经典的问题,可以参考一个比这个简单容易想的 *2500 的做法。

先想判定条件再考虑怎么计数。

因为少写了一个 case 导致 Au \(\to\) Ag,有点难评。

不难想到记录 \(c_i = b_i - a_i\)。

我们考虑怎样才能无限下去:

  • 卡牌打完之后的费用变化是正的,不然会一直变小,那么就是 \(\sum c_i \geq 0\)

考虑安排一张卡使得其付不出那么多的费用。

  • 考虑全部先排负的,然后放一张正的 \(a_i\) 的最大的,形式化后就是 \(E + \sum \min\{c_i, 0\} < a_i (c_i > 0)\)

  • 考虑全部排负的中抽出一张卡使得其付不起,那么就是:\(E + \sum\min\{c_i, 0\} - c_i < a_i (c_i < 0)\) 我们考虑移项,那么就是 \(E + \sum\min\{c_i, 0\} < b_i (c_i < 0)\)

不难发现这个就是所有的选择 hack 掉区间的方法,因为如果可以通过这三种手上的钱是会一直加的,所以更 hack 不掉了。

不难发现 \(\sum \min\{c_i, 0\}\) 单调递减,满足条件的 \(a_i\) 和 \(b_i\) 单调递增,所以区间左端点对应的最大合法区间右端点具有单调性。我们可以双指针,也可以ST表二分来解决问题。

最后相当于数 \([l, r]\) 中 \(sum_i \geq k\) 的个数,普通二维数点即可。

复杂度线性对数。

#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; i ++)
#define per(i, r, l) for (int i = r; i >= l; i --)

using namespace std;
typedef long long ll;
 
const int _ = 1e6 + 5;

int n, tn;
ll E;
int a[_], b[_], c[_], lg[_];
ll sum[_], sumd[_], tmp[_];
int st[_][21][2];
vector <pair<int, int> > qv[_];
ll ans = 0;

int tr[_];
void add (int x, int k) {
	for ( ; x <= tn; x += x & -x) tr[x] += k;
}
int query (int x) {
	int ret = 0;
	while(x) ret += tr[x], x -= x & -x;
	return ret;
}

/*
e + sc < mxa 
e + sc < bi
e + sc - ci < ai
*/
int querymx (int l, int r, int id) {
	int k = lg[r - l + 1];
	return max(st[l][k][id], st[r - (1 << k) + 1][k][id]);
}
bool check (int l, int r) {
	ll d = E + sumd[r] - sumd[l - 1];
//	cout << d << " " << l << " " << r << endl;
	if (d < querymx(l, r, 0) || d < querymx(l, r, 1)) return false;
	return true;
}
int main () {
	cin >> n >> E;
	lg[0] = -1, tmp[++ tn] = 0;
	rep(i, 1, n) lg[i] = lg[i >> 1] + 1, scanf("%d", & a[i]);
	rep(i, 1, n) {
		scanf("%d", & b[i]);
		c[i] = b[i] - a[i], sum[i] = sum[i - 1] + c[i];
		tmp[++ tn] = sum[i], sumd[i] = sumd[i - 1];
		if (c[i] < 0) {
			sumd[i] += c[i], st[i][0][1] = b[i];
		} else st[i][0][0] = a[i]; 
	}
	sort(tmp + 1, tmp + 1 + tn),
	tn = unique(tmp + 1, tmp + 1 + tn) - (tmp + 1);
	rep(i, 0, n) sum[i] = lower_bound(tmp + 1, tmp + 1 + tn, sum[i]) - tmp;
	rep(k, 1, 20) 
		rep(i, 1, n - (1 << k) + 1) rep(t, 0, 1) 
			st[i][k][t] = max(st[i][k - 1][t], st[i + (1 << k - 1)][k - 1][t]);
	rep(i, 1, n) {
		int l = i, r = n, retp = 0;
		while (l <= r) {
			int mid = (l + r) >> 1;
			if (check(i, mid)) l = mid + 1, retp = mid;
			else r = mid - 1;
		}
		if (retp) {
			qv[retp].push_back({sum[i - 1], 1});
			qv[i - 1].push_back({sum[i - 1], -1});
		}
	}
	rep(i, 1, n) {
		add(sum[i], 1);
		for (auto v : qv[i]) {
			int val = v.first, coef = v.second;
			ans += 1ll * (query(tn) - query(val - 1)) * coef;
		}
	}
	cout << ans;
	return 0;
} 

标签:tmp,GDKOI2024,lg,int,sum,tn,陀螺,P10083,rep
From: https://www.cnblogs.com/Custlo/p/17989652

相关文章

  • P10073 [GDKOI2024 普及组] 刷野 II 的题解
    P10073[GDKOI2024普及组]刷野II的题解谨以此篇题解记录我考场上唯一通过的一题~解题思路可以考虑定义两个指针x和y,分别为左侧攻击到哪里和右侧。此时,从两侧线性想中间递推,若先打左边的代价小就打左边的,否则就打右边的。按照这个方法向中间推就可以了。Code#include<......
  • IMX6ULL SPI应用-6轴陀螺仪加速度传感器ICM-20608-G
    16轴陀螺仪加速度传感器ICM-20608-G1.1概述TheICM-20608-Gisa6-axisMotionTrackingdevicethatcombinesa3-axisgyroscope,anda3-axisaccelerometerinasmall3x3x0.75mm(16-pinLGA)package.Thegyroscopehasaprogrammablefull-scalerangeof±250,......
  • CoreMotion框架--加速计和陀螺仪
    iOS加速计是三轴加速计,可以监测三维空间中的运动和重力。三轴坐标系统:       *手机顶部向上时,正对手机屏幕,手机屏幕向左是X轴正方向。*沿手机屏幕向上是Y轴正方向。*垂直屏幕向外是Z轴正方向。 当手机静止不动时,地球引力将会给予手机1g加速度。......
  • 对陀螺仪 Z 轴角度的线性化处理
    多数陀螺仪Z轴方向角度变化如下图所示:为方便进行PID,需要对其进行线性化处理观察图像不难发现,由于非线性是跳跃间断点造成的,所以间断点两端会存在巨大的数值跳变,这个跳变就是我们可以利用的地方定义一个圈数变量,初值为0,每判定一次越界则圈数变量的值发生1的变化。假设采......
  • 陀螺仪的使用及四元数解算(MPU6050为例)
    陀螺仪的介绍常用的六轴陀螺仪有MPU6050,icm-20602。MPU6050基本上只用软件IIC驱动,速率较慢,数据漂移也相对大一点。陀螺仪的使用以MPU6050为例。软件IIC驱动->MPU6050寄存器基本配置->读取原始数据->将原始数据滤波后使用。原始数据可以使用互补滤波,卡尔曼滤波,解算四元......
  • H5 陀螺仪
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title></hea......
  • 【雕爷学编程】Arduino动手做(152)---BMI160 六轴陀螺仪模块2
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 【雕爷学编程】Arduino动手做(152)---BMI160 六轴陀螺仪模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • Unity开发《一起来捉妖》教程 | 1.陀螺仪控制相机
    洪流学堂,让你快人几步。你好,我是郑洪智。洪流学堂公众号回复捉妖,可以获取本教程的源码工程。大智:“小新,你小子最近是不是谈恋爱了,怎么天天往外跑?”小新:“嘿嘿”大智:“嘿嘿你个鬼啊,从实招来,是不是要请我吃饭了?”小新:“最近有一款非常火的AR游戏,叫《一起来捉妖》,你玩了没?”大智:“听说......
  • MPU6050陀螺仪与Processing和上位机飞控联动实录
    简而言之,MPU6050=三轴MEMS陀螺仪+三轴MEMS加速度计+可扩展数字运动处理器DMP,它可进行姿态解算(Pitch、Yaw、Roll角),我们还可以外接ProcessingIDE,或外接匿名上位机(V7),实时绘制系统的飞行姿态,下面讲一下整个联调过程以及遇到的坑。 图0单片机与上位机(V7)飞行姿态联动......