Codeforces 1146E Hot is Cold
题意:
给出一个序列,有两种操作:
- \(>\;x\) 将大于\(x\)的数全都取负
- \(<\;x\) 将小于\(x\)的数全都取负
最后输出序列中的所有数最后的状态
思路:
我们先考虑对于一个数来说,它最后的状态只取决于它初始的时候是哪个数,而跟它所处的位置无关。
我们注意到序列中的数的范围是\([-10^{5}, 10^5]\),那么我们只需要处理出每个数在经过\(q\)次操作后的状态是什么,最后查表就好了。
我们定义一个状态\(1\)和\(-1\),分别表示一个数的当前状态是取负了还是没有取负。
我们以\(>\;x\)这个操作为例:
- 如果\(x > 0\),那么也就是说\([x + 1, 10^5]\)这部分的数的状态肯定是-1, 并且\([-10^5, -x - 1]\)这部分数的状态肯定是\(1\),而不用管它们之前是什么状态,那么直接区间赋值就好了
- 如果\(x < 0\),那么\([x + 1, -x - 1]\)这部分数的状态是反转,\([-x, 10^5]\)这部分数的状态肯定是\(-1\),\([-10^5, x]\)这部分数的状态肯定是\(1\),那么区间反转就好了
用线段树维护区间赋值和区间反转就可以了,同理\(<\;x\)的操作也类似处理
#include <bits/stdc++.h>
using namespace std;
#define N 200010
#define D 100005
int n, q, a[N];
struct SEG {
struct node {
int x, lazy[2];
node () {
x = 1;
lazy[0] = 0;
lazy[1] = 1;
}
void add1(int v) {
lazy[1] = 1;
lazy[0] = v;
x = v;
}
void add2(int v) {
x *= v;
if (lazy[0] != 0) {
lazy[0] *= v;
} else {
lazy[1] *= v;
}
}
}t[N << 2];
void build(int id, int l,int r) {
if (l == r) {
t[id] = node();
return;
}
int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
}
void pushdown(int id) {
if (t[id].lazy[1] != 1) {
t[id << 1].add2(t[id].lazy[1]);
t[id << 1 | 1].add2(t[id].lazy[1]);
t[id].lazy[1] = 1;
}
if (t[id].lazy[0] != 0) {
t[id << 1].add1(t[id].lazy[0]);
t[id << 1 | 1].add1(t[id].lazy[0]);
t[id].lazy[0] = 0;
}
}
void update1(int id, int l ,int r, int ql, int qr, int v) {
if (ql > qr) {
return;
}
if (l >= ql && r <= qr) {
t[id].add1(v);
return;
}
int mid = (l + r) >> 1;
pushdown(id);
if (ql <= mid) update1(id << 1, l, mid, ql, qr, v);
if (qr > mid) update1(id << 1 | 1, mid + 1, r, ql, qr, v);
}
void update2(int id, int l, int r, int ql, int qr, int v) {
if (ql > qr) {
return;
}
if (l >= ql && r <= qr) {
t[id].add2(v);
return;
}
int mid = (l + r) >> 1;
pushdown(id);
if (ql <= mid) update2(id << 1, l, mid, ql, qr, v);
if (qr > mid) update2(id << 1 | 1, mid + 1, r, ql, qr, v);
}
int query(int id, int l, int r, int pos) {
if (l == r) {
return t[id].x;
}
int mid = (l + r) >> 1;
pushdown(id);
if (pos <= mid) return query(id << 1, l, mid, pos);
else return query(id << 1 | 1, mid + 1, r, pos);
}
}seg;
int main() {
while (scanf("%d%d", &n, &q) != EOF) {
for (int i = 1; i <= n; ++i) {
scanf("%d", a + i);
}
seg.build(1, 1, 2 * D);
char op[10]; int x;
while (q--) {
scanf("%s%d", op, &x);
switch(op[0]) {
case '>' :
if (x < 0) {
seg.update2(1, 1, 2 * D, x + 1 + D, -x - 1 + D, -1);
seg.update1(1, 1, 2 * D, -100000 + D, x + D, 1);
seg.update1(1, 1, 2 * D, -x + D, 100000 + D, -1);
} else {
seg.update1(1, 1, 2 * D, x + 1 + D, 100000 + D, -1);
seg.update1(1, 1, 2 * D, -100000 + D, -x - 1 + D, 1);
}
break;
case '<' :
if (x > 0) {
seg.update2(1, 1, 2 * D, -x + 1 + D, x - 1 + D, -1);
seg.update1(1, 1, 2 * D, x + D, 100000 + D, 1);
seg.update1(1, 1, 2 * D, -100000 + D, -x + D, -1);
} else {
seg.update1(1, 1, 2 * D, -100000 + D, x - 1 + D, -1);
seg.update1(1, 1, 2 * D, -x + 1 + D, 100000 + D, 1);
}
break;
default :
assert(0);
}
// for (int i = -5; i <= 5; ++i) {
// printf("%d%c", seg.query(1, 1, 2 * D, i + D), " \n"[i == 5]);
// }
}
for (int i = 1; i <= n; ++i) {
printf("%d%c", a[i] * seg.query(1, 1, 2 * D, a[i] + D), " \n"[i == n]);
}
}
return 0;
}
Codeforces 1146E Hot is Cold的更多相关文章
- codeforces选做
收录了最近本人完成的一部分codeforces习题,不定期更新 codeforces 1132E Knapsack 注意到如果只使用某一种物品,那么这八种物品可以达到的最小相同重量为\(840\) 故 ...
- Codeforces Forethought Future Cup Elimination Round 选做
1146C Tree Diameter 题意 交互题.有一棵 \(n(n\le 100)\) 个点的树,你可以进行不超过 \(9\) 次询问,每次询问两个点集中两个不在同一点集的点的最大距离.求树的直 ...
- CodeForces 151B Phone Numbers
Phone Numbers Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Sub ...
- Codeforces Round #515 (Div. 3) B. Heaters【 贪心 区间合并细节 】
任意门:http://codeforces.com/contest/1066/problem/B B. Heaters time limit per test 1 second memory limi ...
- CodeForces Round #515 Div.3 B. Heaters
http://codeforces.com/contest/1066/problem/B Vova's house is an array consisting of nn elements (yea ...
- Rxjava cold/hot Observable
create Observable分为cold以及hot两种,cold主要是静态的,每次subscribe都是从头开始互不干扰,而hot的在同一时刻获得的值是一致的 cold Observable 使 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
随机推荐
- 使用DnsCat反弹shell
DnsCat技术特点 Dns隧道反弹shell DnsCat服务器的安装 #git clone https://github.com/iagox86/dnscat2.git #cd dnscat2 # ...
- PHP服务器访问优化
常规的优化措施: 磁盘写入,网络安全,证书加密,CPU,内存,DNS解析,数据库优化,页面gzip压缩 PHP gzip压缩打开: 打开php目录下的php.ini文件,找到zlib.output_c ...
- oracle的日期相减
oracle的日期相减 : 两个date类型的 日期相减,得到的是天数,可能是带小数点的.如下:
- React Native ——入门环境搭配以及简单实例
一.Homebrew 是OS X 的套件管理器. 首先我们需要获取 Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent. ...
- linux消息队列编程实例
转自:linux 消息队列实例 前言: 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权 ...
- python的for else组合用法
如下代码,输入评论,如果评论中含有敏感词则更换成*号,否则正常输入. li = ["老师", "你好", "333", "4444 ...
- 如何通过python代码解压zip包
转载至https://www.cnblogs.com/flyhigh1860/p/3884842.html 很多人在Google上不停的找合适自己的压缩,殊不知Py的压缩很不错.可以试试.当然C#,J ...
- Java 构造函数(抽象类中的构造函数) 和 加载
博客分类: 面向对象设计的原则 与 概念 1. Java 的构造函数 与初始化块: a. 抽象类的构造函数 若果在父类中(也就是抽象类)中显示的写了有参数的构造函数,在子类是就必须写一个构造函数来 ...
- java 中的继承
继承的概念 继承就是子类继承父类的特征和行为,使得子类具有父类得属性和方法. 继承得关键字:extends 语法格式:<modifier> class <name> [exte ...
- Ubuntu下更改Vim配置文件打造C/C++风格
转载:Ubuntu下更改Vim配置文件打造C/C++风格 Vim默认的配置使用起来还不能让人满意,还需要自己配置 默认配置文件是:/etc/vim/vimrc我们可以在家目录下建立自己的配置文件切换到 ...