• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
AC_Artist.zig_zag
然而我依然在补题、
博客园    首页    新随笔    联系   管理    订阅  订阅
05 2013 档案
bzoj3126 [Usaco2013 Open]Photo

摘要:省选前最后一天填坑...... 其实这个题早就想过,一直懒得写。我发现我写单调队列一次一个样,真是郁闷。 简述题意就是给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点。 我们考虑用f[i]表示前i个位置能放多少个,每一步决策有两个限制:1.每个区间里要有一个点,这样我们可以确定决策区间左边界;2.每个区间里只能有一个点,这样我们可以确定右边界。如果有地方左边界大于右边界了就是一定不能放点了。 单调队列的话,首先让[ L[I],R[I] ]区间的f值入队,然后把队首不在这个决策区间里的出队,然后转移f[q[head]]就行了。 总结起来,单队大概有两种,一种... 阅读全文
posted @ 2013-05-17 09:06 Zig_zag 阅读(966) 评论(0) 推荐(0)
bzoj3100 排列

摘要:这个题有点恶心啊,总觉得以前做过,可就是想不出来。最后在发现是meng神出的一次模拟赛题= =当时我还P都不会呢... 这个题有两个关键点,一个是选取的子序列内不能有重复,二是选取的子序列要是一个排列(当然这包含了一)。首先如果确定了不会重复,那么只要子序列内的数的和等于(len+1)*len/2就行了,那么怎么确定不重复呢? 我们可以O(N)时间求出来每个数两边第一个和它相同的数的位置(L,R),这样我们可以不断地更新合法的序列的范围。 具体方案:我们先确定每一个1的位置(因为每个区间首先必须有1),按照这个来划分区间。我们先从左到右扫每个区间,相当于枚举了右端点k(我们要包含那个... 阅读全文
posted @ 2013-05-16 20:07 Zig_zag 阅读(811) 评论(1) 推荐(0)
bzoj1444 [Jsoi2009]有趣的游戏

摘要:这个题是一道AC自动机上的概率DP,可以帮助理解一下AC自动机的结构。 首先我们把所有的串插入trie,建立AC自动机,求一下转移函数(相当于构造一个trie图),那么就可以概率DP了。首先到达每个点的概率为变量,然后我们要求的就是到达接受状态(也就是每个串的结尾对应的状态)的概率。注意到了接受状态就不必往下转移了,因为游戏就此结束了。注意有一个限制是必须要加的,就是所有接受状态的概率和是1。如果不加的话,会得到所有点的概率等于0这个答案。那么我们就随便拿一个方程替换这个方程就好了。 1 #include<iostream> 2 #include<cstdio> 3 # 阅读全文
posted @ 2013-05-15 21:29 Zig_zag 阅读(1139) 评论(1) 推荐(0)
bzoj1449 [JSOI2009]球队收益

摘要:这是一道凸费用的题,需要用到拆边的转化。 具体是这样,首先列出关于流量xi的费用式子:f(xi)=ci*xi2+di*(si-xi)2=(ci+di)*xi2-2*di*si*xi+di*si 其中si表示i进行的总常数,xi表示胜场数(也就是规定的流量)。显然这样的式子是不能定费用的,但我们可以求一下每增加1的流量费用的改变量:f(xi)-f(xi-1)=(ci+di)*(2*xi-1)-2*di*si 这样我们可以把每1单位的流量设置一个费用,也就是把原来一条边拆成若干条边,第i条边如果对应第wi个胜场,那么它的费用应该是(ci+di)*(2*wi-1)-2*di*si,注意这里wi... 阅读全文
posted @ 2013-05-15 15:31 Zig_zag 阅读(458) 评论(0) 推荐(0)
poj3415 Common Substrings

摘要:一道字符串好题。网上大多解法是后缀数组+栈扫描,大致思想是按K分组以后统计s,t中不同公共字串的个数。但这种方法我实在是理解不能...... 其实,用后缀自动机来考虑这个题可能会好一点。首先,我们给S串建立后缀自动机,然后让T串在S串上跑一下匹配,这是后缀自动机的经典操作。这样我们可以求得T的每一位向前最大能匹配多少位,用这个数目来统计答案。但是有一个问题,就是假设T的某一位u匹配了x长度,那么有可能S中有多个位置对应和T的u匹配x长度,于是我们首先就要知道每个点对应多少重复的字串。这恰恰应用了后缀自动机第二个经典操作。 好,我们来理一下思路:首先,给S建自动机以后,我们用排序+递推的... 阅读全文
posted @ 2013-05-15 09:48 Zig_zag 阅读(350) 评论(0) 推荐(0)
三维偏序

摘要:贴个三维偏序的模板吧。注意清空bit的时候操作数不要和序列长线性相关。如果上一个题插入的数是无序的话,大概这么做就行了。 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #define maxn 200000 7 #define inf 2147483647 8 using namespace std; 9 struct point{10 int x,y,z,s;11 }a[max 阅读全文
posted @ 2013-05-14 08:56 Zig_zag 阅读(455) 评论(0) 推荐(0)
bzoj3144 [Hnoi2013]切糕

摘要:这个题是个挺经典的最小割。 这个题的关键是如何限制h之差不超过d。首先我们按高度分层,每层的点向下一层相同位置的点连边,边权设为点权(也就是说我们要多设一层),然后如果我们割掉这条边就意味着选择了下面这个点。然后,对于h之差的限制,我们把k+d层的点向k层的四周的点连+oo边,也就是说如果我们割掉了一条边,就不能选择+oo的边连接的上面的边,因为选择了这条边,如果再选择上面的边的话,就不能构成割了,因为流还是可以经过那条+oo的边流回来。其实类比一下最大权独立集的话,这条+oo的边的意义就是选了某个点以后,就不能选和它相差超过d的点了。 最后跑最小割就ok了。 1 #include... 阅读全文
posted @ 2013-05-13 22:04 Zig_zag 阅读(1155) 评论(0) 推荐(1)
bzoj3173 [Tjoi2013]最长上升子序列

摘要:这个题...被恶心到了。 如果插入的数是无序的话,貌似就要做三维偏序了= =,但这个题就不需要了哈。 其实,LIS是可以用bit做的,每次我们可以求出以当前插入的数为结尾的LIS长度,也就是查询x的前缀max,插入的时候把查询结果+1插入bit。我们看到,如果插入的数的递增的话,要么新的LIS是以x结尾,要么不变,于是扫一遍就好了。 但是我们得知道插入数的实际位置,怎么做?有一种比较简单的方法就是倒着扫序列,二分答案+bit,这个bit维护前缀和,也就是求比二分的位置小的数的个数,与插入位置相比。我一开始想的是直接用bit求比插入位置x小的数的个数,但这样是错的,因为插入这个数之前这... 阅读全文
posted @ 2013-05-13 21:49 Zig_zag 阅读(876) 评论(0) 推荐(0)
my APIO2013

摘要:Day1 到北京了,记不得上一次是什么时候来的了,看到拥堵的公路感觉还真是令人心烦。 第一次到北大,这里是万千中国学子梦想中的圣地。这里的一砖一瓦,和其它的大学基本无异,只是学术气氛比较浓厚吧。 然后就是三分懂得讲课了,记得老李说出来听课只是让你知道有这么个东西,然后回去自行解决。大概是这样吧,再认真也只能听个思路,具体实现的话还不知道要花多少工夫呢。不过同学们回答问题时候各种各样的方言还真是有趣啊,前辈们卖萌似乎也收到了不错的效果。 明天有一场考试,感觉不会很好应付吧,只求能够拿到会的分就行了,毕竟目标还是省选,但还是不要给山东丢脸的好...... 莫名的压力,伤感,我到底是怎么... 阅读全文
posted @ 2013-05-12 22:30 Zig_zag 阅读(620) 评论(0) 推荐(0)
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 阅读全文
posted @ 2013-05-07 23:17 Zig_zag 阅读(1138) 评论(0) 推荐(4)
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 阅读全文
posted @ 2013-05-07 23:10 Zig_zag 阅读(322) 评论(0) 推荐(0)
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 阅读全文
posted @ 2013-05-07 10:00 Zig_zag 阅读(274) 评论(0) 推荐(0)
bzoj2844 albus就是要第一个出场

摘要:这个题有了hdu3949那个题的基础就非常好做了,因为这两个题求得东西是对偶的....这次我们要求某个数是第几个出现的(不去重),那么我们只要知道它去重的排名,再乘上每个数重复的个数(2n-m),加上1就好了。还是高斯消元,不过要注意的是这里的高斯消元和普通的解xor线性方程还不一样,因为我们是要得到一组基数,代表从高到低的一些二进制位,所以我们要从最高位的元开始找,并且消的时候是对所有方程消元。注意我们是对数消元,用尽量少的数去代表尽量多的二进制位,所以这样消可以尽量地避免重复。最后求答案的时候,只要类似倍增地从大到小试,如果这位能取1就取,最后就得到了需要的排名。albus 1 #incl 阅读全文
posted @ 2013-05-07 08:16 Zig_zag 阅读(503) 评论(0) 推荐(0)
hdu3949 xor

摘要:这个题是用来研究xor性质的一道好题。首先我们可以暴力地找出些规律,我们发现不管拿出多少个数,他们能xor到的数,出现的次数都是一样的,并且都是2的倍数。事实上,我们不论用原数ai还是ai xor aj得到的数,去xor起来得到的数都是这些。这样我们可以想方设法地化简我们用到的基数,也就是找到一组基数使得它们能够xor出所有原数能xor出的数,并且要尽量简单。我们可以模仿高斯消元的过程,就是把每个数当成一行二进制数去消元,然后保留一个类似上三角的东西,从高位向低位每一行保留连续的几个1,这些1行与行之间是不重复的,但每一行之中还会有额外的一些1,这些1是可重复的,就造成了一些数是xor不出来的 阅读全文
posted @ 2013-05-07 08:09 Zig_zag 阅读(426) 评论(0) 推荐(0)
bzoj3105 [cqoi2013]新Nim游戏

摘要:传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同)。两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴。可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿。拿走最后一根火柴的游戏者胜利。本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴。可以一堆都不拿,但不可以全部拿走。第二回合也一样,第二个游戏者也有这样一次机会。从第三个回合(又轮到第一个游戏者)开始,规则和Nim游戏一样。如果你先拿,怎样才能保证获胜?如果可以获胜的话,还要让第一回合拿的火柴总数尽量小。【输入格式】第一行为整数k。即火柴堆数。第二行包含k个不 阅读全文
posted @ 2013-05-06 17:05 Zig_zag 阅读(815) 评论(0) 推荐(0)
Sset

