ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作:

  1. 单点修改

    1 pos val
  2. 询问子区间中某个值域的数的个数,连续的相同数字只记为一个。(即统计数字段的个数)

    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; //无需修正
  • 分治时,右半边的修改操作不需要再应用(其对右半边的查询已经被统计,对左半边的查询无影响,)
  • 写分治的题时有几个不错的调试输出点,可以很快地找到错误:
    1. 树状数组的修改、查询函数开头处
    2. 查询操作的统计答案处
    3. 递归头部输出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的更多相关文章

  1. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

  2. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  3. ICPC 2019 徐州网络赛

    ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...

  4. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

  5. Magic Master(2019年南昌网络赛E题+约瑟夫环)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时你有\(n\)张牌(按顺序摆放),每一次操作你将顶端的牌拿出,然后按顺序将上面的\(m\)张牌放到底部. 思路 首先我们发下拿走\(1\ ...

  6. 2019 ICPC南昌网络赛 B题

    英雄灭火问题忽略了一点丫 一个超级源点的事情,需要考虑周全丫 2 #include<cstdio> #include<cstring> #include<queue> ...

  7. 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 ...

  8. 2019 ICPC南京站网络赛 H题 Holy Grail(BF算法最短路)

    计蒜客题目链接:https://nanti.jisuanke.com/t/41305 给定的起点是S,终点是T,反向跑一下就可以了,注意判负环以及每次查询需要添加边 AC代码: #include< ...

  9. 2014 ACM/ICPC 鞍山赛区网络赛(清华命题)

    为迎接10月17号清华命题的鞍山现场赛 杭电上的题目 Biconnected(hdu4997)     状态压缩DP Rotate(hdu4998)    相对任一点的旋转 Overt(hdu4999 ...

随机推荐

  1. GitHub快速搭建个人博客

    > 正所谓前人栽树,后人乘凉.> > 感谢[Huxpro](https://github.com/huxpro)提供的博客模板> > [我的的博客](https://fl ...

  2. [CF132C] Logo Turtle

    [CF132C] Logo Turtle , Luogu A turtle moves following by logos.(length is \(N\)) \(F\) means "m ...

  3. Centos7下永久修改mysql5.6最大连接数

    由于解除系统限制,设置最大连接数时,量力而行.https://blog.csdn.net/five3/article/details/79671317

  4. Docker 常用命令和Dockerfile

    Docker 简介 官方的解释为:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现 ...

  5. shell习题第11题:输入数字执行命令

    [题目要求] 写一个脚本实现如下功能:输入一个数字,然后运行对应的一个命令 显示命令如下: *cmd menu* 1--data  2--ls 3--who 4--pwd 输入1时,会运行data [ ...

  6. react开发vscode插件推荐

    原文地址:https://github.com/xieqingtian/blog/issues/2 由于本人主要是做react开发,用的代码编辑器是传说中的宇宙第一前端神器vscode, 所以在这里记 ...

  7. Django rest-framework框架-认证组件的简单实例

    第一版 : 自己写函数实现用户认证 #models from django.db import models #用户表 class UserInfo(models.Model): user_type_ ...

  8. [转载]AdaBoost算法

    [转载]AdaBoost算法 原文:https://blog.csdn.net/v_july_v/article/details/40718799 这里就不转载了,到原文看吧.但是有几点可以注意下: ...

  9. 关于SpringBoot的自动配置和启动过程

    一.简介 Spring Boot简化了Spring应用的开发,采用约定大于配置的思想,去繁从简,很方便就能构建一个独立的.产品级别的应用. 1.传统J2EE开发的缺点 开发笨重.配置繁多复杂.开发效率 ...

  10. SSM框架警告/错误集合

    警告: 1.使用Eclipse的Spring Elements组件的时候发现会提示有警告:Expect at least one bean match() 解决办法:项目可以正常运行,未有报错,在其他 ...