题目链接

题面

题意

把每个位置的点都看成是一个二维坐标系中的点。比如第\(i\)个点就是\((i,a[i])\)。

有两种操作

询问:然后每次询问的就是与当前点坐标的曼哈顿距离小于等于\(k\)的点。

修改:修改第i个点的纵坐标。保留历史点。

思路

旋转坐标系。然后就变成了添加一个点和询问一个子矩阵内点的个数。用\(CDQ\)分治或者其他数据结构做就行了

代码

/*
* @Author: wxyww
* @Date: 2019-02-15 08:38:47
* @Last Modified time: 2019-02-15 10:16:11
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 4000010,M = 3000003,BL = 1000000;
#define pi pair<int,int>
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
struct node {
int x,y,opt,pos,val;
}a[M];
char s[10];
int tt[N],tot;
int tree[M],mx,ans[N];
vector<pi>v;
void update(int pos,int c) {
while(pos <= BL*3) {
tree[pos] += c;
pos += pos & -pos;
}
}
int query(int pos) {
int ret = 0;
while(pos) {
ret += tree[pos];
pos -= pos & -pos;
}
return ret;
}
node tmp[N];
void cdq(int l,int r) {
if(r <= l) return;
int mid = (l + r) >> 1;
cdq(l,mid);cdq(mid + 1,r);
int now = l,L = l,R = mid + 1;
while(L <= mid && R <= r) {
if(a[L].x <= a[R].x) {
if(a[L].opt == 1) {
update(a[L].y,a[L].val);
v.push_back(make_pair(a[L].y,a[L].val));
}
tmp[now++] = a[L++];
}
else {
if(a[R].opt == 2) ans[a[R].pos] += query(a[R].y);
else if(a[R].opt == 3) ans[a[R].pos] -= query(a[R].y);
tmp[now++] = a[R++];
}
}
while(L <= mid) tmp[now++] = a[L++];
while(R <= r) {
if(a[R].opt == 2) ans[a[R].pos] += query(a[R].y);
else if(a[R].opt == 3) ans[a[R].pos] -= query(a[R].y);
tmp[now++] = a[R++];
}
for(int i = l;i <= r;++i) a[i] = tmp[i];
int k = v.size();
for(int i = 0;i < k;++i) update(v[i].first,-v[i].second);
v.clear();
}
int main() {
int n = read(),Q = read(),now = 0;
for(int i = 1;i <= n;++i) {
tt[i] = read();
a[++tot].x = i + tt[i],a[tot].y = i - tt[i] + BL;
a[tot].opt = 1;a[tot].val = 1;
mx = max(mx,max(a[tot].x,a[tot].y));
}
for(int i = 1;i <= Q;++i) {
scanf("%s",s + 1);
int x = read(),y = read();
if(s[1] == 'Q') {
int x1 = x + tt[x] - y,x2 = x + tt[x] + y,y1 = x - tt[x] + BL - y,y2 = x - tt[x] + BL + y;
a[++tot].pos = ++now;a[tot].x = x2;a[tot].y = y2;a[tot].opt = 2;
a[++tot].pos = now;a[tot].x = x1 - 1;a[tot].y = y1 - 1;a[tot].opt = 2;
a[++tot].pos = now;a[tot].x = x1 - 1;a[tot].y = y2;a[tot].opt = 3;
a[++tot].pos = now;a[tot].x = x2;a[tot].y = y1 - 1;a[tot].opt = 3;
}
else {tt[x] = y;
a[++tot].opt = 1;
a[tot].x = x + tt[x];a[tot].y = x - tt[x] + BL;a[tot].val = 1;
mx = max(mx,max(a[tot].x,a[tot].y));
}
} cdq(1,tot);
for(int i = 1;i <= now;++i) printf("%d\n",ans[i]);
return 0;
}

bzoj4170 极光的更多相关文章

  1. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  2. BZOJ4170:极光(CDQ分治)

    Description "若是万一琪露诺(俗称rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她.对方表现出兴趣的话,那就慢慢地反问.在她考虑答案的时候,趁机逃吧.就算是很简单的问题,她 ...

  3. BZOJ4170:极光

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

  4. 使用极光推送(www.jpush.cn)向安卓手机推送消息【服务端向客户端主送推送】C#语言

    在VisualStudio2010中新建网站JPushAndroid.添加引用json帮助类库Newtonsoft.Json.dll. 在web.config增加appkey和mastersecret ...

  5. 使用极光/友盟推送,APP进程杀死后为什么收不到推送(转)

    为什么会存在这样的 问题,刚开始的时候我也搞不清楚,之前用极光的时候杀死程序后也会收到推送,但最近重新再去集成时就完全不好使了,这我就纳闷了,虽然Google在高版本上的android上面不建议线程守 ...

  6. 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)

    这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...

  7. 极光推送-适配 iOS10

    //************************ iOS10 适配 **************************// //************************ 11/02/20 ...

  8. iOS推送(利用极光推送)

    本文主要是基于极光推送的SDK封装的一个快速集成极光推送的类的封装(不喜勿喷) (1)首先说一下推送的一些原理: Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指 ...

  9. 极光推送JPush的快速集成

    首先到极光推送的官网上创建一个应用,填写对应的应用名和包名. 创建好之后下载Demo 提取Sdk里面的图片和xml等资源文件放自己项目的相应位置,然后要注意的是.so文件的放置位置: 在main目录下 ...

