值域

luogu P4587 [FJOI2016]神秘数

做~自己de王妃 提交于 2019-12-01 15:11:37
我们 首先考虑暴力如何做。 现在最大的问题就是如何找出这个神秘数 先按升序排序,然后一个一个加数。 假设现在的值域是[1,pos],当前要加入的数是 x ; 不难发现,有两种情况:   若x>pos+1 , 那么一定拼不出pos+1,答案即为pos+1;   若1<= x <= pos+1 , 那么现在的值域就变成了[1,pos+x]; 这是最暴力的方法。。 优化: 考虑一段区间能够做出的贡献。 假设当前的值域为[1,pos],mx为上次用来更新值域时统计到的最大的范围 , 那么现在能做出贡献的一定有[mx+1,pos+1],统计出这段区间的sum。 (mx及之前的就不用统计了啦,因为在上一次更新值域时已经加过了) 现在的值域就变成了[1,pos+sum] , mx就变成了pos+1 ; 若sum==0,则说明[mx+1,pos+1]这段区间里没有数,那么答案就是pos+1啦(因为后面的数一定大于pos+1)。。 额,至于要快速找某段区间的某个范围的和,当然是主席树,然后就木有了。 Code #include<iostream> #include<cstdio> #define N 100010 using namespace std; int n,m,a[N],tot,root[N]; const int INF=1e9; struct Node{ int lc,rc,sum;

BZOJ4403: 序列统计

半世苍凉 提交于 2019-12-01 08:52:23
[ 传送门 ] 一个单调不减的序列,如果在每个位置取的数都加上对应位置的值,这样就是严格单调递增的了。 如果 [1, 1, 2, 2, 3]就会变成 [2, 3, 5, 6, 8] 就相当于在某个值域里取一些不重复的数了,具体这个值域就是[L + 1 , R + n]。 但其实此时跟值域具体的值无关了,只跟值域的长度有关。 值域长度为 $n + R - L$ , 那么取长度为 $n$ 的取法就为 $C ^{n} _{n + R - L}$ 答案为$\sum ^{n} _{i = 1} C _{R - L + i} ^{i}$ 设 $ m = R - L $ $ \sum ^{n} _{i = 0} C _{m + i} ^{i} = C _{m + n + 1} ^{n} $ 所以答案就是 $ C _{m + n + 1} ^ {n} - 1 $ 再用一下Lucas定理就可以了。 #include <bits/stdc++.h> #define ll long long using namespace std; const int MOD = 1e6 + 3; const int N = 1e6 + 7; int fac[N], inv[N]; int qp(int a, int b = MOD - 2) { int ans = 1; while (b) { if (b & 1)

数据冗余

六眼飞鱼酱① 提交于 2019-12-01 07:57:23
1 什么是数据冗余 数据冗余:在一个数据集合中重复的数据称为数据冗余。 例如在设计数据库时,某一字段属于一个表,但它又同时出现在另一个或多个表,且完全等同于它在其本来所属表的意义表示,那么这个字段就是一个冗余字段。 1. 关系数据库中的数据冗余主要是指关系数据库中同一信息数据的重复存贮。 2. 数据冗余浪费了宝贵的资源,应尽量减少。但关系数据库中为实现一些功能有些数据冗余是必需的。必需的数据冗余主要用于以下用途: ①数据间建立联系,如两表间通过共同属性建立联系 ②数据恢复,如建立备份文件以备正式文件被破坏时恢复 ③数据核查,如设立数据校验位可以检查数据在存贮、传输等过程中的改变 ④数据使用的便利,如为了查看数据的直观,使用数据的方便、高效 ⑤减少数据通讯开销,如分布式数据库在不同场地重复 2 数据冗余形成的原因 关系数据库由表及附属文件组成,其表由属性定义的结构和元组(记录)组成,其属性值域有多种类型,故关系数据库的数据冗余形成的原因有表的重复、属性的重复、元组的重复、属性值的重复4类。 2.1 表的重复 为了数据安全的需要制作备份表,当主表被破坏时可用此恢复数据。分布式数据库为减少数据通讯开销也常重复放表,这种数据冗余在这里是必需数据冗余,不能删除。若是因其他原因产生的非必要的重复表则应予以删除。 2.2 属性重复 有不同表的属性重复和同一表内属性重复2种情况: (1)

根式函数

