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 ...
随机推荐
- 2-1 nodejs和npm的安装和环境搭建
1.安装node.js (最新已经集成npm) https://nodejs.org/en/ 2.升级npm $ npm install -g npm $ cnpm install -g cnpm ...
- css的border的solid
http://www.w3school.com.cn/cssref/pr_border-style.asphttp://www.w3school.com.cn/tiy/t.asp?f=csse_bor ...
- SSH教程从零打造在线网盘系统前言&目录
本系列教程内容提要 本系列教程是一个学习教程,是关于Java工程师的SSH(Struts2+Spring+Hibernate)系列教程,本教程将会分为四个部分和大家一同打造一个在线网盘系统,由于教程是 ...
- iOS UIScrollView 3种分页方法,间隔实现
基础知识参考 http://tech.glowing.com/cn/practice-in-uiscrollview/ https://stackoverflow.com/questions/9367 ...
- java.exe和javaw.exe有什么区别
- poj2492 A Bug's Life【并查集】
Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assume ...
- pcl学习笔记(二):点云类型
不同的点云类型 前面所说的,pcl::PointCloud包含一个域,它作为点的容器,这个域是PointT类型的,这个域是PointT类型的是pcl::PointCloud类的模板参数,定义了点云的存 ...
- ZOJ 3777 - Problem Arrangement - [状压DP][第11届浙江省赛B题]
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 Time Limit: 2 Seconds Me ...
- Linux的/etc/services文件的作用?
4)端口分配 Linux系统的端口号的范围为0–65535,不同范围有不同的意义. 0 不使用 1--1023 系统保留,只能由root用户使用 1024---4999 由客户端程序自由分配 5000 ...
- go语言编程入门
查看文档 首先先分享一个可以在本地就能查看文档的骚操作(linux系统) 1.打开命令行终端,输入godoc -http=:8000,如果想后台运行在后面加个& 2.然后打开浏览器,输入网址: ...