bzoj1878
    
                
摘要:像我这种蒟蒻这道题从在线算法思考基本毫无思路但是发现题目中只涉及到询问而不涉及到修改,这类题目一般都是离线算法大概考虑到这题为什么不能直接区间求值,因为区间中同色点会被重复计算(废话)下面我们就要通过离线算法来排除区间内同色点干扰首先想到对询问区间以左端点排序,考虑到区间内的同色点我们只要算最左边的...
        
阅读全文
                    posted @ 
2014-07-27 17:40 
acphile
        
阅读(248) 
         
        推荐(0)     
                 
                
                
    bzoj1085
    
                
摘要:肯定是搜索题无疑问,首先要求在15步以内(包括15步)到达目标状态,也就是限定了搜索的深度,于是我们用dfs更合适但这样复杂度仍然太大,原因就是我们在搜索中做了很多很不优的尝试考虑当前状态若与目标状态有x处不相同,我们至少要移动x-1步才能成功如果当前移动次数+x-1>=已找到的最小移动次数(没找到...
        
阅读全文
                    posted @ 
2014-07-27 16:13 
acphile
        
阅读(299) 
         
        推荐(0)     
                 
                
                
    bzoj1004
    
                
摘要:等价类计数问题首先要构造出群首先,给出的洗牌法就相当于置换,再加上置换(1)(2)(3)……(n),可以构成一个包含m+1个置换的置换群;这里要解释一下构成置换群的四个条件封闭性 任意两个置换相乘所得的置换还在群内 题目中已经给定保证任意多次洗牌都可用这m种洗牌法中的一种代替结合性 显然置换相乘本身...
        
阅读全文
                    posted @ 
2014-07-26 17:58 
acphile
        
阅读(187) 
         
        推荐(0)     
                 
                
                
    poj1286
    
                
摘要:等价类计数问题,我们就先构造置换群显然置换分为两种类型,旋转和翻折先考虑旋转,每旋转i格子,这个置换的循环数为gcd(i,n); (1-1 do18 begin19 if n=0 then writeln(0)20 else begin21 ans:=0;22 for i:=1...
        
阅读全文
                    posted @ 
2014-07-26 10:38 
acphile
        
阅读(144) 
         
        推荐(0)     
                 
                
                
    poj3270
    
                
摘要:终于把这个很久以前拖下来的问题解决了回忆一下,最少相邻交换次数等于逆序对数这里求的是最少交换代价(非相邻元素也可以交换);先考虑最少交换次数这个问题首先把现在数列看成原数列{1,2,3……n}的一个置换根据置换的理论,每一个置换都能拆成唯一的互不相交的循环显然最小交换次数是在每个循环内部交换达成的在...
        
阅读全文
                    posted @ 
2014-07-26 10:15 
acphile
        
阅读(185) 
         
        推荐(0)     
                 
                
                
    bzoj1079
    
                
摘要:50%的数据很好考虑,基本的dp了 关键到了100%,如果用每种颜色有ci种这种常规的写法,显然5^15会爆空间 考虑到反过来,ci<=5, 15^5是不会爆空间的 又想到,每一种颜色,如果数量相同的话,其实是等效的。 这样我们不难想到用f[a,b,c,d,e,last]表示剩余颜色数量(就是还能刷
        
阅读全文
                    posted @ 
2014-07-26 09:24 
acphile
        
阅读(221) 
         
        推荐(0)     
                 
                
                
    bzoj2754
    
                
摘要:看到这道题一开始想到的是后缀数组+二分+rmq 类似bzoj3172 问每个串i在合并后的串出现了多少次 等价于有多少个后缀j,使得LCP(i,j)>=length(s[i]) 但是想想又不对,要求求的是有多少人被点到,每个人点到多少次 可能有多个后缀j满足条件但其实都是一个人的名字的一部分 好像二
        
阅读全文
                    posted @ 
2014-07-24 15:28 
acphile
        
阅读(177) 
         
        推荐(0)     
                 
                
                
    bzoj1858
    
                
摘要:比较烦的线段树 首先询问3很弱智不说, 询问4以前做过类似的,好像是USACO月赛hotel那题类似,维护lmax,rmax,max三个域就可以了 操作0,操作1也很简单,仔细考虑一下就知道也是可以lazy tag的 重点是操作2,好像数据结构题中翻转总是一个难点 由于翻转影响对询问4影响较大(对询
        
阅读全文
                    posted @ 
2014-07-22 21:12 
acphile
        
阅读(195) 
         
        推荐(0)     
                 
                
                
    bzoj1025
    
                
摘要:我觉得很有思维含量的一道题 首先根据置换的知识, 每一个置换都可以表示成若干不想交的循环的乘积 所有循环的规模A1+A2+……AK=n 显然要求可能的排数,就是问n拆分成若干个数其可能的最小公倍数的个数 考虑到任意一个数大于1的自然数X一定能这样分解 令p为质数数组 X=p1^m1*p2^m2*…p
        
阅读全文
                    posted @ 
2014-07-19 21:39 
acphile
        
阅读(644) 
         
        推荐(0)     
                 
                
                
    bzoj1046
    
                
摘要:首先这肯定是一道LIS的变形,这次求的是方案,还要求字典序最小 (注意这个字典序最小是指下标最小而不是数最小) 首先预处理以每个数为首,能组成多长的上升序列(这里我们用单调队列解决) 然后按照位置顺序扫一遍顺出可行即可 要注意每行末的空格 1 var f,a,q:array[0..10010] of
        
阅读全文
                    posted @ 
2014-07-19 20:48 
acphile
        
阅读(180) 
         
        推荐(0)     
                 
                
                
    bzoj1296
    
                
摘要:首先先预处理每行刷1~m次最多能正确涂出多少格 然后把每行涂色看做一个物品,当重量为j(这行涂了j次),价值为对应能正确涂出的格子数; 总重量为k,然后做分组背包即可 1 var f:array[0..60,0..60,0..60] of longint; 2 sum:array[0..60,0..
        
阅读全文
                    posted @ 
2014-07-19 20:09 
acphile
        
阅读(128) 
         
        推荐(0)     
                 
                
                
    bzoj列表3
    
                
摘要:水题列表 bzoj2429 裸的最小生成树 bzoj1567 二分答案+hash判断,判断序列、矩阵是否相同常用hash bzoj1087 简单的状压dp bzoj1754 高精度乘法,模拟竖式即可
        
阅读全文
                    posted @ 
2014-07-19 15:54 
acphile
        
阅读(101) 
         
        推荐(0)     
                 
                
                
    bzoj1293
    
                
摘要:维护一个小根堆,先把每种珠子的出现第一个位置放入堆中,每次取出彩带最左边的珠子 放入取出同类珠子的下一颗同种类的珠子,并且更新彩带最优解。 直到取出的珠子是这类珠子的最右边的一颗时候结束 1 type link=^node; 2 node=record 3 loc:longint; 4 next:l
        
阅读全文
                    posted @ 
2014-07-19 15:53 
acphile
        
阅读(165) 
         
        推荐(0)     
                 
                
                
    bzoj2208
    
                
摘要:首先有向图的题目不难想到先tarjan缩点 一个强连通分量中的点的连通数显然是相等; 据说这样直接dfs就可以过了,但显然不够精益求精 万一给定的是一个完全的DAG图怎么办,dfs铁定超时; 首先想,dfs进行了很多不必要的操作,比如说i >j 那么j的连通数一定也是i的连通数,但我们做dfs是需要
        
阅读全文
                    posted @ 
2014-07-19 15:42 
acphile
        
阅读(206) 
         
        推荐(0)     
                 
                
                
    bzoj1196
    
                
摘要:带有限制的生成树 首先不难想到二分答案转化为判定性问题 假设二分出了一个答案p, 首先我们先考虑建一级公路。 由于一级公路费用是大于二级公路的,所以对于那些一级公路花费<=p的道路, 不难想到让他们建一级公路显然更合适。 如果能建一级公路的建道路数>=k 并且再选择二级公路能选到n-1条,说明答案可
        
阅读全文
                    posted @ 
2014-07-19 14:47 
acphile
        
阅读(274) 
         
        推荐(0)     
                 
                
                
    poj1988
    
                
摘要:知道了并查集写的问题后,我也明白了为什么之前这道题TLE的原因; 有这道题的合并操作不难想到用并查集维护; 由于并查集易于向上查询而不易于向下查询 所以对于询问方块x下面有多少个方块,我们可以转化为立方柱的规模-x上方的方块数-1 所以我们可以再维护这两个域即可 1 var fa,s,up:arra
        
阅读全文
                    posted @ 
2014-07-19 13:21 
acphile
        
阅读(129) 
         
        推荐(0)     
                 
                
                
    bzoj2753
    
                
摘要:第一问dfs不说 第二问很容易让人想到最小树形图,但是我不会,而且时间复杂度也不允许 还有什么不同的方法呢? 首先想到的是prim的思想,设根节点已经确定,其他点未确定 我们就不断从已确定的点延伸,找到到未确定点中高度最高的那个点的最短边距(如果有多个高度相同的点,肯定选边距最短的) 将边距加入an
        
阅读全文
                    posted @ 
2014-07-19 13:15 
acphile
        
阅读(207) 
         
        推荐(0)     
                 
                
                
    bzoj1821
    
                
摘要:题目要求最近的两个部落间距尽可能最远 不难想到一种贪心的方法,对每两个点之间距离从小到大排序, 把每个点看成一个部落 然后不断将距离近的两个部落合并成一个部落,直到剩下了k个部落,那么下一条不同部落之间的边的长度就是答案 显然这个算法是用并查集实现 1 type node=record 2 x,y:
        
阅读全文
                    posted @ 
2014-07-19 11:43 
acphile
        
阅读(200) 
         
        推荐(0)     
                 
                
                
    poj3037
    
                
摘要:首先到每个点的速度实际上是一个定值,就是v0*2^(起点与当前点高度差) 所以当前点i到任意一个相邻点的时间都是一个定值, 不难想到构图最短路径 1 const dx:array[1..4] of integer=(-1,1,0,0); 2 dy:array[1..4] of integer=(0,
        
阅读全文
                    posted @ 
2014-07-19 11:16 
acphile
        
阅读(220) 
         
        推荐(0)     
                 
                
                
    bzoj1084
    
                
摘要:乍一看这题好难,根本不会; 直到看到1<=m<=2…… 显然分类讨论dp, 很快想到这题的dp和poj2430相类似 m=2的时候f[i,j,k]表示到第i行用了j个矩阵结尾状态为k时最大权值和 k=0~4表示5种结尾可能的状态 转移很类似poj2430,这里就不赘述了 1 const inf=10
        
阅读全文
                    posted @ 
2014-07-19 11:11 
acphile
        
阅读(121) 
         
        推荐(0)     
                 
                
                
    bzoj3171
    
                
摘要:不难发现,每个点出度显然为1,要想整个图形成环,必然每个点的入度也为1; 所以,不难想到将每个点i拆成两个点i1,i2构成二分图, 连边s >i1 流量为1,费用为0,i2 >t流量为1,费用为0 这样左右两边的点都只能匹配1次,也就满足了出入度为1; 对于点i的上下左右4个点,分别连i1 >j2,
        
阅读全文
                    posted @ 
2014-07-19 11:00 
acphile
        
阅读(178) 
         
        推荐(0)     
                 
                
                
    bzoj2661
    
                
摘要:不难想到,先枚举建图然后跑最大费用最大流 也不难想到一种将每个数拆成两个点i1,i2,所有满足条件的数之间 把所有满足条件之间的数x,y连边x1 >y2,y1 >x2,流量为1,费用为(x+y) 相当于流量费用都变成了原来的2倍 最后再除一下即可 1 const inf=10000007; 2 ty
        
阅读全文
                    posted @ 
2014-07-15 23:14 
acphile
        
阅读(188) 
         
        推荐(0)     
                 
                
                
    bzoj1930
    
                
摘要:一开始我觉得这不是一个弱弱的费用流吗? 每个豆豆拆点,入点出点随便连连 由于肯定是DAG图,边权为正的最大费用肯定能增广出来 于是我们只要跑总流量为2的最大费用最大流不就行了吗 但是 这样会TLE,因为会出现稠密图,spfa跑稠密图太慢 既然这样,能不能换一个找增广路的方法呢? 最大路径更快的方法就
        
阅读全文
                    posted @ 
2014-07-15 23:07 
acphile
        
阅读(187) 
         
        推荐(0)     
                 
                
                
    bzoj1054
    
                
摘要:弱弱的搜索题, 我的做法是将矩阵看做二进制然后用位运算来做的,感觉比较舒服 1 const dx:array[1..4] of integer=(-1,1,0,0); 2 dy:array[1..4] of integer=(0,0,-1,1); 3 4 type node=record 5 po,
        
阅读全文
                    posted @ 
2014-07-15 22:37 
acphile
        
阅读(188) 
         
        推荐(0)     
                 
                
                
    poj3678
    
                
摘要:题目给的太裸,显然2sat; 还是用i表示xi=true(1), i+n表示xi=false(0) 这题唯一要说的是一种情况,当xi必须=true或xi必须=false这种情况下怎么弄 比如这道题出现的 假如条件要求xi or xj=0 那么 除了i+n >j+n ,j+n >i+n这两条边外 显然
        
阅读全文
                    posted @ 
2014-07-15 22:35 
acphile
        
阅读(376) 
         
        推荐(0)     
                 
                
                
    poj2749
    
                
摘要:万变不离其宗 只要搞清楚题目的基本模型 搞清楚边是一种推导出的关系 搞清楚里面的逻辑关系 那就没什么难的了…… 二分+sat,没什么好说的 1 const inf=100000007; 2 3 type node=record 4 5 point,next:longint; 6 7 end; 8 9
        
阅读全文
                    posted @ 
2014-07-13 21:44 
acphile
        
阅读(241) 
         
        推荐(0)     
                 
                
                
    bzoj1670
    
                
摘要:第一道凸包 采用Andrew算法,不论实现还是理解都非常简单 1 var q,x,y:array[0..5010] of longint; 2 i,j,k,m,n:longint; 3 ans:double; 4 5 procedure swap(var a,b:longint); 6 var c:
        
阅读全文
                    posted @ 
2014-07-12 20:47 
acphile
        
阅读(178) 
         
        推荐(0)     
                 
                
                
    poj2723
    
                
摘要:把每对钥匙看做一个变量,那两个钥匙看做他的两个状态 每一个开门的要求就是一个条件(xi or xj) 很显然有了2sat的基本要素 2sat是一个判定性问题,而这题求最多能过几个门; 不难想到二分答案,转化为判定性问题可轻松解决 1 type node=record 2 next,point:lon
        
阅读全文
                    posted @ 
2014-07-12 20:44 
acphile
        
阅读(122) 
         
        推荐(0)     
                 
                
                
    bzoj1823
    
                
摘要:第一道2sat, 其实2sat问题不难,只要记住一个:通过“推导出”连边 什么意思呢?就是一般题目中的变量都有两个状态,只能取一个,我们定义为true和false 对于每一个变量i,我们都拆成两个点,分别表示两种状态,设2i表示true,2i+1表示false。 然后来看每个条件,比如要满足xi=t
        
阅读全文
                    posted @ 
2014-07-12 20:39 
acphile
        
阅读(129) 
         
        推荐(0)     
                 
                
                
    bzoj1443
    
                
摘要:首先要思考的问题肯定是,什么点可以是ans, 不难想到对图黑白染色,假如一个棋子不管怎么走,都只能走到和它同色的点上时,这就是一个ans 再考虑,每次棋子的移动都是黑白相间的 再考虑,黑白染色是可以构成一个二分图的 不难想到,二分图上的增广路。 于是第一问就很好解决,我们构建二分图做最大匹配, 如果
        
阅读全文
                    posted @ 
2014-07-06 19:18 
acphile
        
阅读(479) 
         
        推荐(0)     
                 
                
                
    bzoj2039
    
                
摘要:还是同一类最小割问题 对于只要记住,建图是来最小化损失, 最大化收益是所有收益-最小取不到的收益 首先对于每个经理i,如果不取,必然有signma(w[i,j])收益会得不到(这里我们先不考虑额外的损失); 如果取,必然会损失a[i](其实这个也不是收益,只是我们最后用sum-mincut时,sum
        
阅读全文
                    posted @ 
2014-07-06 17:52 
acphile
        
阅读(165) 
         
        推荐(0)     
                 
                
                
    bzoj1103
    
                
摘要:其实这道题和以前在poj上做过的将树映射到树状数组的题目很像 首先不难想到,将一条边从土路修成公路,只对以这条边连接的孩子结点为根的子树有影响; 于是和之前那道poj的题目很像,后序遍历树,对每个节点重标号,每个点初始值就是深度 下面的问题就变成了: 土路修成公路 >区间修改 查询从点1到某个点所经
        
阅读全文
                    posted @ 
2014-07-06 17:34 
acphile
        
阅读(154) 
         
        推荐(0)     
                 
                
                
    bzoj1056
    
                
摘要:花了一上午大概复习了一下splay,treap 像这种裸的数据结构题在js应该会越来越少 不过练练手也好, 这就是平衡树+hash,如果这是单纯的BST应用,还是写treap吧,好调试 1 const rd=250008; 2 ran=10000007; 3 4 type link=^node; 5
        
阅读全文
                    posted @ 
2014-07-05 23:06 
acphile
        
阅读(201) 
         
        推荐(0)     
                 
                
                
    bzoj2763
    
                
摘要:首先是稀疏图,不难想到dij+heap 观察题目可以知道,0<=k<=10; 所以比较裸的想法就是,d[i,j]表示已经免费了i条线路后到达j的最短路 容易得到 d[i,j]:=min(d[i,j],d[i-1,k]); d[i,j]:=min(d[i,j],d[i,k]+w[k,j]); 然后在做
        
阅读全文
                    posted @ 
2014-07-05 22:49 
acphile
        
阅读(136) 
         
        推荐(0)     
                 
                
                
    bzoj1922
    
                
摘要:首先机器人是并行的; 很容易想到到某个点的最短用时 =max(到这个点的最短路,max(到保护这个点结界所在点的最短用时)) 所以我们在做dij的时候,d[j]维护最短路,w[j]维护所有保护这个点结界所在的点的最短用时的最大值 在做最短路松弛的时候,我们肯定是要加一个优先条件即这个点没有结界保护了
        
阅读全文
                    posted @ 
2014-07-05 22:38 
acphile
        
阅读(246) 
         
        推荐(0)     
                 
                
                
    bzoj1705
    
                
摘要:话说这题很久以前就写过,然后好像一直忘了写题解…… 以前看这道题还觉得挺难的,现在觉得好水 首先朴素的想法肯定是动归 f[i,j]表示到处理到第i根电线,最终高度为j的最小花费 f[i,j]:=min(f[i-1,k]+sqr(h[i]-j)+abs(j-k)*c) (h[i]<=j<=max) m
        
阅读全文
                    posted @ 
2014-07-05 22:31 
acphile
        
阅读(211) 
         
        推荐(0)