摘要:
分数规划,搜索参数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 阅读全文
摘要:
最优比率生成树,参数搜索。建议去这里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 阅读全文
摘要:
一开始没想出来,想大概需要维护一下工资单调递增然后求和什么的,后来一查发现是splay启发式合并,于是我赶紧先去做了一下Neverland那个题,发下什么启发式合并其实就是暴力合并......表示无奈。这个题居然这么轻松就写过了,而且还是1A,代码居然比Neverland还短......就是维护一下sum工资和就行了,查找的话类比寻找第k小的数。dispatching 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #inclu 阅读全文
摘要:
裸的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 阅读全文
摘要:
我们把左右括号用-1和1来替代,那么两个不同的括号可以相互抵消,但必须保证是闭合的"()",而不是扩散的")(",这样我们维护一下左右的最小最大值,那么最小值就是孤单左括号的,最大值就是孤单右括号的数目,答案就是(|左小|+右大)/2+(|左小|+右大)%2。注意取反和翻转的不同,需要用不同的方式来维护以上4个值。brackets 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #includ 阅读全文
摘要:
比较字符串?不好处理?我们想到用哈希来比较。每个节点记录它包括它的子树所表示的字符串的哈希值,这样我们可以通过二分长度,旋转出区间来判定。对于哈希值我们不必取特定的模数,只要让它乘爆就行,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 阅读全文
摘要:
这个题和维修数列一比就简单了许多,只要把所谓的光标处理好就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 阅读全文
摘要:
Splay的BOSS级别的题目,几乎包含了所有区间维护的操作,对于想要提高代码熟练度的人来说这个题非常值得一写。首先我们要维护的域是:size,sum,la(左max),ra(右max),ma(整体max)更新的时候用这些域更新就行,注意下传的时候也要更新响应域值。对于那些恶心操作,我就挨个说一下吧:注:标准结构:区间右端点+1(R)为根,区间左端点-1(L)为根的左儿子,这样目标区间就是L的右儿子,这种形式以后都用"标准结构"代替。插入操作:先把需要插入的序列建成一个小平衡树(递归),转出标准结构,插到L的右儿子上就行了。删除操作:转出标准结构,把L的右儿子切下来就行了( 阅读全文
摘要:
这个题也是单点维护,不管来的是人还是狗,只要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]:=... 阅读全文
摘要:
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... 阅读全文