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. 前端HTML介绍,标签介绍,基础选择器,CSS引入方法

    1. HTML 1.1 前端: 所有用户能看到的界面网页.pc端的应用exe.移动端应用app.微信小程序.手环的时间界面html5为基础的前端:网页.app.微信小程序 1.2 前端三剑客: 1.h ...

  2. Awvs–网络漏洞扫描工具

    Awvs漏洞扫描自动化 在WEB安全方面,安全侧使用Acunetix_Web_Vulnerability_Scanner_11.xWEB漏洞扫描工具定期手工对m站和www站进行全站漏洞扫描. 为了防止 ...

  3. 【VS开发】winsock 错误多 windows.h和winsock2.h的顺序

    Windows平台下用C++做网络开发很多时候都会同时包含这两个头文件,如若顺序不当(windows.h先于winsock2.h)就会出现很多莫名其妙的错误.诸如: c:\program files ...

  4. 【Matlab开发】matlab中norm范数以及向量点积、绘图设置相关

    [Matlab开发]matlab中norm范数以及向量点积.绘图设置相关 标签(空格分隔): [Matlab开发] 声明:引用请注明出处http://blog.csdn.net/lg125915677 ...

  5. 洛谷 题解 P2119【魔法阵】

    很好的一道数学推导题 45分做法 \(O(N^4)\) 暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先 ...

  6. poj3977(折半枚举+二分查找)

    题目链接:https://vjudge.net/problem/POJ-3977 题意:给一个大小<=35的集合,找一个非空子集合,使得子集合元素和的绝对值最小,如果有多个这样的集合,找元素个数 ...

  7. js轮播图和bootstrap中的轮播图

    js中的轮播图案例: <!DOCTYPE html><html lang="en"> <head> <meta charset=" ...

  8. Spark Scala当中reduceByKey的用法

    [学习笔记] /*reduceByKey(function)reduceByKey就是对元素为KV对的RDD中Key相同的元素的Value进行function的reduce操作(如前所述),因此,Ke ...

  9. idea启动tomcat时报错:Error during artifact deployment. See server log for details.

    Error during artifact deployment. See server log for details. 这个很多人都找不出来,原因无非2个: 一.jar 包有有些没能识别,tomc ...

  10. 小木棒HDU1455(DFS+剪枝)

    题意:HDU1455 给出n个小木棒的长度,他们是又数根长度相同的木棒剪短得来的,问没剪短之前的木棒长度最短是多少. 思路: 见代码:https://www.cnblogs.com/fqfzs/p/9 ...