♀尐吖头ヾ 提交于 2019-11-29 20:57:53
前言 典例剖析 例1 函数 \(y=f(x)=x+\sqrt{-x^2+10x-23}\) 的最小值; 法1:原函数可以转化为 \(y=x+\sqrt{2-(x-5)^2}\) , 由于 \(2-(x-5)^2\geqslant 0\) ,得到 \(|x-5|\leqslant \sqrt{2}\) , 令 \(x-5=\sqrt{2}cos\alpha\) ,则 \(\alpha\in [0,\pi]\) ,且 \(x=\sqrt{2}cos\alpha+5\) , 则 \(y=x+\sqrt{2-(x-5)^2}=\sqrt{2}cos\alpha+5+\sqrt{2sin^2\alpha}\) \(=\sqrt{2}cos\alpha+5+\sqrt{2}sin\alpha=2sin(\alpha+\cfrac{\pi}{4})+5\) 由于 \(\alpha\in [0,\pi]\) ,则 \(sin(\alpha+\cfrac{\pi}{4})\in [-\cfrac{\sqrt{2}}{2},1]\) 故 \(y_{min}=5-\sqrt{2}\) , \(y_{max}=7\) , 解后反思:为什么想到法1,请对照上述 例5 中的两个函数, 求函数 \(f(x)=x+\sqrt{1-x^2}\) 的值域; 求函数 \(f(x)=x-\sqrt{2-x^2}\)

学习笔记:可持久化线段树(主席树):静态 + 动态

我们两清 提交于 2019-11-28 21:03:26
学习笔记:可持久化线段树(主席树):静态 + 动态 前置知识: 线段树。线段树分享可以看: @秦淮岸 、 @ZYzzz 、 @妄想の岚がそこに 树状数组。 \(BIT\) 分享可以看: @T-Sherlock 、 Chicago 、 @weishengkun 权值线段树:相当于将线段树当成一个 桶 ,其中的每一个点所代表的区间相当于 一段值域 。维护的值为这段值域中的一些信息。 例如该图,节点 \(2\) 代表的是值域为 \([1, 2]\) 的区间,节点 \(6\) 代表值域为 \([3, 4]\) 的区间... 可持久化概念: 可持久化实质上就是存储该数据结构 所有的历史状态 ,以达到高效的处理某些信息的目的。 静态区间第 \(k\) 小 抛出问题 题目链接 :给定长度为 \(N\) 的序列 \(A\) ,有 \(M\) 次询问,给定 \(l_i, r_i, k_i\) ,求在 \([l_i, r_i]\) 区间内第 \(k_i\) 小的数是多少。 \(N <= 10^5, M <= 10^4\) 先考虑如何求总序列第 \(k\) 小 我们可以建立一颗权值线段树,每个点存储的信息为 该值域区间存在的数的个数 。 因为线段树的性质,所以每个点的左子树的值域区间 $ <= $ 右子树的值域区间。 所以我们先看左子树区间有多少个数,记为 \(cnt_{left}\) 。 如果 \(k

任意模数NTT(MTT)

末鹿安然 提交于 2019-11-27 07:45:17
前言 众所周知,NTT有几个经典的模数: 469762049 , 998244353 , 1004535809 469762049,998244353,1004535809 4 6 9 7 6 2 0 4 9 , 9 9 8 2 4 4 3 5 3 , 1 0 0 4 5 3 5 8 0 9 为什么这些模数被称为NTT模数呢?因为他们都是这样一个形式: P = 2 a ∗ X + 1 P=2^a*X+1 P = 2 a ∗ X + 1 为什么要有这样一个条件呢,因为只有这样,才能找到所需的原根 所以对于一般的一个模数 P = 2 a ∗ X + 1 P=2^a*X+1 P = 2 a ∗ X + 1 ,能适用的最大的多项式长度(包括结果)是 2 a 2^a 2 a 有时候, 给出的多项式长度超过限制,我们就不能用裸的NTT了 一般有两种情况: 模数是NTT模数,但是多项式长度略超出限制(比如模数是1004535809,输入多项式长度和>2097152) 模数不是NTT模数,比如模数是1000000007 这个时候任意模数NTT就非常有用了 正文 我们来分析任意模数NTT做法的思路 思路一(P不是很大的时候) 根据分析,我们发现,多项式长度为N、模数为P的时候,多项式乘法的结果每一项的值 0 ≤ x ≤ P 2 N 0\le x\le P^2N 0 ≤ x ≤ P 2 N