洛谷 P5350 序列 珂朵莉树】的更多相关文章

题目描述 分析 操作一.二.三为珂朵莉树的基本操作,操作四.五.六稍作转化即可 不会珂朵莉树请移步至这里 求和操作 把每一段区间分别取出,暴力相加 ll qh(ll l,ll r){ it2=Split(r+1),it1=Split(l); ll ans=0; for(it=it1;it!=it2;it++){ ans=(ans+(it->r-it->l+1)*it->val)%mod; } return ans; } 赋值操作 直接调用\(Assign\)函数将其推平即可 void A…
传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打……毕竟CCF那机子……) //minamoto #include<iostream> #include<cstdio> #include<set> #include<algorithm> #define IT set<node>::iterator…
正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$easy$?维护下区间内01个数然后翻转就打$tag$,除了有点儿麻烦还是挺$easy$的鸭$QwQ$,顺便强调下顺序?就如果区间覆盖就可以直接把翻转删了,区间翻转的时候不用管覆盖,每次下放先覆盖后翻转,$over$ 说下操作五$QwQ$,就再维护几个东西$QwQ$ 就,维护下区间内最长的连续的1的个数,…
洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\)意义下. 设\(a_i\)表示\(i\)号区间长度: 对于上行列车(\(0\rightarrow n\))设\(p_0\)表示出发时刻,\(p_i(i\ge1)\)表示在\(i\)站停靠时间: 对于下行列车(\(0\leftarrow n\))设\(-q_0\)表示到站时刻,\(q_i(i\ge1…
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #include<cstdio> #include<set> #define IT set<node>::iterator using std::set; #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<&…
传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //minamoto #include<iostream> #include<cstdio> #include<set> #define IT set<node>::iterator using std::set; int read(){ #define num ch-'0…
传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include<set> #include<iostream> #include<cstdio> #define ll long long #define IT set<node>::iterator using std::set; #define getc() (p1==p2&am…
参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵莉树丫~ (挑战用最短的篇幅讲清楚一个毒瘤数据结构) 1.珂朵莉是什么? 珂朵莉·诺塔·瑟尼欧里斯是轻小说及改编动画<末日时在做什么?有没有空?可以来拯救吗?>中的女主角,五位成体妖精兵之一.最强圣剑“瑟尼欧里斯”的适合者.在第28号浮游岛上意外跌落而与威廉相遇,并受到他的帮助. 但是知道了珂朵莉…
珂朵莉树 珂朵莉树其实不是树,只是一个借助平衡树实现的数据结构,主要是对于有区间赋值的数据结构题,可以用很暴力的代码很高效地完成任务,当然这是建立在数据随机的基础上的. 即使数据不是随机的,写一个珂朵莉树用来当做暴力也是很划算的. 珂朵莉树可以使用std::map来实现,并且代码量极小,不知道为什么大家都要写set. 维护方式 那么问题来了,如何使用\(map\)来实现珂朵莉树呢?众所周知,用\(set\)的实现方式都是维护一个连续的相同区间,\(map\)当然也是同理,我们仍然用\(map\)…
珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Codeforces 896C C. Willem, Chtholly and Seniorious 国外珂学家 滑稽) 前置芝士: set的基本操作 迭代器(跟指针差不多 重载运算符.构造函数的简单了解 mutable(下面也会讲 暴力枚举 常数优化(inline O2 O3 register大法好啊…
[数据结构]ODT(珂朵莉树)实现及其应用,带图 本文只发布于博客园,其他地方若出现本文均是盗版 算法引入 需要一种这样的数据结构,需要支持区间的修改,区间不同值的分别操作. 一般的,我们会想到用线段树或者Splay等支持序列操作的数据结构.但是我们这里讲引入一种更加简单的数据结构. 算法介绍 节点信息 节点定义 ODT的基本节点将保存如下信息. 该节点所代表序列的左右区间 该节点所代码的区间的值 C++代码如下 struct Odt_Node { int l, r; int val; }; 可…
中文题面 据说正解是动态开点线段树而且标记也不难下传的样子 然而这种区间推平的题目还是喜欢写珂朵莉树啊……码量小…… 虽然真要构造的话随便卡…… //minamoto #include<cstdio> #include<set> #include<iostream> #define IT set<node>::iterator using namespace std; #define getc() (p1==p2&&(p2=(p1=buf)+…
中文题面 珂朵莉树的板子……这篇文章很不错 据说还有奈芙莲树和瑟尼欧里斯树…… 等联赛考完去学一下(逃 //minamoto #include<bits/stdc++.h> #define IT set<node>::iterator #define ll long long using namespace std; ,mod9=1e9+,N=1e5+; ll ksm(ll a,ll b,ll mod){ ll res=;a%=mod; while(b){ ) res=res*a%…
珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......)来实现区间压缩. 那么区间压缩的意义在于区间推平这是珂朵莉树的核心(如果没有这个操作实际上不一定需要这种算法) ps:若保证有连续相等甚至递增的区间,也可以的(吧?). 可想而知它的操作在于对区间的分裂和合并操作 (为什么?因为这样可以方便而快捷的区间推平) 珂朵莉树的实现 在众多树中因为set这个…
题面 传送门 题解 好吧我是不太会复杂度分析-- 我们对于每种颜色用一个数据结构维护(比方说线段树或者平衡树,代码里写的平衡树),那么区间询问很容易就可以解决了 所以现在的问题是区间修改,如果区间颜色相等直接\(O(\log n)\)修改就好了,否则的话,一个很暴力的思路是把区间分成若干段颜色相等的部分,每一个部分都直接\(O(\log n)\)修改 乍看这样是\(gg\)的,但是我们仔细观察一下,每一次修改的时候只有相邻两段颜色不同的时候会贡献\(O(\log n)\)的复杂度,而初始时段数是…
这道题可以用珂朵莉树做,但是由于数据比较不随机,而我也没有手写一颗平衡树,所以就被卡掉了,只拿了70分. 珂朵莉树是一种基于平衡树的(伪)高效数据结构. 它的核心操作是推平一段区间. 简而言之,就是把之前的零零碎碎的都干掉,用一个美而饱满的大区间取代. 然后我们更新操作和查询操作就暴力遍历一遍,统计一下和就可以了. Split操作 inline set<node>::iterator split(int pos){ set<node>::iterator it=s.lower_bo…
问题描述 CF915E LG-CF915E 题解 \(n \le 10^9\) 看上去非常唬人. 但是这种区间操作的题,珂朵莉树随便跑啊. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; template <typename Tp> void read(Tp &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch<'0'||ch>'9…
问题描述 LG4979 题解 珂朵莉树+O2简直就是绝配 对于操作 A ,直接 \(\mathrm{assign}\) 推平就完事了. 对于操作 B ,如果它左右端点有在边界上的,直接把区间 \([l,r]\)撕出来判断就完了,如果不在边界上,先把单点 \({l-1,r+1}\) 撕出来判,如果符合条件,再撕 \([l,r]\) 出来判. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; #define IT set&…
题目链接: 题意:有两个操作 操作1:给出n个操作,将区间为l到r的数字改为x 操作2:给出q个操作,输出进行了操作1中的第x到x+y-1操作后的结果 解法: 把询问离线,按照r从小到大排序 每次询问的时候,用珂朵莉树推平区间 求和,这个我们用树状数组维护即可 树状数组求出>=l的和 #include <bits/stdc++.h> #define IT set<node>::iterator using namespace std; typedef long long ll…
珂朵莉树,又叫老司机树($Old\, Driver \, Tree$) 是一种暴力出奇迹,就怕数据不随机的数据结构. 适用 需要用线段树维护一些区间修改的信息…… 像是区间赋值(主要),区间加…… 原理 暴力还需要原理吗…… 首先通过维护区间及其中的值,使操作次数趋于$\log N$ 其次通过图省事高效的红黑树 set 维护区间保证$\log N$的复杂度. 但是如果出题人毒瘤不讲情理卡珂朵莉树的话那也没办法. 最劣复杂度单次修改$\Theta(N)$ 区间太好看辣(雾 首先有区间$[1,Inf…
关于ODT,据说是毒瘤lxl发明的,然后毒瘤鱼鱼因为我用ODT误导人D了我一回-- 这是一种基于 \(set\) 的暴力数据结构. 在使用时请注意,没看见这2东西千万别用-- 1.保证数据随机 2.有区间推平操作. 这里解释一下区间推平:就是把区间 [l,r] 的值都变为val. 然后就是各种暴力:区间翻转.区间求和.区间k次幂和-- 板子 先看看它能干什么再往下看qwq(当然ODT的操作远不止这些). 首先先讲一下基础:set的定义.对于每个节点用 \((l,r,val)\) 描述(所以为什么…
洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性质,这时候需要冷静想想有没有可利用的地方.蒟蒻一开始往势能线段树上面想了想. 定义一个全局势能函数,为所有\(C_i<B_i\)的位置个数.注意两个操作的修改都不会小于原来的数. 一个是改\(A\),相当于对\(C\)进行区间设置,此时我们每暴力找到一个原来\(C_i<B_i\)但是现在\(C_i…
https://www.cnblogs.com/WAMonster/p/10181214.html 主要用于支持含有较难维护的区间操作与查询的问题,要求其中区间赋值操作(assign())是纯随机的. 注意要先split(r+1)再split(l),最好最后设一个点(n+1,n+1,0) #include<set> #include<cstdio> #include<algorithm> #include<iostream> #define rep(i,l,…
ODT,OldDriverTree,又名ChthollyTree" role="presentation" style="position: relative;">ODT,OldDriverTree,又名ChthollyTreeODT,OldDriverTree,又名ChthollyTree −关键操作推平一段区间" role="presentation" style="position: relative;&…
题意简述 维护一个数列,支持区间加,区间赋值,区间求第k小,区间求幂和 数据随机 题解思路 ODT是一种基于std::set的暴力数据结构. 每个节点对应一段区间,该区间内的数都相等. 核心操作split可以将节点拆开,修改需要的部分. 每个操作都split(r+1),split(l),再遍历其中所有区间,修改或求值. 至于时间复杂度,由assign保证 代码 #include <set> #include <vector> #include <utility> #in…
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<set> #define LL long long using namespace std; ,mod=1e9+; struct node{ int l,r; mutable LL v; node(int L,int R,LL V):l(L),r(R),v(V){} inline…
无聊学了一下珂朵莉树 珂朵莉树好哇,是可以维护区间x次方和查询的高效数据结构. 思想大致就是一个暴力(相对而言)的树形数据结构 lxl毒瘤太强了,发明了ODT算法(Old Driver Tree老司机算法) 这里有一个大佬ACDreamer的题解 附上链接https://www.luogu.org/blog/ACdreamer/solution-cf896c 还有一个B站的讲解视频 附上链接https://www.bilibili.com/video/av21651173 我不会用珂朵莉树,但是…
[洛谷P3987]我永远喜欢珂朵莉~ 题目大意: 给你\(n(n\le10^5)\)个数\(A_{1\sim n}(A_i\le5\times10^5)\),\(m(m\le5\times10^5)\)次操作,操作包含以下两种: 将区间\([l,r]\)间所有\(v\)的倍数除以\(v\). 求区间\([l,r]\)所有数之和. 思路1: 对范围内要用到的每个质因数开一个set维护包含该质因子的\(A_i\)下标. 对于操作\(1\),将\(v\)分解质因数,在set中查找下标在\([l,r]\…
!!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循环后为了防止不能停下来而进行的读入操作删了,你就可以像我一样改半个小时最后发现是这个傻逼错误 并且,如果你按照样例输出,你就可以像我一样成功地获得0分的好成绩因为它其实是要每个输出一行 最后,就算你都改完了,你还可以像我一样莫名其妙得了65分的并且下不了测试点最后无可奈何跑过来写题解 再再继续,如果你不信邪以…
珂朵莉的数列 思路: 树状数组+高精度 离散化不知道哪里写错了,一直wa,最后用二分写的离散化 哪位路过大神可以帮我看看原来的那个离散化错在哪里啊 通过代码: import java.math.BigInteger; import java.util.*; import java.util.Scanner; class node { int x; int id; } class cmp implements Comparator<node> { public int compare(node…