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

随笔分类 -  OI

上一页 1 2 3 4
bzoj 1486 最小圈

摘要:分数规划,搜索参数P,把边权调整成val-p,然后找负环,如果存在负环说明答案可行并且还存在更优解,搜到精度满足即可。minhoop 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #define maxn 10000 7 #define maxm 50000 8 using namespace std; 9 struct et10 {11 int s,t,next;12 doub 阅读全文
posted @ 2013-03-28 23:05 Zig_zag 阅读(251) 评论(0) 推荐(0)
Poj 2728 DK

摘要:最优比率生成树,参数搜索。建议去这里http://wenku.baidu.com/view/87ecda38376baf1ffc4fad25.html看看。我写的二分比较奇葩,精度调起来比较疼,弄到1e-6就ok了。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #define maxn 1024 7 #define inf 2147483646 8 using 阅读全文
posted @ 2013-03-28 23:02 Zig_zag 阅读(222) 评论(0) 推荐(0)
bzoj 2809 dispatching

摘要:一开始没想出来,想大概需要维护一下工资单调递增然后求和什么的,后来一查发现是splay启发式合并,于是我赶紧先去做了一下Neverland那个题,发下什么启发式合并其实就是暴力合并......表示无奈。这个题居然这么轻松就写过了,而且还是1A,代码居然比Neverland还短......就是维护一下sum工资和就行了,查找的话类比寻找第k小的数。dispatching 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #inclu 阅读全文
posted @ 2013-03-28 22:55 Zig_zag 阅读(231) 评论(0) 推荐(0)
bzoj 2733 永无岛

摘要:裸的splay启发式合并,其实就是用队列实现的暴力合并,轻松写过~Neverland 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #define maxn 200000 7 using namespace std; 8 9 int c[maxn][2]; 10 int fa[maxn],f[maxn],rank[maxn],size[maxn],q[maxn]; 11 int 阅读全文
posted @ 2013-03-28 22:52 Zig_zag 阅读(220) 评论(0) 推荐(0)
bzoj 2209 括号匹配

摘要:我们把左右括号用-1和1来替代,那么两个不同的括号可以相互抵消,但必须保证是闭合的"()",而不是扩散的")(",这样我们维护一下左右的最小最大值,那么最小值就是孤单左括号的,最大值就是孤单右括号的数目,答案就是(|左小|+右大)/2+(|左小|+右大)%2。注意取反和翻转的不同,需要用不同的方式来维护以上4个值。brackets 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #includ 阅读全文
posted @ 2013-03-28 22:51 Zig_zag 阅读(407) 评论(0) 推荐(0)
bzoj 1014 火星人

摘要:比较字符串?不好处理?我们想到用哈希来比较。每个节点记录它包括它的子树所表示的字符串的哈希值,这样我们可以通过二分长度,旋转出区间来判定。对于哈希值我们不必取特定的模数,只要让它乘爆就行,int就是模数。过程想清楚了就很好写了。prefix 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #define maxn 240000 7 #define inf 2147483647 8 阅读全文
posted @ 2013-03-28 22:46 Zig_zag 阅读(363) 评论(0) 推荐(0)
bzoj 1269 editor

摘要:这个题和维修数列一比就简单了许多,只要把所谓的光标处理好就OK 了,就是字符串处理的时候比较麻烦,需要多调试一下。这个题不用回收空间了,不过插入的时候还是要递归建树再插入,这样可以防止树的深度过大导致不平衡使得splay效率变差。editor 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #define maxn 2400000 7 #define inf 2147483646 阅读全文
posted @ 2013-03-28 22:42 Zig_zag 阅读(176) 评论(0) 推荐(0)
bzoj 1500 维修数列

