ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作:
- 单点修改
1 pos val
- 询问子区间中某个值域的数的个数,连续的相同数字只记为一个。(即统计数字段的个数)
2 L R x y
数据范围:
1 ≤ n,m ≤ 2×10^5
1 ≤ a[i] ≤ n
解题思路:
- 连续重复的数字只记一次。所以考虑将每个数字段除第一个出现外的数字都删去(记为0)。在读入操作的时候暴力模拟,同时维护一个新序列,把原序列的连续重复数字在新序列都记为0。
- 询问在位置上和值域上都是可作差的。所以将原询问拆分为4个关于(t, pos, val)的子询问
- 将初值也转换为修改操作
- 转化成了一个带修改的二维偏序问题;算上时间序就是一个三维偏序
细节:
- 在修改a[i]时要分别考虑删除原数与添加新数对a[i - 1]和a[i + 1]的影响。删除和添加分开讨论会比较方便
if (pos != n && a[pos] == a[pos + 1])
A[cnt++] = (ACT) {i, pos + 1, a[pos], 1, 1, 0};
if (pos == 1 || a[pos] != a[pos - 1])
A[cnt++] = (ACT) {i, pos, a[pos], 1, -1, 0};
a[pos] = val;
if (pos != n && val == a[pos + 1])
A[cnt++] = (ACT) {i, pos + 1, val, 1, -1, 0};
if (pos == 1 || val != a[pos - 1])
A[cnt++] = (ACT) {i, pos, val, 1, 1, 0};
- 要特判每个询问的最左端点,如果是0,且会对答案有影响,(在值域范围内)要给答案+1
ans[Q] = (l == 1 || a[l] != a[l - 1]) ? 0 : 1;
if (a[l] < x || a[l] > y) ans[Q] = 0; //无需修正
- 分治时,右半边的修改操作不需要再应用(其对右半边的查询已经被统计,对左半边的查询无影响,)
- 写分治的题时有几个不错的调试输出点,可以很快地找到错误:
- 树状数组的修改、查询函数开头处
- 查询操作的统计答案处
- 递归头部输出L、R,确定函数调用的状态
CDQ真的快。考场上队友用树套树,手写Treap + 读优还是被卡常,事后CDQ分治连cin都不用改就过了·_·!
AC代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 2e5 + 1;
int cnt, ans[maxn], Q, a[maxn], n, sym[maxn << 3];
int _v[maxn];
struct ACT {
int t, pos, val, opt, pls, id;
bool operator<(ACT &rhs) const {
return t < rhs.t || (t == rhs.t && \
(pos < rhs.pos || (pos == rhs.pos && \
(val < rhs.val || (val == rhs.val && \
opt < rhs.opt)))));
}
}A[maxn << 3], T[maxn << 3];
int lowbit(int x) {
return x & (-x);
}
void add(int x, int v) {
if (x == 0)
return;
//printf("add: %d, %d\n", x, v);
while (x <= n) {
_v[x] += v;
x += lowbit(x);
}
}
int query(int x) {
int ret = 0;
while (x) {
ret += _v[x];
x -= lowbit(x);
}
return ret;
}
void read() { //(A) {t, pos, val, opt, pls, id}
int m, i, l, r, x, y, opt, pos, val;
cin>>n>>m;
for (i = 0; i < n; ++i) {
cin>>a[i + 1];
if (a[i + 1] != a[i])
A[cnt++] = (ACT) {-1, i + 1, a[i + 1], 1, 1, 0};
}
for (i = 0; i < m; ++i) {
cin>>opt;
if (opt == 1) {
cin>>pos>>val;
if (pos != n && a[pos] == a[pos + 1])
A[cnt++] = (ACT) {i, pos + 1, a[pos], 1, 1, 0};
if (pos == 1 || a[pos] != a[pos - 1])
A[cnt++] = (ACT) {i, pos, a[pos], 1, -1, 0};
a[pos] = val;
if (pos != n && val == a[pos + 1])
A[cnt++] = (ACT) {i, pos + 1, val, 1, -1, 0};
if (pos == 1 || val != a[pos - 1])
A[cnt++] = (ACT) {i, pos, val, 1, 1, 0};
} else {
cin>>l>>r>>x>>y;
ans[Q] = (l == 1 || a[l] != a[l - 1]) ? 0 : 1;
if (a[l] < x || a[l] > y)
ans[Q] = 0;
A[cnt++] = (ACT) {i, r, y, 2, 1, Q};
A[cnt++] = (ACT) {i, r, x - 1, 2, -1, Q};
A[cnt++] = (ACT) {i, l - 1, y, 2, -1, Q};
A[cnt++] = (ACT) {i, l - 1, x - 1, 2, 1, Q++};
}
}
sort(A, A + cnt);
}
void mrdge(int l, int r, ACT* T) {
if (r - l <= 1) return;
int mid = l + (r - l) / 2, p = l, q = mid, tot = 0;
//printf("###l = %d, r = %d\n", l, r);
mrdge(l, mid, T); mrdge(mid, r , T);
//printf("***l = %d, r = %d\n", l, r);
if (query(n) != 0)
cout<<"! BIT = "<<query(n)<<endl;
while (p < mid || q < r) {
if (q >= r || (p < mid && (A[p].pos < A[q].pos || (A[p].pos == A[q].pos && \
(A[p].val < A[q].val || (A[p].val == A[q].val && \
A[p].opt < A[q].opt)))))) {
if (A[p].opt == 1) {
add(A[p].val, A[p].pls);
sym[tot] = 1;
}
T[tot++] = A[p++];
}
else {
if (A[q].opt == 2) {
ans[A[q].id] += query(A[q].val) * A[q].pls;
//printf("querying[%d]...ans[%d] = %d\n", A[q].val, A[q].id, ans[A[q].id]);
}
T[tot++] = A[q++];
}
}
for (int i = 0; i < tot; ++i) {
if (T[i].opt == 1 && sym[i]) {
add(T[i].val, -T[i].pls);
sym[i] = 0;
}
A[l + i] = T[i];
}
return;
}
void print() {
for (int i = 0; i < Q; ++i)
cout<<ans[i]<<endl;
return;
}
signed main(){
read();
mrdge(0, cnt, T);
print();
return 0;
}
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval的更多相关文章
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...
- ICPC 2019 徐州网络赛
ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...
- 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)
题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...
- Magic Master(2019年南昌网络赛E题+约瑟夫环)
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时你有\(n\)张牌(按顺序摆放),每一次操作你将顶端的牌拿出,然后按顺序将上面的\(m\)张牌放到底部. 思路 首先我们发下拿走\(1\ ...
- 2019 ICPC南昌网络赛 B题
英雄灭火问题忽略了一点丫 一个超级源点的事情,需要考虑周全丫 2 #include<cstdio> #include<cstring> #include<queue> ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 K题 center
You are given a point set with nn points on the 2D-plane, your task is to find the smallest number o ...
- 2019 ICPC南京站网络赛 H题 Holy Grail(BF算法最短路)
计蒜客题目链接:https://nanti.jisuanke.com/t/41305 给定的起点是S,终点是T,反向跑一下就可以了,注意判负环以及每次查询需要添加边 AC代码: #include< ...
- 2014 ACM/ICPC 鞍山赛区网络赛(清华命题)
为迎接10月17号清华命题的鞍山现场赛 杭电上的题目 Biconnected(hdu4997) 状态压缩DP Rotate(hdu4998) 相对任一点的旋转 Overt(hdu4999 ...
随机推荐
- Spring-Boot的第三方类库的依赖版本调整方法
springboot方式构建的工程,是dependencyManagement方式进行依赖包的版本管理, spring中有默认的版本,可以修改ext参数来调整版本 如下SpringBoot-2.2.x ...
- Python获取 东方财富 7x24小时全球快讯
本文使用的IDE为PyCharm. 1.第三方库 (1)selenium selenium用来做浏览器自动化,因为这部分信息是动态加载的,不用这种方法读取不到相关数据. 安装: pip3 instal ...
- NDK学习笔记-JNI的异常处理与缓存策略
在使用JNI的时候,可能会产生异常,此时就需要对异常进行处理 异常处理 JNI抛出Throwable异常,在Java层可以用Throwable捕捉 而在C只有清空异常这种处理 但如果在JNI中通过Th ...
- 破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9
如果图片无法观看,请移步 https://blog.csdn.net/hihell 周三了,一个星期最难的一天 大中间的,今天还这么热 5月份,36度的高温 天空飘过几个字 屋里学pandas最得劲 ...
- Ajax方式上传文件报错"Uncaught TypeError: Illegal invocation"
今天使用ajax上传文件时,出现了错误.数据传输的方式是通过定义formData完成的,提交的文件对象也设置为dom对象,但是还是不能发送请求.F12看到后台报了个错误:Uncaught TypeEr ...
- java中public protected friendly private作用域
1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直 ...
- ffmpeg解码音视频过程(附代码)
0. 引言 最近一直在使用和学习ffmpeg. 工作中需要拉流解码, 获取音频和视频数据. 这些都是使用ffmpeg处理. 因为对ffmpeg接触不多, 用的不深, 在使用的过程中经常遇到不太懂的地方 ...
- 微信小程序 路由跳转 异步请求 存储数据,微信登录接口
1小程序路由跳转 wx.switchTab(Object object) 这里的tabBar是底下的导航栏指定的页面 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 tabBar l ...
- X86驱动:挂接SSDT内核钩子
SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用 ...
- javascript 的惯性运动
移动端的惯性运动,最早来自 ios 的专利.用于手指滑动,离开屏幕之后,屏幕内容继续滚动.更有动态感. 这里,以 pc 端,鼠标横向(沿x轴) 拖拽的,惯性计算.移动端同理 具体代码如下: <! ...