[日常摸鱼]bzoj2724蒲公英-分块】的更多相关文章

区间众数经典题~ http://begin.lydsy.com/JudgeOnline/problem.php?id=4839这里可以提交~ 题意大概就是没有修改的询问区间众数,如果有一样的输出最小的,强制在线,$n \leq 4*10^4,a_i \leq 10^9$. log数据结构脑补一遍好像没什么可以做的,数据范围我们可以分块! 不过分块之前肯定要离散化一下,而且还要保存离散化前的数据(因为要回答的是出现最多的数),离散化的方法在上一篇博客里面~ 假设分成$L$块,每块大小$s=\lfl…
题意:求$\sum_{i=1}^n \sum_{j=1}^n gcd(i,j),n<=1e10$ 之前刚好在UVA上也做过一个这样求和的题目,不过那个数据范围比较小,一开始用类似的方法 $ans=\sum_{i=1}^n \sum_{j=1}^i gcd(i,j)-\sum_{i=1}^n i$ 先考虑化简$\sum_{i=1}^n gcd(i,n)$变成好求和的形式 $$\begin{aligned} \sum_{i=1}^n gcd(i,n) &=\sum_{i=1}^n \sum_{d…
本篇文章是Hash在信息学竞赛中的应用的学习笔记,分多次更新(已经有很多坑了) 一维递推 首先是Rabin-Karp,对于一个长度为\(m\)的串\(S\) \(f(S)=\sum_{i=1}^{m}s[i]*p^{m-i} \mod q\) 那么在一个长度为\(n\)的文本串中找长度为\(m\)的子串,设该子串的首位下标为\(i\) \(f(S_i)=\sum_{j=i}^{m+i-1}s[j]*p^{(m+i-1)-j} \mod q\) \(f(S_{i+1})=\sum_{j=i+1}^…
模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被叫Simpson公式,Simpson积分什么的-看到这里的人应该都知道这个是用来干嘛的吧) 对一段小区间$[l,r]$取奇数个点,然后把区间平均分成$n$段:$x_0,x_1,x_2, \cdots,x_n$,每段长度$\Delta x$,那么: $\int_l^r f(x) dx \approx…
题意:输入$k,n$,求$\sum_{i=1}^n k \mod i$ $k \mod i=k-i*\lfloor \frac{k}{i} \rfloor $,$n$个$k$直接求和,后面那个东西像比较套路的分段求和 算k/(k/i)这种东西的时候还要注意判一下分母为0什么的- #include<cstdio> typedef long long lint; lint n,k,ans; inline lint min(lint a,lint b){return a<b?a:b;} inl…
题意就是求最小割- 然后我们有这么一个定理(最大流-最小割定理 ): 任何一个网络图的最小割中边的容量之和等于图的最大流. (下面直接简称为最大流和最小割) 证明: 如果最大流>最小割,那把这些割边删去之后依然能找到一条增广路使得源点和汇点联通,和这些边是最小割矛盾.故最大流$\leq$最小割. 而如果最大流<最小割,可是这样通过这些割边还能有更大的流,和最大流矛盾. 综上,最大流=最小割~ 然后看看这道题-哇$n\leq 1000$,百万个点百万条边-好吧Dinic其实跑得过-而且还蛮快的-…
方格取数的升级版,每个格子最多取一次. $k=1$的话就是个普及组的dp题,$k=2$就是在之前的基础上多加两维. 然而现在$k$太大了当然就不dp啦 对于$k=1$的情况我们还可以把$(i,j)$向$(i+1,j),(i,j+1)$连边然后答案就是跑最长路,而对于更大的情况我们的瓶颈在于直接跑最长路不能限制每个点只取一次. 对于点来说没有什么好的方法我们就把问题转移到边上:把每个点拆成一条边.具体的说就是把一个点拆成两个点,把点权变成边权,而我们又要限制这样子的每条边最多走一次,这里就有点费用…
题面 应该是二分图匹配,不过我写的是网络最大流. dinic求二分图最大匹配:加个源点和汇点,源点连向二分图的一边所有点,二分图的另一边所有点连向汇点,很明显这样得到的最大流就是这个二分图的最大匹配. #include<cstdio> #include<algorithm> #define rep(i,n) for(register int i=1;i<=n;i++) #define REP(i,a,b) for(register int i=a;i<=b;i++) u…
还有两天就要去FJWC啦- 题意:一颗无根树,$k$为给定常数,求树上距离不超过$k$的点对的数量,多组数据,$n \leq 10^4$. 应该是点分治经典题~ 一般对于无根树我们都可以把它转变成有根树(其实树上路径不管哪个根都一样嘛),假设我们已经钦定了一个根$rot$(后面会说其实这个根应该是重心),对于$rot$这颗树中的对答案有贡献的路径,要么经过$rot$,要么直接就是$rot$的某一颗子树的答案,这两种情况之间没有交集直接相加,这里就出现了子问题. 而对于经过$rot$的路径的贡献,…
题意:二维网格一些格子有权值,求用边长为$r$的正方形能覆盖到格子权值和的最大值,格子大小$ \leq 5000$ 非常裸的二维前缀,然而 题目下标从0开始! QAQ 要是比赛就要爆零啦- #include<cstdio> #define rep(i,n) for(register int i=1;i<=n;i++) #define REP(i,a,b) for(register int i=a;i<=b;i++) const int N=5005; int n,r,w[N][N]…
QAQ学了好几天了-(我太傻啦) #include<cstdio> #include<cstring> #define rep(i,n) for(register int i=1;i<=n;i++) const int N=40006; const int S=26; int n,cnt,last,T; int suf[N],val[N],tr[N][S+3]; char s[N]; inline int newNode(int x) { val[++cnt]=x;retur…
我也不知道为什么我要来写这个-怕是写水题写上瘾了(bu #include<cstdio> #include<algorithm> #define rep(i,n) for(register int i=1;i<=n;i++) const int N=10005; struct edge { int u,v,c; }e[N]; int n,m,mx,s[N],pre[N]; inline int find(int x){return pre[x]==x?x:find(pre[x…
今天来学了下莫队-这题应该就是这个算法的出处了 一篇别人的blog:https://www.cnblogs.com/Paul-Guderian/p/6933799.html 题意:一个序列,$m$次询问:求区间$[l,r]$内随机选出两条袜子(不放回去)颜色相同的概率,保留最简分数,$m,n,col \leq 50000$ 对于一个询问$[l,r]$,分母为$(r-l+1)*(r-l)$,分子为$\sum_{i} (sum[col[i]])^2-(r-l+1)$,其中$sum[col[i]]$表…
http://www.lydsy.com/JudgeOnline/problem.php?id=3224 经典的平衡树模板题-各种平衡树好像都可以(黄学长之前好像还用vector卡过了这题) 所以这篇博客也就来存一下模板什么的- 如果发现有什么地方讲错的还请留言怼我 1.Treap 首先是经典的Treap:Treap=Tree+heap 这里每个结点有两个值$v$(结点的值)和$rnd$(一个随机值),叫Treap的原因也就是它遵循二叉查找树的性质($o$的左子树的$v$<$o$的$v$<$o…
题意:给一堆长宽平行于坐标轴的长方形求并的面积 我个沙茶快写了一晚上- 大概思想就是先根据$y$坐标排个序,把$y$坐标离散化一下,放到线段树里面维护,这里的写法是让线段树的节点储存这个点对应的整段线段的信息,更新的时候如果不行就把线段拆开,以及注意一些细节(比如这里右孩子的区间是[mid,r]而不是[mid+1,r]因为下标其实应该是连续的实数) 我也讲不清楚了具体看代码- #include<cstdio> #include<algorithm> #define rep(i,n)…
好裸的矩阵快速幂-然而我一开始居然构造不出矩阵- 平常两个的情况都是拿相邻两项放在矩阵里拿去递推的-然后我就一直构造不出来-其实把矩阵下面弄成1就好了啊orz #include<cstdio> #include<cstring> #define rep(i,n) for(register lint i=1;i<=n;i++) typedef long long lint; lint m,n,g; struct matrix { lint m[3][3]; matrix(){m…
这回好好用半平面交写一次- 看了cls当年写的代码看了好久大概看懂了-cls太强辣 #include<cstdio> #include<iostream> #include<algorithm> #define rep(i,n) for(register int i=1;i<=n;i++) #define REP(i,a,b) for(register int i=a;i<=b;i++) #define debug(x) cout<<#x<…
不会写半平面交-然后发现可以转成对偶凸包问题 具体见这里:http://trinkle.blog.uoj.ac/blog/235 相关的原理我好像还是不太懂-orz #include<cstdio> #include<algorithm> const int N=50005; inline int read() { int s=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}…
一无聊就找树剖写 题意:一颗带点权的树,三种操作:1.换根 2.链赋值 3.查询子树最小值 如果没有换根的话直接就是裸的树剖了,对于换根的操作我们可以分类讨论. 1.如果查询的$x$就是根,那答案就是整棵树的最小值. 2.如果以1为根的dfs序中,根在$x$的子树之外,那很明显$x$的子树还是原来的子树. 3.如果以1为根的dfs序中,根在$x$的子树里面的话,画个图就能发现,找到$x$的孩子中作为根的父亲那个点,答案就是整棵树把整个点的子树去掉就行了. 其他地方跟树剖没什么区别- #inclu…
题意:$n$个点,求最小圆覆盖,$n \leq 5e5$ 这题数据是随机的hhh 我们可以先求出凸包然后对凸包上的点求最小圆覆盖-(不过直接求应该也行?) 反正随便写好像都能过- #include<cstdio> #include<algorithm> #include<cstdlib> #include<cmath> using namespace std; const int N=500005; struct Point { double x,y; in…
最小圆覆盖裸题 我求外接圆的方法比较奇怪-不过还是过掉了 #include<cstdio> #include<cmath> #include<cstdlib> #include<algorithm> using namespace std; const int N=505; struct Point { double x,y; int rnd; Point(double x=0,double y=0):x(x),y(y){} }p[N]; struct Li…
https://www.luogu.org/problemnew/show/2521 题意:维护一个上凸包:删点,查询周长 很容易想到把问题转换为离线:先读入全部操作,记录下最后剩下的点,倒着加点来维护凸包,同时也倒着做询问. 然后问题就变成了怎么维护加点的操作,这题其实只要维护上半个凸包(其实也有一点启发性了吧),用set存凸包的点集,对于要加的点往左右两边一直把不行的点删掉就好了,因为一个点最多被删一次所以加上set的$log$实际复杂度是$O(nlog n)$的而不是$O(n^2)$. 如…
原来这个念 旋转卡qia壳ke- 题意:求平面内给定点集里的最远点对,$n \leq 5e4$ 做法就是旋转卡壳啦,话说这题数据范围应该可以再大挺多的. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int N=50005; struct Point { double x,y; Point(double x=0,double y=0):x(x),y(y){}…
我学习进度慢得连我自己都怕- 题意:大概给$n$个点搞出它的凸包,然后还要在凸包外弄一层厚为$l$的东西,求这个东西的周长 我个滞涨居然把pi开成了int-搞了一个晚上才看见 凸包直接求,因为是凸多边形所以答案就是凸包的周长加上$2 \pi l$ #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int N=1005; const double pi=acos(…
直接贴题面x 有$n$头奶牛跑到FJ的花园里去吃花儿了,它们分别在距离牛圈$T$分钟处吃花儿,每分钟会吃掉$D$朵卡哇伊的花儿,FJ现在要将它们给弄回牛圈,但是他每次只能弄一头回去,来回用时总共为$2*T$分钟,在这段时间内,其它的奶牛会继续吃FJ卡哇伊的花儿,速度保持不变,当然正在被赶回牛圈的奶牛就没口福了!现在要求以一种最棒的方法来尽可能的减少花儿的损失数量,求奶牛吃掉花儿的最少朵数! 话说题面好像有点问题-应该是在抓奶牛的路上这个奶牛好像就不会吃花了,也就相当于一下子到奶牛那边然后花了$2…
题意:单点修改,询问区间最大子段和,$n\leq 5e5$ 考虑分治的方法$O(nlogn)$求一次最大子段和的做法,我们是根据中点分成左右两个区间,那么整个区间的答案要么是左边答案,要么是右边答案,要么是左边的最大后缀和加上右边的最大前缀和.而一个区间的最大前缀和又会等于它左区间的最大前缀和或者是左区间的和加上右区间最大前缀和. 基于这种思想我们就有了一种动态求最大字段和的算法了,区间和,前缀后缀和,都可以直接用线段树维护,用这些信息就能求出最大子段和了. 注意询问的时候应该把整个结点的信息储…
题意:记$f(n)$为$n$的约数个数,求$\sum_{i=1}^n f(i)$,$n \leq 10^6$. 我也不知道为什么我要来做这个- 直接枚举每个数会是哪些数的约数-复杂度$O(n log n)$ #include<cstdio> typedef long long lint; int n;lint ans; int main() { scanf("%d",&n); for(register int i=1;i<=n;i++) for(registe…
题意:两个人在$n*n$的棋盘上玩游戏,一开始棋子在左上角,可以上下左右的走到没有走过的地方,最后不能走的那个输,两个人都采取最优决策问哪个赢 猜结论!$n$为偶数则先手赢,否则后手赢. 考虑用$1*2$的骨牌来覆盖棋盘,$n$为偶数就可以完全覆盖整个棋盘,每次总是先手在骨牌的一段,后手在骨牌的另一端,然后再由先手到另一个骨牌上,这样一定是先手赢.否则如果$n$变成奇数会空出来一块,就是后手获胜了. 好像很有道理 #include<cstdio> int n; int main() { whi…
题意:写一个数据结构,要求滋兹两种操作,ADD:插入一个数,GET:令$i++$然后输出第$i$小的数 这个数据结构当然是平衡树啦!(雾) 写个Treap直接过掉啦- #include<cstdio> #include<cstdlib> typedef long long lint; const int N=200005; inline lint read() { lint s=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if…
辣鸡会考考完啦哈哈哈哈 题意:一块板分成$L$块,每次给一段连续的块染色或者询问一段有几种颜色,颜色的范围$\leq 30$ 我记得我好像做过一个类似的二维染色的问题-不过那个用树状数组直接过掉了- 这题颜色范围这么小的范围直接想到线段树了吧,直接把一个区间的颜色二进制按位压缩成一个状态,维护区间或 题面还特地说了可能$a>b$-然而我没看到 #include<cstdio> const int N=100005; inline int read() { int s=0,f=1;char…