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 ...
随机推荐
- 如何查看Mac电脑的处理器核心数目-CPU的核心数目
1.通过点击关于本机来查看
- 23种设计模式之外观模式(Facade)
外观模式是对象的结构模式,要求外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 优点: 1 ...
- 【POJ2154】Color Pólya定理+欧拉函数
[POJ2154]Color 题意:求用$n$种颜色染$n$个珠子的项链的方案数.在旋转后相同的方案算作一种.答案对$P$取模. 询问次数$\le 3500$,$n\le 10^9,P\le 3000 ...
- 在 arc里面打印 引用计数的方法
查阅资料: You can use CFGetRetainCount with Objective-C objects, even under ARC: NSLog(@"Retain c ...
- 记我的第一个python爬虫
捣鼓了两天,终于完成了一个小小的爬虫代码.现在才发现,曾经以为那么厉害的爬虫,在自己手里实现的时候,也不过如此.但是心里还是很高兴的. 其实一开始我是看的慕课上面的爬虫教学视屏,对着视屏的代码一行行的 ...
- jsp页面获取参数的方法(url解析、el表达式赋值、session取值)【原创】
最近使用myEclispse做网站,使用jsp+js+css做页面,网站中常用到从列表进入详情页面的跳转,下面对详情页面的值填充方式做一个简单总结: 1.url中使用request获取参数 jsp上方 ...
- Pointer Lock
Pointer Lock API 指针锁定(以前叫做 鼠标锁定) 提供了一种输入方法,这种方法是基于鼠标随着时间推移的运动的(也就是说,deltas),而不仅是鼠标光标的绝对位置.通过它可以访问原始的 ...
- 第一次php之旅
话说起来,我也是刚接触php不久,刚开始是因为想自己做一个从前端到后台完整的网站,所以去学后台技术,在各种语言的选择中,由于php语言的简单,易学,功能强大,开发速度快等原因,最终我选择了php! 一 ...
- FZU2110 Star【计算几何】
Overpower often go to the playground with classmates. They play and chat on the playground. One day, ...
- 51nod1432 独木舟
1432 独木舟 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 n个人,已知每个人体重.独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者 ...