10 2017 档案
摘要:虚树的话,就是把有用的的结点从树中提取出来,从而不会超时的一种东西 先把点都读入进来 按照dfs序排序 在把相邻的点的LCA加入 再按照dfs序排序 然后用栈维护一条祖先后代链 然后在维护过程中退栈的时候加边就行了 bzoj_3611大工程 虚树+dp #include <cstdio> #incl
阅读全文
摘要:T1 考试用treap水过了...我自己造的数据明明跑了12s (1)Treap 直接0~m个值全都塞进Treap里,然后就是插入和删除了 不要用new,要么重载new,要么开数组... (2)用队列和单调队列维护 维护一个cnt表示当前0~cnt卡车上都已经加入过(当前0~cnt的值并不一定在卡车
阅读全文
摘要:首先要理解题意 题意是说Alice和Bob能投出他们想要的那一面的p和q,不是只能投出1... 也就是说他们可以根据场上情况来决策p/q的概率来投出1还是0 我们来倒着定义状态数组,逆推 $f_i$表示场上还有i颗石子,在这一轮Alice先手赢的概率 $g_i$表示场上还有i颗石子,在这一轮Alic
阅读全文
摘要:T1 好水啊~~~ #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define ll long long #define mem(a,b) memse
阅读全文
摘要:T1 大水题+模拟 直接二分$O(nlogn)$ 然而有趣的是我在确认输入不会炸long long后 认为中间的乘法也不会炸 然后就从考完试到下午4点,一直在调,重打了两遍... 就差3个1LL... #include <cstdio> #include <cstring> #include <cs
阅读全文
摘要:$ f_{x,j} $ 表示以x为根的子树 x这个点在子树里的排名为j的方案总数 考虑x和儿子的合并 转移时要开一个临时的数组 $ t[] $ 来临时存一下数据 当儿子在x后面时 $$ t_{j+k}=\sum_{j=1}^{size[x]}\sum_{k=0}^{size[son]}C_{j+k-
阅读全文
摘要:要分最大值和次大值正负的四种情况... #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <set> #include <map> #de
阅读全文
摘要:$f_{i} 到第i位最少的花费 $ $n^2dp$ 很容易想 考虑优化 首先把权值从大到小排序,把pos压进set里 处理出每一个位置 i 前面第一个大于等于v[i]的位置 $$ f_{i}=min( f_{k}+max(v[l])(l+1<=k<=i) ) $$ 用线段树优化 但是你并不知道v[
阅读全文
摘要:今天是达哥出的题(翻车了QAQ) T1 地精部落 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define ll long long #define
阅读全文
摘要:T1 太鼓达人...我会说我考试的时候想了半天打表吗?当然不会 开大栈记得要点上执行命令... #include <cstdio> #include <cstring> #include <iostream> #include <cstdlib> #include <algorithm> #defi
阅读全文
摘要:这个题以前一直没弄明白... 相当于有$2^n-1$个点,$2^n$条边 然后求欧拉回路 可以dfs也可以迭代 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mem(a,b) mem
阅读全文
摘要:我定义的状态数组存的是概率,而且是正推 达哥存的是期望,还逆推,然后我就懵比了 $f_{i,j,k}$ 第i关 j条命 连胜k次 $$f_{i+1,min(j+1,Q),min(k+1,R)}+=f_{i,j,k}*p$$ $$f_{i+1,j-1,0}+=f{i,j,k}*(1.0-p)$$ $$
阅读全文
摘要:枚举次小值,找出左右两边第一个、第二个比它大的地方 找的话有两种方法 (1) $O(logn)$ 将权值从大到小排序,一个一个加入,用set来维护 (2) $O(log^2n)$ 二分位置 用线段树/RMQ来$O(logn)$求出区间最大值 求取区间异或的最大值 可以在可持久化0/1trie上贪心行
阅读全文
摘要:T1 找规律或者dp都行 #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <iostream> #include <cmath> #define mem(a,b) memset
阅读全文
摘要:10.22 T1 异或支持一些律,把后面的移到前面就行了 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define ll long long #de
阅读全文
摘要:可能是一个思维题,首先是状压 将大陆分成两部分,一部分是原来的,一部分是最后的 将最后的大陆面积取负数 sum(i)表示i这个状态的总和,sum(i)==0表明他们的和相等 然后如果直接暴力和起来,再暴力分开,那么总的是n+m-2 发现一个规律不,两个集合中和相等的子集个数*2,是n+m要减的 那么
阅读全文
摘要:其实这题很简单,只是dp难想 $f_{i,j}$ 前i座山脉,第i座山脉是第j小,且i-1座山脉比第i座高,即第i座山脉是山谷 $g_{i,j}$ 第i座是山峰 值得注意的是,j表明第j小,也就是说前i座山脉不一定只有[1,i]的山脉 dp方程: $$ f_{i,j}=\sum_{k=j}^{i-1
阅读全文
摘要:渊哥给我这题,我还以为是反演,然后还真推出来了 $$ans=\sum_{d=1}(\lfloor\frac{n}{i}\rfloor)^2\sum_{i|d}\mu(\frac{d}{i})i$$ 然后51nod 跑了3sec T了 #include <cstdio> #include <cstri
阅读全文
摘要:跟那个Crash一样 不过是进行了优化 后面可以线筛 不互质的时候,i*prime[j]的因数mu变成了0,所以只需要f[i*prime[j]]=f[i]*prime[j] #include <cstdio> #include <cstring> #include <cstdlib> #includ
阅读全文
摘要:有两个注意的地方: 1.预处理到$max(n,m)$的范围就行了,要不在大视野上超时 2. (x+1)*x/2*(y+1)*y/2 在中间会炸long long,记得在中间mod 自己的n<=1000000做法: 主要的限制是我的因为要除一个东西,没法线性筛,只能log筛,n>2000000就会超时
阅读全文
摘要:确实今天第一个没看题解的题... 而且一开始打的是log筛,cogs上过了,大视野过不了 然后打线性筛,为了不当孙子,坚持不看题解,竟然蒙对了 $$ ans=\sum_{i=1}^n\sum_{j=1}^m gcd(i,j) $$ $$ ans=\sum_{i=1}^{min(n,m)}i^k\su
阅读全文
摘要:我想的容斥和题解不太一样 我也是想先在n个里确定K个 然后设 $$f_i=C_n^i*\sum_{p=0}^{n-i} $$ $$ ans=f_K-f_{K+1}+f_{K+2}... $$ 然而这个并不对,3 2 的样例 算$f_k$的时候就已经是6了 正解: $$ ans=C_n^K*( C_{
阅读全文
摘要:我是打表发现的规律 f[i]=f[i-1]*(i&1)*(-1)^i 其实这是一个错排计数 $$ f_0=0,f_1=1 $$ $$ f_i=(i-1)*(f_{i-1}+f_{i-2}) $$ #include <cstdio> #include <cstring> #include <cstdl
阅读全文
摘要:这题我最大的收获是不要轻易相信网上的blog的题解... 环上dp 应该是两维,不能一维 (一下午的崩溃啊) 先求出环上每个点选和不选的最大值 再枚举环上那个点选不选(枚举相邻两个就行) 进行dp /* 我现在只想日死那个一维f[]的人 环上dp需要f[N][2]... */ #include <c
阅读全文
摘要:今天的题也很水啊,然而我并没有AK,中间还停了电,唠了会磕 T1 直接模拟 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <cmath
阅读全文
摘要:题意:求切比雪夫距离 直接求不好求,可以转化成曼哈顿距离 切比雪夫: $$ d=max( | x_1-x_2 | , | y_1-y_2 | ) $$ 曼哈顿距离: $$ d=| x_1-x_2 | + | y_1-y_2 |$$ $$ d=max( x_1-x_2+y_1-y_2,x_1-x_2+
阅读全文
摘要:T1 定义 tot=n+m 假设n是较小的 那么每次操作相当于 n=n*2 m=m-(tot-m)=2*m-tot 即直接在mod n+m意义下 快速幂即可 #include <cstdio> #include <cstdlib> #include <cstring> #include <iostr
阅读全文
摘要:今天下午的题及其水啊... 就T2是正解应该用括号序hash,我用的子树size
阅读全文
摘要:线性基的话,我觉得就是把n个数的排列简化成63个数,使其异或出来的数跟原来可以异或出来的数一样 先把矿石按权值从大到小排序 一个一个往里加 如果加进去的不合法,就放弃它,因为如果选了它,那么比它权值大的矿石就要放弃 #include <cstdio> #include <cstring> #incl
阅读全文
摘要:直接上code #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <cmath> #include <algorithm> #include <queue> #include <s
阅读全文
摘要:T1 直接二分就好了 #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <cstdlib> #include <algorithm> #define ll long long #def
阅读全文
摘要:上午的有些不可做... 等我成神犇之后再说吧... 下午的: T1 原题bzoj网格 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <cmath> #include <algo
阅读全文
摘要:这题用到了巧妙的转化,还有贪心 (我现在缺的就是思维,还有代码能力...说是缺思维,其实就是缺,我自己打了堆来取...) (1) 考虑每一个点 选了桃子与阿狸的差距+w,不选-w (2) 考虑每一条边 一个端点不选差距-c 选了一个端点 0 两个都选差距+c 那我们一开始假设都没选 然后桃子每次选最
阅读全文
摘要:T1 贪心的每次找最长的满足条件的序列,这样找到的一定是最少的 证明: 假如有更优的解,那么它在第一段一定是比贪心得出的第一段短一点,以此来满足后面的更少 但是这个序列的元素越少,越有可能构成等差数列,所以贪心一定是最优解 然后只需要判断相邻元素(不需要排序...)差的gcd==1和有没有相同元素
阅读全文
摘要:只能说恶心啊... 从网上找了一个标程,把所有信息都输出出来,对着调了一下午... 找到了两个错: 1.蚂蚁移动时,并不是只会向信息素最多的地方移动 2.蚂蚁被卡在(n,m) 时,忘了拿蛋糕了... #include <cstdio> #include <cstring> #include <cst
阅读全文
摘要:T1 40: 深搜 60: m<=$10^5$时,可以dp,f[i]表示前i个星球最多的矿 f[i]=max(f[i-4],f[i-7])+val[i] 100: 打表发现只有 1 2 3 5 6 9 10 13 17 不能由4、7组合出来 所以只要把>18的距离离散成18,还像60那样dp就行了
阅读全文
摘要:T1 f(i)表示不和法数大于i个的数量 $$f(i)=C_n^iC_{m-i*k-1}^{n-1}$$ 首先n>m||K*n<m一定不合法 先不考虑<K的情况,那就相当于给m个果子,用n个篮子把他们装起来 用挡板法易知 $$ans=C_{m+n-1}^{n-1}$$ 即给m个果子中间再加上n-1个
阅读全文
摘要:首先不考虑a的限制 设 S(i)为i的约数和 据约数和定理 先将i分解因数 $$ i=p_1^{q_1}p_2^{q_2}...p_k^{q_k}$$ $$S(i)=\prod_{i=1}^k\sum_{j=0}^{q_i}p_i^j$$ 当i与j互质时,S(i*j)=S(i)*S(j),满足积性函
阅读全文
摘要:T1 贪心的选 首先从0开始,让[1,可以达到dmax]都有青蛙 设las=1,now=dmax,当前[las,now]的石头上蹲满了青蛙 然后考虑从las开始走,当前las指的青蛙一定是跳到它能到的范围内最近的那个石头 reason:最左边的石头是最早不能用的,所以要最先用掉 (我这样 其实对于是
阅读全文
摘要:T1 对于每一个G,最小耗时是她前面B的个数,但是当G连在一起时,就有可能把她卡住 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <cmath> #include <vecto
阅读全文
摘要:首先,求x在[a,b]和y在[c,d]两区间gcd(x,y)==K的(x,y)个数,可以转化成求四次,然后容斥求 现在问题变成求[1,m]和[1,n]的(x,y)==K的个数,其实就是求[1,m/K]和[1,n/K]的(x,y)==1的个数 设F(i)=i|gcd(x,y)的(x,y)个数 f(i)
阅读全文
摘要:T1 三个操作实际上是两个 1.把x -1 2.把x *k 而100000的ans也不过是50步,因为是指数增长 设 f[i] 为走到i这个值用到的最少步数 那可以枚举步数,然后来更新它能走到的位置 #include <cstdio> #include <cstring> #include <ios
阅读全文
摘要:T1 正解是 建26颗线段树,但是他们有人被卡常了... 还是分块大法好,跑的最快 直接记录下每一个块 26个字母出现次数,再打上升序还是降序的标记 毕竟考试调了两个小时呢23333 #include <cstdio> #include <cstring> #include <cstdlib> #i
阅读全文
摘要:T1 是一道语文题 随便sort一下就行了 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <cmath> #include <algorithm> #define ll lon
阅读全文
摘要:T1 我只能说 它是一个比较暴力的dp,需要人力讨论... 所以考试觉得讨论太麻烦,直接内心崩溃了....(好像这也是我考炸的原因吧) 教训:以后要勤快一些,代码能力 唉唉唉 #include <cstdio> #include <cstring> #include <cstdlib> #inclu
阅读全文
摘要:这个题,我想的是用一些神奇的线段树做法,根本没想匹配 但是好像很显然啊 (论文写的也太长了...) 给的l,r范围很大,其实有用的只有n个时刻 那可以先离散一下 然后把 各个线段按照权值从大到小排序,一个一个选 有矛盾一定选择权值大的,所以前面选定的集合一定是最优的 然后自己论文里说的check函数
阅读全文
摘要:三分+贪心检验 (注意check的时候,多用/法,不要炸long long) jyy可以生存的时间 与 买的次数 成一个上凸的单峰函数 证明: 如果买的太多,光小费就给不起 如果买的太少,又不能充分利用多种食物 所以可以三分 买的次数 贪心check: 先把保质期短而且又贵的食物去掉 然后剩下的食物
阅读全文
摘要:T1 就是个签到题 第一个可以选m 第二个选m-1 第三个 m-2 之后都是m-2 特判n=1/2,m一开始就要mod,不然炸long long (就这么道不是题的题,我特么考试的时候竟然觉得他是 矩阵乘优化dp....,100分啊啊啊啊啊啊啊啊啊) #include <cstdio> #inclu
阅读全文
摘要:直接暴力O(n^2)枚举 每一个圆盘和其后面落下的圆盘 i 当前枚举的圆 j i之后的圆 然后利用atan2函数求出(x[j]-x[i],y[j]-y[i])向量与x轴的夹角 再根据d(圆心之间距离)、r[i]、r[j]余弦定理求出向量可以向上下扩展的角度 用贪心线段覆盖... 枚举的时候有几种特殊
阅读全文
摘要:T1 移项,然后离散,dp即可 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <ctime> #include <algorithm> #define mem(a,b) mem
阅读全文
摘要:T1 网格 显然 n==m时,卡特兰数 n,m<=100时,滚动数组的dp 正解 ans=C(n+m,n)-C(n+m,n+1) 不会证,但是可以类比 cantelan数公式 C(2*n,n)-C(2*n,n-1) #pragma GCC optimize("O2") #include <cstdi
阅读全文