摘要:神犇考题第三题:设 S ={x|x∈Z,1≤x≤n}给定 N 个 S 的子集 Si,每个集合有一个权值 Wi。这 N 个集合满足其中任意 K 个集合的并集中至少有 K 个元素。请从中选取若干个集合(可以不选),使得其并集的元素个数恰等于选取的集合数,且这些集合的权值和最小。考试的时候觉得这个题相比另外两个挺可写的,于是就使劲想,想出了最大权闭合图,想出了每个集合代表一个数字,可就是没想到把这两个联系起来,无奈,最后还是在包含关系的时候出搞错了,果然我还是太弱了,构造能力捉急。首先有一个非常有用的条件,就是任意k个集合的并集中至少有k个元素,那么,如果有一个合法的方案,那么一定可以用一个单独的元 阅读全文
posted @ 2013-05-04 16:21 Zig_zag 阅读(494) 评论(0) 推荐(0)
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& 阅读全文
posted @ 2013-05-04 15:03 Zig_zag 阅读(496) 评论(0) 推荐(0)
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 阅读全文
posted @ 2013-05-03 09:47 Zig_zag 阅读(364) 评论(0) 推荐(0)
bzoj2001 城市建设

摘要:bzoj崩了3天了......本人目前处在无题可交的状态,郁闷啊。不过TY复活了,看到以前写过的代码有点小激动。切入正题,这个题想了好久才写,主体还是分治,只是中间处理部分比较巧妙。这个题GYZ在wc上讲过,思路也很清晰,就是不太好写。过程主要分两个部分(我直接粘解题报告了):1. Contraction 把 L..R要修改的所有边权暂时标记为-∞; 对图做 MST; 此时观察图中不是-∞但被选入 MST的边集; 它们在 L..R的询问中也一定会被选入; 于是可以直接先用这些边把点集做合并操作。这样图的点数被缩小; 还原边权标记. 2. Reduction 把 L..R要修改的所有边权暂时标. 阅读全文
posted @ 2013-05-02 16:53 Zig_zag 阅读(956) 评论(0) 推荐(2)

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3