摘要:Splay的BOSS级别的题目,几乎包含了所有区间维护的操作,对于想要提高代码熟练度的人来说这个题非常值得一写。首先我们要维护的域是:size,sum,la(左max),ra(右max),ma(整体max)更新的时候用这些域更新就行,注意下传的时候也要更新响应域值。对于那些恶心操作,我就挨个说一下吧:注:标准结构:区间右端点+1(R)为根,区间左端点-1(L)为根的左儿子,这样目标区间就是L的右儿子,这种形式以后都用"标准结构"代替。插入操作:先把需要插入的序列建成一个小平衡树(递归),转出标准结构,插到L的右儿子上就行了。删除操作:转出标准结构,把L的右儿子切下来就行了( 阅读全文
posted @ 2013-03-28 19:36 Zig_zag 阅读(1354) 评论(1) 推荐(2)
bzoj 1208 宠物收养所

摘要:这个题也是单点维护,不管来的是人还是狗,只要num=0就插入,否则就删除,想清楚了就很好写。Pets 1 const 2 maxn=100000; 3 ms=1000000; 4 var 5 c:array[0..maxn,0..1]of longint; 6 size,fa,key:array[0..maxn]of longint; 7 i,n,a,b,tot,sum,num,now,ans,tmp,rot:longint; 8 procedure update(x:longint); 9 begin 10 size[x]:=... 阅读全文
posted @ 2013-03-28 19:19 Zig_zag 阅读(244) 评论(0) 推荐(0)
bzoj 1503 郁闷的出纳员

摘要:Splay练手题,真正做起来不那么简单,虽然是简单的单点维护,但是删除的时候会比较恶心(吐槽一下,我就是因为一上来用这个题splay练手,调了半天没调出来,气死我了)。友情提示:刚进公司就被开的不算在最后的答案里(这公司真冷酷......)Teller 1 const 2 maxn=300000; 3 var 4 c:array[0..maxn,0..1]of longint; 5 fa,size,key:array[0..maxn]of longint; 6 n,i,a,limit,now,num,tot,sum,rot,tmp:longint; 7 sign:char; 8... 阅读全文
posted @ 2013-03-28 19:17 Zig_zag 阅读(286) 评论(0) 推荐(0)
bzoj 1093 最大半连通子图

摘要:这个题一定要把题意弄清楚,然后就是发现可以缩点搞,缩点了以后这个最大半连通子图就是一条最长的单向链。然后用类似树型dp的方法(这里是BFS更新答案),可以把答案求出来。注意缩点以后可能会有重边(参考proverbs大神的博客)如果用DFS更新dp的话,不好判断重边。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #define maxn 120000 7 #de 阅读全文
posted @ 2013-03-26 18:33 Zig_zag 阅读(356) 评论(0) 推荐(0)
bzoj 1202 狡猾的商人

摘要:这个题一开始以为是线性规划,但实际上是类似用并查集维护连通信息的题目。我们先给t+1,这样[s,t]的区间就可以连起来了,那么只要来了一组[s,t]曾经连通过,并且维护的区间值和原来不一样,那么一定是假的。那么怎么维护区间值呢,我们合并的时候,把t的父亲连到s的父亲上,在t的父亲上存一个t的父亲到s的父亲的区间值也就是:g[ft]=g[s]+z-g[t];路径压缩的时候,同时更新g的值,这里注意一个细节:先路径压缩,在用g[f[i]]更新g[i]值,我在这里一直WA。View Code 1 #include<iostream> 2 #include<cstdio> 3 阅读全文
posted @ 2013-03-26 18:27 Zig_zag 阅读(240) 评论(0) 推荐(0)
bzoj 1797 mincut

摘要:有点偏向结论性质的题。最小割是把图分成S和T两个互不联通的部分,切割的总容量的小小值。论文里说过,在最小割里的边一定是满流边但漫流边不一定是最小割里的边。有了这两个性质,我们可以这么想,如果这个边的两端同在S或T里的话一定不成立。于是,我们在残量图里跑tarjan,一定可以得到被切割后的几个联通块,如果两个点在同一个联通分量里,那么这条边一定不是最小割边。如果这条边分别联通S,T这两个联通分量,并且满流的话,那么这条一定是最小割的边。解释的不是很清楚,总之最重要的是对最小割的理解。mincut 1 #include<iostream> 2 #include<cstdio> 阅读全文
posted @ 2013-03-20 20:35 Zig_zag 阅读(287) 评论(0) 推荐(0)
bzoj 1016 最小生成树计数

摘要:首先能发现一个规律,就是重构最小生成树的时候,一定不可能用一条权值较大的边和一条权值较小的边去替换他们中间的两条边。简而言之,就是只能权值相同的边相互替换。再进一步说,就是每种权值的边的数目是一定的。 题目上说值相同的边最多10条,那么我们可以DFS选哪些,然后用并查集来判断是否成环。这里要注意,我们先kruskal把每种边选几条求出来,再按kruskal的顺序dfs每一种,每dfs一种,我们就要把这些边连起来(也就是边dfs边kruskal),这样可以确保求出每种边的组合是合法的。最后把它们乘起来就行了。 看一些题解上说如果相同的边多了要用矩阵,表示不太懂......minmst... 阅读全文
posted @ 2013-03-19 22:53 Zig_zag 阅读(284) 评论(0) 推荐(0)
bzoj 2594 水管局长数据加强版

摘要:其实这个题就是用LCT动态地维护一棵最小生成树..如果正着做的话,会发现删边以后扫边表找边会很疼,于是我们反着想。因为没要求在线,那么我们从后往前看,如果删掉那些询问里的边以后,我们求出了一棵MST,那么其他的边就永无翻身之日了。然后就无视它们好了。用lct维护边的话依然很恶心,那么我们把边变成点(参考某神题解),这样添加和删除就直接在这个代表边的点上做就行了吧。那么我们只需要记录一下每个询问的两个点之间的边是哪个点就行了。一开始做MST的时候,用不着findroot用并查集就行了。注意修改的时候要判断加的这条边和这两点间的最大边的大小。可是,超时了......pascal选手的无奈。花了1个 阅读全文
posted @ 2013-03-19 22:44 Zig_zag 阅读(451) 评论(0) 推荐(0)
bz1007&bz1038维护半平面

摘要:做了两个几何题,思路比较相近。bz1007水平可见直线:如果从无线高处往下看,只有没被遮挡直线可以被看见(废话..),那么怎么算不被遮挡呢?因为直线是无限延伸的,所以斜率最大和最小的一定不会被挡住。那么我们可以吧直线按照斜率排一下看上图,k,j,i是按斜率排好的3条线,注意如果红点在蓝线一边的时候,j会被i挡住,在另一边时就不会被挡住。那么我们只要按那个顺序依次进栈,判断后进的是否挡住之前的,挡住了就把前面的踢掉,最后我们就得到了一堆直线组成的队列。它们一定能被看见。bz1038瞭望塔这个题和上面那个很像,也就是说,我们如果把山坡延长一下,就可以得到若干条直线,我们如上题一样操作,便可得到一堆 阅读全文
posted @ 2013-03-17 08:15 Zig_zag 阅读(227) 评论(0) 推荐(0)
bz1798: [Ahoi2009]Seq

摘要:线段树维护区间,比较好像,思路清晰一点的话可以很快地写出来。维护4个域:add,加标记mul,乘标记size,范围大小key,区间和考虑4种情况:++,**,*+,+*前3种显然直接搞一下就行了,在区间上打标记(这里我们设置是打了标记的同时计算区间和)。先加在乘需要想想,对于一个X+C的式子,如果在外面乘了一个D的话成了D(X+C),去括号变成DX+DC,于是第4种情况既要修改乘标记,又要修改加标记。注意,乘和加标记代表的都是给区间的每一个数乘或加一个数,所以mul对key的影响是key*mul,而add的影响是key+add,注意永远是先乘再加。最后就是注意一下数组下标不要越界,数不要撑爆( 阅读全文
posted @ 2013-03-15 23:16 Zig_zag 阅读(314) 评论(0) 推荐(0)
莫队算法初步

摘要:莫队算法,搞定!思路很简单:对于每个询问,我们把它看成(l[i],r[i])这样一个平面上的点,那么询问之间的转移可以看成点之间的曼哈顿距离。那么我们要找到最小的距离怎么做呢?1.曼哈顿路径,这个不好搞。2.曼哈顿最小生成树,据说这个的权和是1的2倍,总之可以搞。那么我们先要搞定manhattan最小生成树。如有n个点,那么复杂度是n^2的。这样肯定不行。根据定理,每个点出发向8个方向的范围内最多只与一个点相连,那么我们只要想这8个点连边建图,这样只会有8n条边(去重了还剩4n),把这个图建出来,最小生成树就很好搞了。给个链接:http://wenku.baidu.com/view/1e487 阅读全文
posted @ 2013-03-15 18:33 Zig_zag 阅读(2852) 评论(0) 推荐(0)

上一页 1 2 3 4
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3