「AHOI2014/JSOI2014」奇怪的计算器

传送门

我拿到这题首先是懵b的,因为感觉没有任何性质。。。

后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发现每次操作都不会改变这个排完序之后的序列的单调性(始终单调不降),也就是说如果其中有一次操作使得数列中的某些数越界了,那么肯定是一个前缀或一个后缀,分别对应向下和向上越界。

然后我们就可以用线段树来搞,每次操作直接用线段树区间修改实现(具体细节待会讲),判断越界的话,我们就存一下区间的最小值和最大值,根据序列单调不降的性质,最小值就是区间左端点的值,最大值就是区间右端点的值,那么我们就可以在线段树上二分+区间赋值来实现批量处理越界的数。

那么接下来就讲一讲区间修改的一种巧妙实现方式:

其实很简单,我们把每次区间修改都写成 \(s_i \leftarrow s_i \times k_1 + a_i \times k_2 + k_3\) 的形式。

那么我们就可以通过调整参数 \(k_1, k_2, k_3\) 的值来很方便地实现区间加法、区间乘法、区间加上 \(a \times x\)、区间赋值的操作了。

参考代码:

#include <algorithm>
#include <cstdio>
#define rg register
#define int long long
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
} const int _ = 1e5 + 5; int n, m, L, R, ans[_]; pair < int, int > a[_];
struct ask { int opt, x; } p[_];
struct node { int mn, mx, tag1, tag2, tag3; } t[_ << 2]; inline int lc(int p) { return p << 1; } inline int rc(int p) { return p << 1 | 1; } inline void pushup(int p) { t[p].mn = t[lc(p)].mn, t[p].mx = t[rc(p)].mx; } inline void f(int p, int l, int r, int tag1, int tag2, int tag3) {
t[p].tag1 = t[p].tag1 * tag1;
t[p].tag2 = t[p].tag2 * tag1 + tag2;
t[p].tag3 = t[p].tag3 * tag1 + tag3;
t[p].mn = t[p].mn * tag1 + a[l].first * tag2 + tag3;
t[p].mx = t[p].mx * tag1 + a[r].first * tag2 + tag3;
} inline void pushdown(int p, int l, int r, int mid) {
f(lc(p), l, mid, t[p].tag1, t[p].tag2, t[p].tag3);
f(rc(p), mid + 1, r, t[p].tag1, t[p].tag2, t[p].tag3);
t[p].tag1 = 1, t[p].tag2 = t[p].tag3 = 0;
} inline void build(int p = 1, int l = 1, int r = m) {
t[p].tag1 = 1, t[p].tag2 = t[p].tag3 = 0;
if (l == r) { t[p].mn = t[p].mx = a[l].first; return ; }
int mid = (l + r) >> 1;
build(lc(p), l, mid), build(rc(p), mid + 1, r), pushup(p);
} inline void update_mn(int p = 1, int l = 1, int r = m) {
if (l == r) { f(p, l, r, 0, 0, L); return ; }
int mid = (l + r) >> 1;
pushdown(p, l, r, mid);
if (t[rc(p)].mn < L) f(lc(p), l, mid, 0, 0, L), update_mn(rc(p), mid + 1, r);
else update_mn(lc(p), l, mid);
pushup(p);
} inline void update_mx(int p = 1, int l = 1, int r = m) {
if (l == r) { f(p, l, r, 0, 0, R); return ; }
int mid = (l + r) >> 1;
pushdown(p, l, r, mid);
if (t[lc(p)].mx > R) f(rc(p), mid + 1, r, 0, 0, R), update_mx(lc(p), l, mid);
else update_mx(rc(p), mid + 1, r);
pushup(p);
} inline void query(int p = 1, int l = 1, int r = m) {
if (l == r) { ans[a[l].second] = t[p].mn; return ; }
int mid = (l + r) >> 1;
pushdown(p, l, r, mid);
query(lc(p), l, mid), query(rc(p), mid + 1, r);
} inline int cg(char c) {
if (c == '+') return 1; if (c == '-') return 2; if (c == '*') return 3; if (c == '@') return 4;
} signed main() {
#ifndef ONLINE_JUDGE
file("cpp");
#endif
read(n), read(L), read(R);
char s[5];
for (rg int x, i = 1; i <= n; ++i) scanf("%s", s), read(x), p[i] = (ask) { cg(s[0]), x };
read(m);
for (rg int x, i = 1; i <= m; ++i) read(x), a[i] = make_pair(x, i);
sort(a + 1, a + m + 1), build();
for (rg int i = 1; i <= n; ++i) {
if (p[i].opt == 1) f(1, 1, m, 1, 0, p[i].x);
if (p[i].opt == 2) f(1, 1, m, 1, 0, -p[i].x);
if (p[i].opt == 3) f(1, 1, m, p[i].x, 0, 0);
if (p[i].opt == 4) f(1, 1, m, 1, p[i].x, 0);
if (t[1].mn < L) update_mn();
if (t[1].mx > R) update_mx();
}
query();
for (rg int i = 1; i <= m; ++i) printf("%d\n", ans[i]);
return 0;
}

