摘要:
http://www.codeforces.com/contest/86/problem/D 跟很久之前的集训题目小Z的袜子一样的题目,没法通过什么数据结构有效的解决。不过有个通用的解法,莫队算法,可以把询问的区间[l,r]看成平面图上的点(l,r),则我们需要找一条哈密顿路径(只需要遍历所有的点,不是严格哈密顿),从点(x1,y1)->(x2,y2)需要修改的复杂度可以认为是abs(x1-x2)+abs(y1-y2),于是总复杂度相当于这条路径的曼哈顿距离和。求最小的距离和我不会,但是可以把问题转化成求的曼哈顿最小生成树,有证明该树权值和不超过n*sqrt(m),遍历该树所有点的路径的 阅读全文
摘要:
http://www.codeforces.com/problemset/problem/13/E题目意思很简单给你连续的n个洞(n<=10^5), 扔一个小球进入第i个洞中,则小球将立刻弹到i+a[i]号洞内,再到i+a[i]+a[i+a[i]]....直到弹出所有洞穴。同时题目给你两种操作,1种是改变某个a[i]的值,第二种是询问一开是小球扔进i号洞一个共会弹几次。很显然小球弹的路线会组成一个树状结构,修改某个a[i]就是把某棵子数挂到另外一个根上,询问可以简单看成某个节点的深度。。。似乎动态树可以完美解决这个问题,除了一点。。。就是我还不会动态树。=。=~。。于是只能另找它法,瞄了 阅读全文
摘要:
http://codeforces.com/problemset/problem/115/E题目大意,给你1~n段路,每段路修好需要一定代价,同时给m个区间,如果连续修好li~ri的所有路就可以获得pi的收益,询问最大利润。想了一会,发现除了暴力的dp没有其他办法,但是10^5级别让n^2的dp无能为力,后来看到题目旁边datastruct+dp的提示,想到用线段树来优化dp的方法。k表示当前区间,dp[i]:表示从第i段路修到当前路段全部修好的最大收益。如果某一个比赛区间[Li,Ri]右端点刚好为当前区间,则显然dp[1]~dp[Li] 全部要加上pi;再考虑当前区间移到下一个区间时候,dp 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4466 很好玩到一道题。 View Code 1 //By Lin 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 #define maxL 5000000 7 #define MOD 1000000007 8 #define sqr(x) ((x)*(x)) 9 using namespace std;10 typedef long long L 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4453 普通的splay,但是出题人很无聊的给题目加上了很多限制,使得双向链表也可以处理,但是我还是比较喜欢splay这种数据结构,试了一下现在手写无压力。。hdu4453_splay 1 //By Lin 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define maxn 100050 6 using namespace std; 7 8 struct SplayNode{ 9 Splay 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4457 这个题目在现在看到就发现是一个赤裸裸到暴搜题,比赛时候由于最后只剩下40分钟给我,最后只写完一个最基本到广搜,赛后听说隔壁到师兄双向广搜就pass了=。=~ 今天看到决定把它切掉,一开始写了一个双向广搜,TLE了。之后仔细一想对于20*20的数据,如果每个块大小都只是1*1一共10个块如果没有剪,由于状态数太多是不可能通过到。简单试验一下果然10*10就无可救药了,于是重写了一个A*+卡节点的版本,简单的用曼哈顿距离和做启发函数,每层卡了5000个节点,4900ms险险通过。。双向广搜 1 //By. 阅读全文