题意:

给出一个序列,有两种操作:

  • \(>\;x\) 将大于\(x\)的数全都取负
  • \(<\;x\) 将小于\(x\)的数全都取负

    最后输出序列中的所有数最后的状态

思路:

我们先考虑对于一个数来说,它最后的状态只取决于它初始的时候是哪个数,而跟它所处的位置无关。

我们注意到序列中的数的范围是\([-10^{5}, 10^5]\),那么我们只需要处理出每个数在经过\(q\)次操作后的状态是什么,最后查表就好了。

我们定义一个状态\(1\)和\(-1\),分别表示一个数的当前状态是取负了还是没有取负。

我们以\(>\;x\)这个操作为例:

  1. 如果\(x > 0\),那么也就是说\([x + 1, 10^5]\)这部分的数的状态肯定是-1, 并且\([-10^5, -x - 1]\)这部分数的状态肯定是\(1\),而不用管它们之前是什么状态,那么直接区间赋值就好了
  2. 如果\(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的更多相关文章

  1. codeforces选做

    收录了最近本人完成的一部分codeforces习题,不定期更新 codeforces 1132E Knapsack 注意到如果只使用某一种物品,那么这八种物品可以达到的最小相同重量为\(840\) 故 ...

  2. Codeforces Forethought Future Cup Elimination Round 选做

    1146C Tree Diameter 题意 交互题.有一棵 \(n(n\le 100)\) 个点的树,你可以进行不超过 \(9\) 次询问,每次询问两个点集中两个不在同一点集的点的最大距离.求树的直 ...

  3. CodeForces 151B Phone Numbers

     Phone Numbers Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Sub ...

  4. Codeforces Round #515 (Div. 3) B. Heaters【 贪心 区间合并细节 】

    任意门:http://codeforces.com/contest/1066/problem/B B. Heaters time limit per test 1 second memory limi ...

  5. 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 ...

  6. Rxjava cold/hot Observable

    create Observable分为cold以及hot两种,cold主要是静态的,每次subscribe都是从头开始互不干扰,而hot的在同一时刻获得的值是一致的 cold Observable 使 ...

  7. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  8. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  9. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

随机推荐

  1. 单例模式全面学习(C++版)

    单例模式:用来创建独一无二的,只能够有一个实例的对象. 单例模式的结构是设计模式中最简单的,但是想要完全实现一个线程安全的单例模式还是有很多陷阱的,所以面试的时候属于一个常见的考点~ 单例模式的应用场 ...

  2. virgo-tomcat-server最大并发连接数的修改

    首先,我们如果需要修改tomcat 7的最大连接数,我们可以去tomcat官方网站,查看Documentation 进入tomcat的官方网站http://tomcat.apache.org我们点击左 ...

  3. 【CF744D】Hongcow Draws a Circle 二分+几何

    [CF744D]Hongcow Draws a Circle 题意:给你平面上n个红点和m个蓝点,求一个最大的圆,满足圆内不存在蓝点,且至少包含一个红点. $n,m\le 10^3$ 题解:我们先不考 ...

  4. python获取windows所有com口

    import serial import serial.tools.list_ports port_list = list(serial.tools.list_ports.comports()) po ...

  5. swiper监听左滑还是右滑动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  6. yii---控制器的创建

    示例:在 controlls/ 路径新建 IndexController.php 控制器 类名要有 Controller 后缀 继承 yii\web\Controller <?php names ...

  7. 9.12DjangoORM回顾和路由.

    2018-9-12 13:44:41 周末继续整理一下博客!不知不觉记了好多! 越努力越幸运! 永远不要高估自己! 关于反射的复习 # /usr/bin/env python # -*- coding ...

  8. Save vtkMatrix4x4 to a file 保存到文件

    vtkMatrix4x4是VTK中的一个表示4x4矩阵的一种数据结构,有时候我们想把其保存到一个文件中,那么可以使用如下的代码: void writeVtkMatrix4x4ToFile(const ...

  9. JVM JRE JDK三者的区别和联系

    一. 详细介绍1.JVM -- java virtual machineJVM就是我们常说的java虚拟机,它是整个java实现跨平台的 最核心的部分,所有的java程序会首先被编译为.class的类 ...

  10. POJ 1269 - Intersecting Lines - [平面几何模板题]

    题目链接:http://poj.org/problem?id=1269 Time Limit: 1000MS Memory Limit: 10000K Description We all know ...