06 2017 档案
摘要:数学+模拟 细节很多 首先我们发现,如果两个区间已经包含,那么可以输出empty,一个数能通过变换得到另一个区间的数,这个区间的大小必须小于等于终点区间的大小。加法不会改变区间大小,只有乘法会改变,而且每次乘法会使区间大小扩大m倍。其实我们发现,最终一个数会变成p*x+y,x是m的几次幂,y是一个a
阅读全文
摘要:并查集+数学 这道题网上好像有两种解法。 这位写的很可读:http://blog.csdn.net/unicornt_/article/details/51901225 然后看完大概就懂了做法,但是实现上还有很多细小的地方。 cnt要-1,因为第一行和第一列会算两次。 数组要开四倍。 至于为什么要拆
阅读全文
摘要:斜率优化 那个并查集还是A不掉,就做一些其他的。 一开始并不能写出dp方程,但是有这个结论,分割的顺序不影响答案,那么就很好写出了。 dp[i][k]=dp[j][k-1]+(sum[i]-sum[j])*sum[j] 因为顺序不影响答案,所以我们就可以看成从后往前一段一段割,所以就是先割掉i,再割
阅读全文
摘要:fhqtreap 其实fhqtreap只有可持久化之后才用新建节点。。。 reverse和splay一样。 //#include<bits/stdc++.h> #include<cstdio> #include<algorithm> using namespace std; typedef long
阅读全文
摘要:A:暴力枚举 模拟 #include<bits/stdc++.h> using namespace std; const int N = 60; int n; int a[N][N]; int main() { scanf("%d", &n); for(int i = 1; i <= n; ++i)
阅读全文
摘要:主席树+脑洞 首先我们有一个结论:如果我们已经凑出1-n,那么下一个数必须小于等于n+1才能凑出n+1,否则结束。 那么如果只有一次询问,我们把数组排序,然后扫一遍看每个数当前能不能加入。但是多组询问就不行了,这是我们就要用主席树。 主席树是权值线段树,我们维护区间和,但是我们不能扫一遍,就得进一步
阅读全文
摘要:可持久化treap 抄了个模板。 可持久化treap和主席树一样,都是利用了以前的节点来节省空间。但是却又有些不一样。可持久化treap基于两种操作:merge和split。其他操作都是由这两种操作完成,除了build。这两种操作都要满足第一颗treap的所有节点都是小于第二颗treap,这样才能l
阅读全文
摘要:日本人的比赛 C:如果两个数差了大于1无解,否则分类讨论 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 100010, mod = 1000000007; int n, m; ll a
阅读全文
摘要:脑洞 很早以前没有补掉的题目 四色问题肯定使有解的,然后就是怎么构造。注意到边长是奇数,那么我们就可以分类,按左上角坐标的奇偶性分类,正好对应四种颜色。因为当两个矩形左上角横纵坐标奇偶性不同时,那么肯定不会相邻,所以可以任意填,否则分类就可以了。 #include<bits/stdc++.h> us
阅读全文
摘要:tarjan求割点 我发现我还不会求割点 首先我们发现如果整个图是一个点双,那么要放两个出口。答案是2 c(n, 2) 如果不是,说明这个图存在割点能把图分成很多个部分,那么我们就要把割点求出来,每个点双和割点缩成一个点,这样就构成了一棵树。然后每个度数为一的点都要放一个出口,如果度数大于一就不用放
阅读全文
摘要:线段树+概率 今天这道题爆零了,奥妙重重。 其实我们可以把式子化成这样:sigma((i-l+1)*(r-i+1)*ai) 这里r减了1 然后展开,(1-l)*(r+1)*ai+(r+l)*i*ai-i*i*ai 我们发现除了含有i的项其他都可以提到外面,也就是说我们要维护ai,i*ai,i*i*a
阅读全文
摘要:几何+lis 很巧妙。直接做很困难,那么我们转化一下,把每个点能看见的圆弧画出来。只有这些圆弧相交时才满足条件。 那么也就是找出圆上尽量多两两相交的区间。 所以我们先按左端点极角排序,然后固定一个必须选的区间,找出所有和它相交的区间,按右端点做lis就行了。 #include<bits/stdc++
阅读全文
摘要:数学 其实我们发现不用每个数都去试一下,只要确定每个数字有几个就可以确定这个数。所以我们先搜索一下,然后检验。 但是这样太慢了,所以我们打表。 打出1-30的结果,然后取模。 打表的程序好像弄丢了。。。就是要各种高精度 #include<bits/stdc++.h> using namespace
阅读全文
摘要:网络流/贪心 网络流做法是对于每一列,如果一个兔子下一天继续可以存在,那么连一条容量为1的边,然后设立一个中转站,来控制可以换的数量,容量限制l。时限100s,能跑过去我的太慢了,一个点100s 正解是贪心。不会证明。每一只兔子,我们当然希望能够尽量连续多跑几天,给其他兔子留机会。每次把在的兔子和不
阅读全文
摘要:贪心+倍增 首先如果这个问题在序列上,好像可以按右端点排序,然后从起点开始向能到的最远的地方走。 但是环上不可以,因为随即一个起点可能不是最小的。 然后神思路来了:我们先将环展开倍增,再将区间按右端点排序,然后每个区间连向能达到最远的区间连边。因为每个区间只向外连一条边,而且最后一个区间没有后继,所
阅读全文
摘要:边双联通分量 具体详解蓝书上十分详细,因为必须是奇数个人坐在一起,那么一个人如果能选上,就必须处在一个简单奇圈中。而奇圈也是一个边双联通分量,所以我们先把边双联通分量都挖出来,然后进行二分图染色。 奇圈不能被二分图染色,所以标记所有不能被染色的点,减去就是答案 #include<bits/stdc+
阅读全文
摘要:二维树状数组 树状数组什么的只支持修改单个数值,但是这道题要我们更新一个区域 盗图 就是这样,然后维护四个bit就行了 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2049; int
阅读全文
摘要:bzoj4753 树形dp+01分数规划 这是一个典型的树形背包+01分数规划。看见分数形式最大就应该想到01分数规划。 于是套用分数规划,每次用树形背包检验。 首先这是一棵树,不是一个森林,所以我们不用添加虚点。然后可以列出dp方程,具体代码。 然后每个点如果自己选了,那么父亲也要选,所以更新的时
阅读全文
摘要:这场是吕队长的orz A:如果k>1 那么肯定是可以的 因为两个数必然有大小关系 小的放在大的前面就行了 k=1 填进去判一下就行了 #include<bits/stdc++.h> using namespace std; const int N = 1010; int n, k, pos; int
阅读全文
摘要:https://vjudge.net/problem/URAL-1519 插头dp。。。 终于A掉了。。。抄了一个板子。。。 看那个ccy大神的博客 写的非常好。。。 讲几个问题:插头就是线穿过格子的边缘 左插头就是竖着的轮廓线左边 右插头就是竖着的轮廓线右边。。。我好想没用到这个概念。。。 然后就
阅读全文
摘要:http://www.lydsy.com/JudgeOnline/problem.php?id=4889 人傻常数大 bzoj上跑不过 洛谷上能过两到三个点 我写的是树套树啊 怎么跑的比分块还慢 每次可以发现交换两个点 只对他们中间的点有影响 所以我们只用计算比x小的数的和 比x大的数的和 比y小的
阅读全文