随笔分类 - OI
bzoj3143 [Hnoi2013]游走
摘要:这个题是让你给遍赋权,问1-n路径的最小期望值。显然只要我们知道了每一条边经过次数的期望值,我们就可以贪心地给边赋权了。但是要求边的期望值会很恶心,因为每条边正着走和反着走对其它边的贡献是不同的。于是我们考虑求每个点经过的次数的期望,那么每条边经过次数的期望就是它的端点的期望/端点的度数。设f[i]表示i点经过次数的期望,那么f[i]=Σf[j]/d[j] (j->i)注意一下边界条件,由于一开始就在1号点,所以f[1]=1+Σf[j]/d[j],而虽然n点会被经过好多次,但是n点对它连接的边是不会有贡献的,所以f[n]=0。这样我们记可以高斯消元了。最后贪心赋边权,得到答案。walk
阅读全文
bzoj2337 XOR和路径
摘要:最近高斯消元刷的有点多啊。但这个题并不是解xor方程的,其实xor跟这个题实在是没有太大的关系。对于这种路径上求xor的题,我们可以逐位考虑,这样就变成了0和1之间的运算。那么对于每一个点,我们记录这个点出发到n的期望xor和f[i],显然f[n]=0。那么f[i]=Σf[j]/d[i](w[i,j]=0)+Σ(1-f[j])/d[i](w[i][j]=1),为什么是1-f[j]呢,因为我们求的是某一位的xor和,相当于一次值域在[0,1]之内的取反操作(不知道这么表述是否严谨),于是1-f[j]相当于把这个点的期望值xor和取反。那么f[1]就是我们想要的值。那么最后统计答案就是2i*v[i
阅读全文
bzoj2115 xor
摘要:这个题网上题解挺多的,讲的也挺详细的,所以我就不必过多赘述。大体思路就是任意选一条1-n的路径,和一些独立环xor起来得到一个最大值就是答案。注意个和路径不相交的环,那么它们xor起来的结果的意义就是从路径上任意一点走到环,遍历一遍再从原路返回路径,路径连接环的那段被走了两次,xor值抵消。注意独立环的个数有m-n+1个,求得时候dfs,每条dfs树的非树边对应一个环。xor 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #inc
阅读全文
bzoj2844 albus就是要第一个出场
摘要:这个题有了hdu3949那个题的基础就非常好做了,因为这两个题求得东西是对偶的....这次我们要求某个数是第几个出现的(不去重),那么我们只要知道它去重的排名,再乘上每个数重复的个数(2n-m),加上1就好了。还是高斯消元,不过要注意的是这里的高斯消元和普通的解xor线性方程还不一样,因为我们是要得到一组基数,代表从高到低的一些二进制位,所以我们要从最高位的元开始找,并且消的时候是对所有方程消元。注意我们是对数消元,用尽量少的数去代表尽量多的二进制位,所以这样消可以尽量地避免重复。最后求答案的时候,只要类似倍增地从大到小试,如果这位能取1就取,最后就得到了需要的排名。albus 1 #incl
阅读全文
hdu3949 xor
摘要:这个题是用来研究xor性质的一道好题。首先我们可以暴力地找出些规律,我们发现不管拿出多少个数,他们能xor到的数,出现的次数都是一样的,并且都是2的倍数。事实上,我们不论用原数ai还是ai xor aj得到的数,去xor起来得到的数都是这些。这样我们可以想方设法地化简我们用到的基数,也就是找到一组基数使得它们能够xor出所有原数能xor出的数,并且要尽量简单。我们可以模仿高斯消元的过程,就是把每个数当成一行二进制数去消元,然后保留一个类似上三角的东西,从高位向低位每一行保留连续的几个1,这些1行与行之间是不重复的,但每一行之中还会有额外的一些1,这些1是可重复的,就造成了一些数是xor不出来的
阅读全文
bzoj3105 [cqoi2013]新Nim游戏
摘要:传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同)。两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴。可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿。拿走最后一根火柴的游戏者胜利。本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴。可以一堆都不拿,但不可以全部拿走。第二回合也一样,第二个游戏者也有这样一次机会。从第三个回合(又轮到第一个游戏者)开始,规则和Nim游戏一样。如果你先拿,怎样才能保证获胜?如果可以获胜的话,还要让第一回合拿的火柴总数尽量小。【输入格式】第一行为整数k。即火柴堆数。第二行包含k个不
阅读全文
Sset
摘要:神犇考题第三题:设 S ={x|x∈Z,1≤x≤n}给定 N 个 S 的子集 Si,每个集合有一个权值 Wi。这 N 个集合满足其中任意 K 个集合的并集中至少有 K 个元素。请从中选取若干个集合(可以不选),使得其并集的元素个数恰等于选取的集合数,且这些集合的权值和最小。考试的时候觉得这个题相比另外两个挺可写的,于是就使劲想,想出了最大权闭合图,想出了每个集合代表一个数字,可就是没想到把这两个联系起来,无奈,最后还是在包含关系的时候出搞错了,果然我还是太弱了,构造能力捉急。首先有一个非常有用的条件,就是任意k个集合的并集中至少有k个元素,那么,如果有一个合法的方案,那么一定可以用一个单独的元
阅读全文
bzoj2752 [HAOI2012]高速公路(road)
摘要:线段树好题。很容易求出要维护的东西的公式,给线段标号,设x,y为左右线段标号,那么其中出现的总和就是Σc[i]*((i-x)*(y-i)+(y-x)),拆开就是Σ(y-x-y*x)*c[i]+(x+y)*i*c[i]-i2*c[i].于是只要维护∑c[i],∑i*c[i],∑i2*c[i]就行了。我一开始想偷懒写bit发现用了bit以后维护的和会升至3维,(⊙o⊙)…三维求和,略难搞,只好放弃。那么就是线段树,用一个求和公式就行了。看来以后要多练练线段树了,实在是偷懒偷的太多了......road 1 #include<iostream> 2 #include<cstdio&
阅读全文
bzoj 2004[Hnoi2010]Bus 公交线路
摘要:状压DP。f[i][s]表示第i个车站之前的p位的状态为s的方案数,注意这里状态s我们规定第一位为1,并且一共有k个1。这样的话状态一共有C(9,4)=126种,于是设计一个126*126的矩阵,自乘n-m次就可以了;初始状态:11111(m个1)的状态;目标状态:11111(m个1)的状态。bus 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #define maxn 1200
阅读全文
bzoj2001 城市建设
摘要:bzoj崩了3天了......本人目前处在无题可交的状态,郁闷啊。不过TY复活了,看到以前写过的代码有点小激动。切入正题,这个题想了好久才写,主体还是分治,只是中间处理部分比较巧妙。这个题GYZ在wc上讲过,思路也很清晰,就是不太好写。过程主要分两个部分(我直接粘解题报告了):1. Contraction 把 L..R要修改的所有边权暂时标记为-∞; 对图做 MST; 此时观察图中不是-∞但被选入 MST的边集; 它们在 L..R的询问中也一定会被选入; 于是可以直接先用这些边把点集做合并操作。这样图的点数被缩小; 还原边权标记. 2. Reduction 把 L..R要修改的所有边权暂时标.
阅读全文
bzoj2120 数颜色
摘要:这篇题解拖了好久......原因是一直不知道该怎么叙述。首先,类似采花那个题,统计答案的时候要找到每个位置之前和它颜色相同的第一个位置pre[i],那么只要这个位置的pre[i]不在查询的[L,R]区间里,就说明这个颜色是这个区间里第一次出现的颜色,答案+1。动态修改的话我们可以用set来实现。然后传统的树套树做法是将序列建一棵线段树,再给线段树每个节点建一棵平衡树,代表[l,r]这段区间。那么每次查询[L,R]的时候在线段树上走一下,找到相应位置,查找比询问L小的有多少个就行了。但是有一种更为简洁的做法——整体二分!以前都是用整体二分去搞一些第k小数问题,但这个题其实和第k小数有很大的联系:
阅读全文
bzoj2527 [Poi2011]Meteors
摘要:这个题是在GYZ冬令营讲课课件里翻出来的,所以我一开始使劲地往分治上去想,良久,无果··········题意是给你一圈位置,位置上有若干颜色(可以重复),每个颜色有一个需求量,每一个时间给一个段加上一个数,最后问每个颜色最早加到需求量的时间。今天早晨睡觉起来(大概是10点多),赖在床上,YY这个题,突然想到整体二分然后计算贡献似乎非常不错。但是对于序列的处理怎么搞才能把复杂度降下来呢?于是我想到用链表记录每个颜色的位置,这样计算均摊下来就是O(m)了,用树状数组处理,外面套一个整体二分,似乎是非
阅读全文
bzoj1396 识别子串
摘要:貌似是个傻×题啊.......由于贪心地想要刷双,结果被空间卡了半个小时。这个题是问字符串S每一位的最短识别子串是多长(识别子串指包含这个字符且只出现在S中一次的子串)。为了想这个题,我对着SAM的图YY了一天。终于,我发现,从后缀树的角度考虑是比较简单的。因为SAM是一棵逆序的后缀树,那么每一位i的前缀(除了包含在别的前缀里面)所对应的节点一定是后缀树里的叶子节点。那么我们只要找到它的父亲节点,然后它的父亲节点对应的子串填上一位字符就是一个识别子串。然后我们就求出了每一位往前最短的识别子串的长度(比这个长度长的一定是识别子串)。然后,我们看:其中L~R是最短识别字串1~L-1段,可
阅读全文
bzoj1415 [Noi2005]聪聪和可可
摘要:算是正式开始接触期望DP了吧,以前在NOIP之前TY比赛里做过一些,基本上都是根据初中的概率知识乱搞的,但事实上这种期望概率动规题还是可以很难的。这个题是看论文上的题解,算是比较基础的期望dp了吧。首先需要预处理一些东西:way[i][j]表示聪聪在i可可在j点时聪聪会走到哪个点,t[i]表示i点的度,next[i][j]表示和i点相连的第j个点是谁(就是可可在i点时可以走到的点的集合,这个集合的大小是t[i])。其中way[i][j]我是枚举顶点dfs的。然后就是一个方程了:f[i][j]=f[way[way[i][j]][j],j](可可不动)+Σf[way[way[i][j]][j],n
阅读全文
bzoj2631 tree(伍一鸣)
摘要:首先如果没做过维护序列这个题的可以先去做一下,对标记有个初步理解,题解在这里。看到了一道LCT练手题,于是果断刷了,这个题主要恶心在传标记上,别的都是基本的LCT操作。那么我就说一下传标吧。链接一个博客Kanari's World这里面讲的不错,下面我只说说我的体会。我习惯把所有的标记在一个过程里下传,下传顺序一般是旋转,覆盖,加减,注意如果有覆盖的话,连同加减都要一起清掉。然后我下传一般只写在splay的开头,就是先上溯找到根,然后递归地把标记一个一个传下来,事实证明这样做和在旋转的时候一个一个down下来是一样的。然后是标记法则,这个很重要!一定要规定一个严格的标记法则,就是什么优
阅读全文
bzoj3111 [Zjoi2013]蚂蚁寻路
摘要:zjoi2013的题终于做完了,拖了好久,觉得这份题质量挺高的,而且代码量都不是很大,zj的题还是比较注重思路的,而且都可以有不同的解法,甚至可以骗分= =。这个题我一开始只能想出N^4的,后来参考某神的题解发现我多出来的那一维完全是没有用的......但是我还是想总结一下思路,毕竟这种2D的DP做的比较少,以免以后忘掉。首先经过一些列的简化我们发现这个题实际就是求个凹凸不平的形状中的最大值,也就是一堆高度参差不齐的子矩形的和,这些子矩阵同底,高满足一高一低,一共要这样变2k次,也就是一共有2*k+1个矩形。设f[i][j][k][h]表示以[i][j]为右下角的子矩阵,是当前的第k个子矩阵,
阅读全文
HDU4436 str2int
摘要:后缀自动机......慢慢体会ing。这个题的题意是给你一堆数字串,让你去重以后问所有字串代表的数字的和(mod 2012)这个题n是10^6级别的,所以要充分利用重复字串的性质。这么考虑,当有许多子串的都添一个末位数字K时,这些子串的和就是原来字串的和*10+子串个数*k。其实这些字串在自动机里面对应的就是一个状态,当这些状态都存在一个指向Q的转移时,就可以把这些状态的sum累积到Q上。这充分利用SAM自动机中转移函数的特点(tran[p][w]表示在p状态后面添加一个字符w,将成为哪一个状态的后缀)。这样想的话,每一个状态上累加的sum实际上是这个状态所有后缀的sum和,而这些后缀的共同特
阅读全文
bz1027 [JSOI2007]合金
摘要:由于本人傻×,给bzoj上贡献了满满一屏的wa,真是对不住了......这个题其实挺水的,我就简单一说吧。可以看出选的原材料组成的凸包一定要包住需求的材料组成的凸包,那么我们枚举任意两个材料的点,如果他们的向量在所有材料组成的点的同侧的话,就给这两个点连一条1的边,否则连一条正无穷的边,那么用floyd跑一边最小环 就行了。注意特殊情况,如果只有1个点就能满足,那么这个点必须和所有需求的点重合,如果只有2个点就能满足,那么所有需求的点都应在这两个点的连线段上。metal 1 #include<iostream> 2 #include<cstdio> 3 #in
阅读全文
bzoj2961 共点圆——陈丹琪分治
摘要:最近惊讶地发现陈丹琪分治又名时间分治......写完cash以后,突然就觉得分治法解决一些需要高级数据结构维护的题目非常地爽,于是我就很2b地去做共点圆了。对于一个几乎没有做过计算几何的我,居然还傻傻地以为直接用斜率就可以搞了......并且一开始解不等式居然忘变号了,以为只用维护一个下半凸壳就行了......以上都是废话。这个题给过圆心的点,询问点是不是在所有圆内,运用时间分治,我们变成了用[l,mid]段的圆去计算[mid+1,r]段的点,以更新答案。因为这个题中添加操作之间对答案的贡献是互不影响的,这样我们通过分治创造了一种序,就是先给出圆,后计算点。于是这个问题就比价容易了,符合条件的
阅读全文
bzoj1492 [NOI2007]货币兑换Cash
摘要:经典的1D1D动态规划题目,标准做法是平衡树维护凸壳,但实际上还有更简洁的分治法。首先分析一下题目,对于任意一天,一定是贪心地买入所有货币或者卖出所有货币是最优的,因为有便宜我们就要尽量去占,有亏损就一点也不去碰。于是我们得到方程:f[i]=max{f[j]/(a[j]*rate[j]+b[j])*rate[j]*a[i]+f[j]/(a[j]*rate[j]+b[j])*b[i]}其中,x[j]=f[j]/(a[j]*rate[j]+b[j])*rate[j]表示第j天最多可以拥有的A货币的数量 y[j]=f[j]/(a[j]*rate[j]+b[j])表示第j天最多可以拥有的B货币的数..
阅读全文
浙公网安备 33010602011771号