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 ...
随机推荐
- Java学习笔记-抽象类与接口
抽象类用于在类中不用具体实现,而在子类中去实现的类 抽象类 抽象类概述 抽象定义:抽象就是从多个事物中将共性的,本质的内容抽取出来 抽象类:Java中可以定义没有方法体的方法,该方法的具体实现由子类完 ...
- 最新 东方明珠java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.东方明珠等10家互联网公司的校招Offer,因为某些自身原因最终选择了东方明珠.6.7月主要是做系统复习.项目复盘.Leet ...
- 简单深入Joomla!3.1.5模块_组件开发(一)
简单深入Joomla!3.1.5模块_组件开发 主要内容: 1, 模块(访问数据库,链接到组件,数据基本流向) 2, 组件CRUD(MVC模式,访问数据库,表单提交,AJAX提交,数据基本流向) 3, ...
- 前端手势控制图片插件书写二(transform矩阵的原理)
上次解释了如何使用代码识别双指和单指操作及放大和旋转拖动操作.这次解释下css3的transform原理 一.transform矩阵原理 transform: matrix(a,b,c,d,e,f) ...
- ztree根据ztreeId【节点id】设置展开、选中、触发点击节点事件
有时候我们要默认选中某个节点,根据ztreeId // 这里的ztreeId就是ztree存放在页面的元素id,比如div的id // treeObj就是ztree对象 var treeObj = $ ...
- elasticsearch安装ik
https://github.com/medcl/elasticsearch-analysis-ik/releases下载对应的ik plugins/目录下创建analysis-ik,再将上述中的zi ...
- windows10下无U盘安装ubuntu18 使用EasyUEFI(一点点体会)
一.看BIOS 先看看自己电脑的是哪种启动模式 win+R 输入 msinfo32 查看自己电脑是哪种 (UEFI还是Legacy BIOS启动模式) 查看完之后 如果是UEFI的话 go on ...
- 【转载】SpringBoot-配置发送邮件遇到的一些问题
前言:前一天调用163邮箱发送邮件还么有问题,今天再调用就各种发送不成功,害的我都关闭授权,还花了一毛钱短信费重新开启授权,最后百度到了一篇文章,非常贴切,在此转载下. 本人遇到的错误代码是554,邮 ...
- 【第一季】CH07_FPGA_RunLED创建VIVADO工程实验
[第一季]CH07_FPGA_RunLED创建VIVADO工程实验 7.1 硬件图片 先来熟悉一下开发板的硬件:LED部分及按钮部分 7.2 硬件原理图 PIN脚定义(讲解以MIZ702讲解,MIZ7 ...
- 怎样查看Redis的版本号
Q: 怎样查看Redis版本 A: 下面两条命令都可以查看redis 版本: redis-server --version redis-server -v