牛客 40E 珂朵莉的数论题】的更多相关文章

大意: 给定$x,y$, 求第$x$小的最小素因子为$y$的数, 若答案>1e9输出0. 若$y>=60$, 可以暴力筛出1e9/60以内的答案. 否则容斥+二分算出答案. #include <iostream> #include <sstream> #include <algorithm> #include <cstdio> #include <math.h> #include <set> #include <ma…
珂朵莉给你一个长为n的序列,有m次查询 每次查询给两个数l,r 设s为区间[l,r]内所有数的乘积 求s的约数个数mod 1000000007 直接莫队暴力维护复杂度是$O(8m\sqrt{m})$. 看了官方题解, 序列权值比较小, 权值<1000的素数暴力维护, >1000的素数最多只有1个, 用莫队维护, 这样能优化掉8的常数. #include <iostream> #include <sstream> #include <algorithm> #i…
题目描述 珂朵莉给你一个有根树,求有多少个子树满足其内部节点编号在值域上连续 一些数在值域上连续的意思即其在值域上构成一个连续的区间 输入描述: 第一行有一个整数n,表示树的节点数.接下来n–1行,每行两个整数x,y,表示存在一条从x到y的有向边.输入保证是一棵有根树. 输出描述: 输出一个数表示答案 示例1 输入 5 2 3 2 1 2 4 4 5 输出 5 说明 节点1子树中编号为1,值域连续节点3子树中编号为3,值域连续节点5子树中编号为5,值域连续节点4子树中编号为4,5,值域连续节点2…
珂朵莉的数列 思路: 树状数组+高精度 离散化不知道哪里写错了,一直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…
题目描述 珂朵莉给你一个长为n的序列,有m次查询 每次查询给两个数l,r 设s为区间[l,r]内所有数的乘积 求s的约数个数mod 1000000007 输入描述: 第一行两个正整数n,m第二行一个长为n的序列之后m行每行两个数l和r 输出描述: 对于每个询问,输出一个整数表示答案 示例1 输入 5 5 64 2 18 9 100 1 5 2 4 2 3 1 4 3 4 输出 165 15 9 45 10 备注: 对于100%的数据,有n , m <= 100000 , a[i] <= 100…
Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数 题目描述 给你一个长为n的序列a,有n*(n+1)/2个子区间,问这些子区间里面和为完全平方数的子区间个数 输入描述: 第一行一个数n 第二行n个数表示序列a 输出描述: 输出一个数表示答案 示例1 输入 6 0 1 0 9 1 0 输出 11 备注: 1 <= n <= 100000 0 <= ai <= 10 思路 用前缀和来求任意字段的和 长度为n的序列a[1],a[2], ….,a[n] 有前缀和prefix_s…
[数据结构]ODT(珂朵莉树)实现及其应用,带图 本文只发布于博客园,其他地方若出现本文均是盗版 算法引入 需要一种这样的数据结构,需要支持区间的修改,区间不同值的分别操作. 一般的,我们会想到用线段树或者Splay等支持序列操作的数据结构.但是我们这里讲引入一种更加简单的数据结构. 算法介绍 节点信息 节点定义 ODT的基本节点将保存如下信息. 该节点所代表序列的左右区间 该节点所代码的区间的值 C++代码如下 struct Odt_Node { int l, r; int val; }; 可…
洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\)意义下. 设\(a_i\)表示\(i\)号区间长度: 对于上行列车(\(0\rightarrow n\))设\(p_0\)表示出发时刻,\(p_i(i\ge1)\)表示在\(i\)站停靠时间: 对于下行列车(\(0\leftarrow n\))设\(-q_0\)表示到站时刻,\(q_i(i\ge1…
[洛谷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]\…
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接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<&…
题面 传送门 题解 好吧我是不太会复杂度分析-- 我们对于每种颜色用一个数据结构维护(比方说线段树或者平衡树,代码里写的平衡树),那么区间询问很容易就可以解决了 所以现在的问题是区间修改,如果区间颜色相等直接\(O(\log n)\)修改就好了,否则的话,一个很暴力的思路是把区间分成若干段颜色相等的部分,每一个部分都直接\(O(\log n)\)修改 乍看这样是\(gg\)的,但是我们仔细观察一下,每一次修改的时候只有相邻两段颜色不同的时候会贡献\(O(\log n)\)的复杂度,而初始时段数是…
珂...珂...珂朵莉给你出了一道送分题: 给你一个长为n的序列{vi},和一个数a,你可以从里面选出最多m个数 一个合法的选择的分数定义为选中的这些数的和加上额外规则的加分: 有b个额外的规则,第i个规则即为: 对于这个序列的所有长为a的连续子区间,如果这个子区间中对应的给出的xi个位置都被选中了,则这次选择的分数加上yi(yi可能为负数,这种情况下分数仍然要加上y) 直接暴力枚举子集, 复杂度是$O(3^n+nm2^n)$. #include <iostream> #include <…
题目描述 分析 操作一.二.三为珂朵莉树的基本操作,操作四.五.六稍作转化即可 不会珂朵莉树请移步至这里 求和操作 把每一段区间分别取出,暴力相加 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…
参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵莉树丫~ (挑战用最短的篇幅讲清楚一个毒瘤数据结构) 1.珂朵莉是什么? 珂朵莉·诺塔·瑟尼欧里斯是轻小说及改编动画<末日时在做什么?有没有空?可以来拯救吗?>中的女主角,五位成体妖精兵之一.最强圣剑“瑟尼欧里斯”的适合者.在第28号浮游岛上意外跌落而与威廉相遇,并受到他的帮助. 但是知道了珂朵莉…
传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接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…
传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打……毕竟CCF那机子……) //minamoto #include<iostream> #include<cstdio> #include<set> #include<algorithm> #define IT set<node>::iterator…
中文题面 据说正解是动态开点线段树而且标记也不难下传的样子 然而这种区间推平的题目还是喜欢写珂朵莉树啊……码量小…… 虽然真要构造的话随便卡…… //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这个…
这道题可以用珂朵莉树做,但是由于数据比较不随机,而我也没有手写一颗平衡树,所以就被卡掉了,只拿了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&…
珂朵莉树 珂朵莉树其实不是树,只是一个借助平衡树实现的数据结构,主要是对于有区间赋值的数据结构题,可以用很暴力的代码很高效地完成任务,当然这是建立在数据随机的基础上的. 即使数据不是随机的,写一个珂朵莉树用来当做暴力也是很划算的. 珂朵莉树可以使用std::map来实现,并且代码量极小,不知道为什么大家都要写set. 维护方式 那么问题来了,如何使用\(map\)来实现珂朵莉树呢?众所周知,用\(set\)的实现方式都是维护一个连续的相同区间,\(map\)当然也是同理,我们仍然用\(map\)…
题目链接: 题意:有两个操作 操作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…
正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$easy$?维护下区间内01个数然后翻转就打$tag$,除了有点儿麻烦还是挺$easy$的鸭$QwQ$,顺便强调下顺序?就如果区间覆盖就可以直接把翻转删了,区间翻转的时候不用管覆盖,每次下放先覆盖后翻转,$over$ 说下操作五$QwQ$,就再维护几个东西$QwQ$ 就,维护下区间内最长的连续的1的个数,…
珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Codeforces 896C C. Willem, Chtholly and Seniorious 国外珂学家 滑稽) 前置芝士: set的基本操作 迭代器(跟指针差不多 重载运算符.构造函数的简单了解 mutable(下面也会讲 暴力枚举 常数优化(inline O2 O3 register大法好啊…
https://www.nowcoder.com/acm/contest/38/E 题意: 思路: 树状数组维护.从大佬那里学习了如何处理爆long long的方法. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; +; int n; int a[maxn],b[maxn];…
题意:求所有子区间的逆序数对数之和 题解:树状数组维护,对于每一对逆序数(l,r)属于l*(n-r+1)个区间,计算每一对对结果的贡献即可,可用树状数组维护,sum维护(n-r+1),按逆序数那样操作 这题最狗的地方是爆longlong,java又超时...,用了一个小技巧,避免爆longlong #include<bits/stdc++.h> #define fi first #define se second #define ll long long #define ull unsigne…