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 ...
随机推荐
- 获取Web.config的内容
<web.config> web.config文件是一个XML文件,它的根结点是<configuration>,在<configuration>节点下的常见子节点有 ...
- 23种设计模式之模板方法(Template Method)
模板方法模式是一种类的行为型模式,用于定义一个操作中算法的骨架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,其缺点是对于不同的实现,都需要定义 ...
- 【CF757G】Can Bash Save the Day? 可持久化点分树
[CF757G]Can Bash Save the Day? 题意:给你一棵n个点的树和一个排列${p_i}$,边有边权.有q个操作: 1 l r x:询问$\sum\limits_{i=l}^r d ...
- 【BZOJ1187】[HNOI2007]神奇游乐园 插头DP
[BZOJ1187][HNOI2007]神奇游乐园 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细 ...
- zabbix监控tcp状态
Tcp的连接状态对于我们web服务器来说是至关重要的,从TCP的连接状态中可以看出网络的连接情况,服务器的压力情况,对服务器的并发有很好的直观反映:尤其是并发量ESTAB:或者是syn_recv值,假 ...
- 小程序中navigator和wx.navigateTo,wx.redirectTo,wx.reLaunch,wx.switchTab,wx.navigateBack的用法
如果用一句话来表明navigator和API中wx.系列的跳转有什么区别,那就是navigator是在wxml中用标签添加open-type属性来达到和wx.系列一样的效果. navigator的属性 ...
- linux下pip安装pygame
在学习python的过程中要用到pygame,在安装过程中遇到一些问题,经百度解决.因为使用的版本为python3,故以下教程针对python3版本.安装教程如下: 一.首先你要确保你已经安装了pip ...
- DS作业·写了一个链表
用struct手写了个list 有push_back,push_front,insert,erase reserve,size,setpos,rbegin 功能. 坑:一开始想用template< ...
- element 表格元素 超链接
1.在循环体中的事件绑定 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- Django实现微电影网站
主要实现功能: 注册,登陆,播放视频,评论视频,xadmin实现后台提供视频管理,权限管理等等 首页(搜索,筛选) 搜索页面 播放页面 个人中心 后台 源码下载 环境配置:python2.7 pip ...