分治线段树,其实就是将标记永久化,到最后再统一下传所有标记。

至于先后顺序,可以给每个节点开一个时间戳。

一般地,分治线段树用于离线,只查询一次答案的题目。

本题中,标记要被下传 222 次。

Code:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 100000 + 10;
int n,m, tag[maxn << 2], lazy[maxn << 2], siz[maxn], root[maxn], p[maxn], tag_root[maxn], ans[maxn];
int find(int x){ return p[x] == x ? x : p[x] = find(p[x]); }
struct Segment_Tree
{
# define lson (o << 1)
# define rson (o << 1)|1
void update(int l, int r, int L, int R, int col, int times, int o)
{
if(l > r || r < L || l > R) return ;
if(l >= L && r <= R)
{
lazy[o] = col, tag[o] = times;
return;
}
int mid = (l + r) >> 1;
update(l, mid, L, R,col, times, lson);
update(mid + 1, r, L, R, col , times, rson);
}
inline void pushdown(int o)
{
if(tag[o] > tag[lson])
lazy[lson] = lazy[o], tag[lson] = tag[o];
if(tag[o] > tag[rson])
lazy[rson] = lazy[o], tag[rson] = tag[o];
}
void release(int o, int l, int r)
{
if(l > r) return ;
if(l == r)
{
int x = find(l);
if(tag_root[x] > tag[o])
ans[l] = root[x];
else
ans[l] = lazy[o], tag_root[x] = tag[o], root[x] = lazy[o];
return ;
}
int mid = (l + r) >> 1;
pushdown(o);
release(lson, l, mid);
release(rson, mid + 1, r);
}
}T;
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= n; ++i)
{
int c; scanf("%d",&c);
p[i] = i, root[i] = c, siz[i] = 1, tag_root[i] = 1;
}
for(int i = 2;i <= m + 1; ++i)
{
int opt, l, r, x;
scanf("%d%d%d%d",&opt,&l,&r,&x);
switch(opt)
{
case 1:
T.update(1, n, l, r, x, i, 1);
break;
case 2:
int a = find(l), b = find(r);
root[b] = x, tag_root[b] = i;
if(a != b) { p[a] = b, siz[b] += siz[a]; }
break;
}
}
T.release(1, 1, n);
T.release(1, 1, n);
for(int i = 1;i <= n; ++i) printf("%d ",ans[i]);
printf("\n");
for(int i = 1;i <= n; ++i)
{
int x = find(i);
printf("%d ",siz[x] - 1);
}
return 0;
}

洛谷T44252 线索_分治线段树_思维题的更多相关文章

  1. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

  2. 洛谷P4891 序列(势能线段树)

    洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...

  3. 洛谷P3899 [湖南集训]谈笑风生(线段树合并)

    题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空 ...

  4. 洛谷 P2147 [SDOI2008]洞穴勘测 (线段树分治)

    题目链接 题解 早就想写线段树分治的题了. 对于每条边,它存在于一段时间 我们按时间来搞 我们可把一条边看做一条线段 我们可以模拟线段树操作,不断分治下去 把覆盖\(l-r\)这段时间的线段筛选出来, ...

  5. 洛谷P3372 【模板】线段树 1

    P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...

  6. bzoj3064/洛谷P4314 CPU监控【线段树】

    好,长草博客被催更了[?] 我感觉这题完全可以当作线段树3 线段树2考加法和乘法标记的下放顺序,这道题更丧心病狂[?] 很多人可能跟我一样,刚看到这道题秒出思路:打一个当前最大值一个历史最大值不就完事 ...

  7. 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)

    To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...

  8. 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块

    !!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...

  9. Bzoj5294/洛谷P4428 [Bjoi2018]二进制(线段树)

    题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接 ...

随机推荐

  1. Nginx部署静态资源(及root与alias区别)

    root目录与alias目录的区别Nginx路径location配置中,使用root目录与alias目录的区别 1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是 ...

  2. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)-转帖篇

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  3. 铁大FaceBook的使用体验

    铁大FaceBook是一个类似QQ和微信等聊天程序的缩小版网站,并且其针对领域较为狭窄:即只针对校园的学生和导员等人员.但其有值得推广的潜力性和可能性. 对于使用它的体验:第一点我感觉这个网站的界面很 ...

  4. Guava 是个风火轮之基础工具 (1)

    转自:http://www.jamespan.me/blog/2015/02/08/guava-basic-utilities-1/ Guava 是个风火轮之基础工具 (1) 前言 Guava 是 J ...

  5. nlogn求逆序对&&陌上花开

    前置: nlogn逆序对: 前一个小时我还真的不会这个Orz 这里运用归并排序的思想. 对于一个序列,我们把它先分开,再合并成一个有序序列. 引自https://blog.csdn.net/qq_30 ...

  6. Oracle与Mysql内嵌游标的使用示例

    Oracle 游标用For循环比较简单,Mysql也是最近才开始用,感觉稍微麻烦一点,下边直接上代码: ------------------------------------------------ ...

  7. [剑指offer] 49. 丑数

    通俗易懂的解释: 首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那 ...

  8. 00073_Math类

    1.Math类概述 (1)Math 类是包含用于执行基本数学运算的方法的数学工具类,如初等指数.对数.平方根和三角函数: (2)类似这样的工具类 ,其所有方法均为静态方法,并且一般不会创建对象.如Sy ...

  9. CF786A - Berzerk

    /* CF786A - Berzerk http://codeforces.com/contest/786/problem/A 博弈论 直接搜出NP状态图.记得要记忆化剪枝. * */ #includ ...

  10. [using_microsoft_infopath_2010]Chapter 11 创建审批流程

    本章概要: 1.为审批者创建一个简单的界面 2.设置表单加载规则切换视图 3.创建多审批小结表单 4.为已经完成的表单创建只读视图 5.创建工作流为每个审批阶段发送EMAIL