随机推荐

  1. ASP.MVC学习资源总结

    自己动手写一个简单的MVC框架(第一版) 自己动手写一个简单的MVC框架(第二版) ASP.Net请求处理机制初步探索之旅 - Part 1 前奏 ASP.Net请求处理机制初步探索之旅 - Part ...

  2. MS SQL自定义函数IsPositiveInteger

    判断字符串是否为正整数,0开始的的数字不算. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION [dbo].[svf_I ...

  3. NSTimer 不工作 不调用方法

    比如,定义一个NSTimer来隔一会调用某个方法,但这时你在拖动textVIew不放手,主线程就被占用了.timer的监听方法就不调用,直到你松手,这时把timer加到 runloop里,就相当于告诉 ...

  4. SQLServer之创建全文索引

    创建全文索引的必须条件 必须具有全文目录,然后才能创建全文索引. 目录是包含一个或多个全文索引的虚拟容器. 使用SSMS数据库管理工具创建全文索引 1.连接数据库,选择数据库,选择数据表->右键 ...

  5. ABAP 7.53 中的ABAP SQL(原Open SQL)新特性

    S/4 HANA 1809 已经在上月发布,随之而来的是ABAP 7.53. 本文是更新文档中ABAP SQL的部分的翻译. 本次更新的内容较多,主要内容包括:Open SQL更名为ABAP SQL: ...

  6. CSS---内外边距

    1.内外边距含义 内边距是div边框内的距离.背景色会覆盖内边距,内边距会使宽高变大. 外边距是div边框外的距离.背景色不会覆盖外边距 内外边距都会撑高父元素,外边距会提高div与div之间的距离 ...

  7. PostgreSQL:Java使用CopyManager实现客户端文件COPY导入

    在MySQL中,可以使用LOAD DATA INFILE和LOAD DATA LOCAL INFILE两种方式导入文本文件中的数据到数据库表中,速度非常快.其中LOAD DATA INFILE使用的文 ...

  8. find mtime参数+号,-号,不带符号的用法

     find . -mtime +0 -type f -name "oms*" | xargs rm -f 删除24小时以前 oms格式的文件     #按文件更改时间来查找文件,- ...

  9. SQL其他常用的语句

    阅读目录 一:汇总数据 1.理解AVG函数 2.理解COUNT()函数 3.理解max()函数 4.理解min()函数 5.理解sum()函数 二:分组数据 1 创建分组(group by) 2 HA ...

  10. 聊聊基准测试的MVP方案

    上篇博客介绍了基准测试的一些思路和方法策略,这篇博客,聊聊基准测试的MVP(最小可行性方案)... 思维导图 一.测试策略 策略名称 阈值 运行时间 性能指标 基线 注释 并发测试 CPU75%+Er ...