「AHOI2014/JSOI2014」奇怪的计算器的更多相关文章

  1. 「AHOI2014/JSOI2014」宅男计划

    「AHOI2014/JSOI2014」宅男计划 传送门 我们首先要发现一个性质:存货天数随买食物的次数的变化类似于单峰函数. 具体证明不会啊,好像是二分加三分来证明?但是没有找到明确的严格证明. 感性 ...

  2. 「AHOI2014/JSOI2014」拼图

    「AHOI2014/JSOI2014」拼图 传送门 看到 \(n \times m \le 10^5\) ,考虑根号分治. 对于 \(n < m\) 的情况,我们可以枚举最终矩形的上下边界 \( ...

  3. 「AHOI2014/JSOI2014」骑士游戏

    「AHOI2014/JSOI2014」骑士游戏 传送门 考虑 \(\text{DP}\). 设 \(dp_i\) 表示灭种(雾)一只编号为 \(i\) 的怪物的代价. 那么转移显然是: \[dp_i ...

  4. 「AHOI2014/JSOI2014」支线剧情

    「AHOI2014/JSOI2014」支线剧情 传送门 上下界网络流. 以 \(1\) 号节点为源点 \(s\) ,新建一个汇点 \(t\),如果 \(u\) 能到 \(v\),那么连边 \(u \t ...

  5. #3144. 「APIO 2019」奇怪装置

    #3144. 「APIO 2019」奇怪装置 题目描述 考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数 \(x\) 和 \(y\). 经过研究,科学家对该装置得出了一个 ...

  6. 「UNR#1」奇怪的线段树

    「UNR#1」奇怪的线段树 一道好题,感觉解法非常自然. 首先我们只需要考虑一次染色最下面被包含的那些区间,因为把无解判掉以后只要染了一个节点,它的祖先也一定被染了.然后发现一次染色最下面的那些区间一 ...

  7. 【LOJ #3144】「APIO 2019」奇怪装置

    题意: 定义将一个\(t\)如下转换成一个二元组: \[ f(t) = \begin{cases} x = (t + \left\lfloor \frac{t}{B} \right \rfloor) ...

  8. 「APIO 2019」奇怪装置

    题目 考虑推柿子 最开始的想法是如果两个\(t\)在\(mod\ B\)意义下相等,那么只需要比较一下\((t+\left \lfloor \frac{t}{B}\rfloor \right)mod\ ...

  9. BZOJ3878: [Ahoi2014&Jsoi2014]奇怪的计算器

    BZOJ3878: [Ahoi2014&Jsoi2014]奇怪的计算器 Description [故事背景] JYY有个奇怪的计算器,有一天这个计算器坏了,JYY希望你能帮助他写 一个程序来模 ...

随机推荐

  1. Python核心编程:8个实践性建议

    前言 我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑踩过的雷总结出来的,现在在这里分享一下给大家,因为很多伙伴是接触P ...

  2. Bugku-CTF之求getshell

    Day31 求getshell   http://123.206.87.240:8002/web9/      

  3. 解决Hbase启动后,hmaster会在几秒钟后自动关闭(停掉)!!!

    在日志(身为小白白的我,一开始日志在哪我都不知道!路径:/usr/local/hadoop/app/hbase-0.98.8/logs/hbase-hadoop-master-Master.log(也 ...

  4. 树莓派学习之路-GPIO Zero

    原来用的都是RPi.GPIO模式开发,写程序 今天看到了GPIOZERO的资料,觉得这个API还是很好用的, 唯一的缺点就是官方资料是英文的,而且目前这方面的资料也不多, 所以开始写这篇博文,将自己学 ...

  5. ELK节点安装

    ELK 安装参考链接 https://www.cnblogs.com/xialiaoliao0911/p/9599898.html setenforce 0sed -i s/enforcing/dis ...

  6. AppBoxFuture: Sql存储的ORM查询示例

      上篇介绍集成第三方Sql数据库时未实现如导航属性.子查询等功能,经过大半个月的努力作者初步实现了这些功能,基本上能满足80%-90%查询需求,特别复杂的查询可以用原生sql来处理,下面分别示例介绍 ...

  7. Could not find result map com.youotech.tl_cons_credit_rating.entity.Result

    后端报错如下: java.lang.IllegalArgumentException: Result Maps collection does not contain value for com.yo ...

  8. Netty Learning Notes

    简介 Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端. ...

  9. Abaqus-GUI开发-RSG

    目录 1. GUI开发简介 2. 目标和消息 2.1消息类型和消息ID 2.2消息映射 3. 控件创建 1. GUI开发简介 Abaqus GUI程序开发时,可以采用两种方式创建GUI图形界面. (1 ...

  10. A. Angry Students

    网址:http://codeforces.com/problemset/problem/1287/A It's a walking tour day in SIS.Winter, so tt grou ...