Mass Change Queries Codeforces - 911G】的更多相关文章

https://codeforces.com/contest/911/problem/G 没想到线段树合并还能这么搞.. 对每个权值建一个线段树(动态开点),如果权值为k的线段树上第i位为1,那么表示a[i]=k:如果权值为k的线段树上第i位为0,表示a[i]≠k 改变权值的时候,就是把[l,r]分解成多个线段树上的区间:对于每个分解出的区间,分别在权值为x的线段树上和权值为y的线段树上找到对应的节点,设某个区间找到的节点为a,b,则把b子树合并到a上 注意!要特判x==y时跳过操作 最后枚举一…
链接 大意: 给定序列, 每次操作将区间[l,r]中的x全改为y, 最后输出序列 权值范围比较小, 对每个权值开一颗线段树, 每次将x合并到y上即可 #include <iostream> #include <algorithm> #include <cstdio> #define REP(i,a,n) for(int i=a;i<=n;++i) #define mid (l+r>>1) #define lc (o<<1) #define…
题意翻译 给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列. 输入输出格式 输入格式: The first line contains one integer n n n ( 1<=n<=200000 1<=n<=200000 1<=n<=200000 ) — the size of array a a a . The second line contains n n n integers a1 a_{1} a1​ , a2…
题目大意: 给你一个长度为n的数列a,按顺序进行以下m次操作,每次将区间[l,r]中的所有x变成y,问最后数列是怎样的. 思路: 线段树. 每个线段树结点上维护当前区间每个数分别会变成多少.时间复杂度O(m log n).然而比别人Ofast+循环展开+特定指令集的O(nm)暴力还慢. #include<cstdio> #include<cctype> #include<algorithm> inline int getint() { register char ch;…
cf机子真的快. 其实这个题的维护的信息还是很巧妙的. 首先,观察到题目中涉及到,区间修改这个操作,然后最后只查询一次,我们不妨用线段树来维护这个过程. 但是貌似直接维护每个位置的值可能不太好维护. 这时候我们考虑 每一个节点维护一个\(to\)数组,其中\(to[i]\)表示这个节点对应的区间里面,\(i\)这个值将会变成哪个值. 一开始,每个节点的\(to[i]=i\) 由于最后是单点询问,所以不用\(up\)操作. 现在考虑\(pushdown\)应该怎么写. 对于当前节点的\(to[i]…
797E - Array Queries 思路: 分段处理: 当k小于根号n时记忆化搜索: 否则暴力: 来,上代码: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 100005 ],size; inline void in(int &am…
http://codeforces.com/problemset/problem/375/D 树莫队就是把树用dfs序变成线性的数组. (原数组要根据dfs的顺序来变化) 然后和莫队一样的区间询问. 这题和普通莫队有点区别,他需要的不单单是统计区间元素种类个数,是区间元素种类个数 >= k[i]的个数. 考虑最简单的用bit维护,复杂度多了个log 观察到每次只需要 + 1  或者 -1 用一个数组sum[k]表示种类数大于等于k的ans 在numc[val]++之后,sum[numc[val]…
题目链接 非常好的一道题目, 分析,如果用暴力的话,时间复杂度是O(q*n)稳稳的超时 如果用二维DP的话,需要O (n*n)的空间复杂度,会爆空间. 那么分析一下,如果k>sqrt(n)的话,不需要sqrt(n) 次就可以达到大于n 而如果k<sqrt(n)的情况下,不妨用DP来处理,时间复杂度和空间复杂度皆为O ( n*sqrt( n ) ) 那么都可以分类处理了. 详细见code #include <iostream> #include <cstdio> #inc…
题面: 刚开始想复杂了, 还以为是个笛卡尔树.... 实际上我们发现, 对于询问(l,r)每个点的贡献是$min(r,R[i])-max(l,L[i])+1$ 数据范围比较大在线树套树的话明显过不了, 还是想离线的算法好了, 只考虑求$\sum min(r,R[i])$, 对于$\sum max(l,L[i])$同理 将询问按$l$从大到小排, 将点$x$的贡献转化为$[x,R[x]-1]$区间加等差, $[R[x],n]$区间加$R[x]$, 这样$\sum min(r,R[i])$就变成对位…
模拟题 开一个容器进行模拟即可,注意容器设置初始大小不然容易re.设置两个指针l,r.把容器当作桶,每一个桶都有一个编号表示位置,左边进入那么就是编号为l,右边一样.然后l--或者r++,l=r=0的初始值,第一个元素为0,然后同时l--,r++ 代码(cf上题解的算法) #include <bits/stdc++.h> using namespace std; main() { int n; cin>>n; deque<int> vec(300000); int l=…