- 博客(44)
- 资源 (1)
- 收藏
- 关注
原创 【最小点覆盖(树形dp)】PKU-3659-Cell Phone Network
题意:一棵树,,删掉一个节点,,可以消灭自己和与其相邻的节点,,,问最少删掉几个节点可以消灭所有的节点?思路:树形dp,分三个状态,首先dp[i][j]表示以这点为跟的子树的后代都被消灭了,而dp[i][0]不删除且不被其相邻的点消灭,dp[i][1]表示这点不删除但被其相邻的点消灭,dp[i][2]表示这点删除,然后就是不同状态之间的转移了,具体看代码。题目#include#i
2012-04-18 02:17:55
650
原创 【容斥原理】HDU-1796-How many integers can you find
题意:问1-n范围内(小于n)的数有多少个能够整除一个集合{a,b,……}里任意一个数。思路:容斥原理的模板题,直接上模板了。题目#include#include#include#include#include#include#include#include#includeusing namespace std;#define LL long longint
2012-04-18 02:05:34
869
原创 【二维单调队列】FZU- Problem 2080 最大差值
题意:给出一个n*m的矩阵,要求求出它所有r*c子矩阵里面的元素的最大值减最小值的差的最大值。思路:二维的单调队列维护,时间复杂度为O(n^2)。题目#include#include#include#include#include#include#include#include#includeusing namespace std;#define N 1005
2012-04-18 01:56:55
1071
原创 【数论(扩展的欧几里德)】ZOJ-3593-One Person Game
一道变形的数论题,用到了扩展的欧几里德,具体看代码,另附上某大牛的解析:点击打开链接题目#include#include#includeusing namespace std;#define LL long longstruct euclid{ LL x,y,d;};LL labs(LL x){ if(x<0)return -x; return
2012-04-11 09:56:04
1030
原创 【dp+数论】PKU-3420-Quad Tiling
题目要求用2x1的小长方形去填满一个4xN的大长方形,问有多少种填法……如果数据不大,那完全就是一道很裸的状态压缩dp,不过这题数据大得惊人,所以就想到了矩阵的快速幂相乘,不过找相邻之间的关系那里还是挺麻烦的,这里就贴上以为牛人关于用一个dfs来找关系的解析点击打开链接。题目#include#include#include#includeusing namespace std;
2012-04-09 16:06:28
563
原创 【博弈+数论】ZOJ-3591-Nim
在比赛时一直弄不出这道题,虽知是博弈要用到异或运算,但在找连续的一串数时没什么好的想法,于是就悲剧了……赛后,在广大last大牛的指点下终于把它给过了,总的来说还是太水了……思路:先设sum=(n+1)*n/2,从左到右求出1到i的nim(即1-i异或得到的数),然后把nim[i]从小到大排序,接下来就找到每一段相同的nim数的长度len,用sum-=len*(len-1)/2,当,nim[i
2012-04-09 14:52:02
757
原创 【数论】HDU-4196-Remoteland
题意:取x个不大于n的数相乘出一个最大的完全平方数!这里点击打开链接有某大牛的题解,我就不再累赘了。题目#include#include#includeusing namespace std;#define LL long long#define N 10000000#define mod 1000000007bool flag[N+5];int cnt,prime
2012-04-04 23:50:42
871
原创 【Floyd求无向图的最小环】PKU-1734-Sightseeing trip
Floyd算法就是通过n次枚举中间点k来使i到j的距离松弛为最短,而本题就是在枚举k的时候找环,具体思路见代码!题目#include#include#includeusing namespace std;#define inf 999999#define N 105int n,len,ans,map[N][N],dis[N][N],post[N][N],path[N];v
2012-04-01 18:59:41
671
原创 【dp】HUST-1351-Group
很好的一道dp,它的状态转移真的是太巧秒了!题意:给出一段数列,要求你将这段数列分割成最多k段且每段的个数不能少于l的数列,然后求一个和,它是由一段中所有数字的总和乘以这一段的段数,即这一段是第几段,然后把所有这样的和加起来得到的,问这个和最小是多少!思路:先用sum[i]数组表示1到i这段数列的总和,数组dp[i][j],表示的是将1到j这段数组分割成i段的最小值。所以状态转移为:t
2012-04-01 09:21:36
576
原创 【Floyd求最短路+快速幂】PKU-3613-Cow Relays
这题很好的综合了图论和数论的知识来解题,这种转化综合的思维我要好好地加强训练才行……其实这里明白到一点就可以很好地知道它们之间是怎么转化的,当map[i][j]表示i到j的最短路径,map[j][k]表示j到k的最短路径,且是经过n条路时,那么i到k的最短距离且经过2*n条路就一定是map[i][j]+map[j][k]了!题目#include#include#include
2012-04-01 00:15:26
560
原创 【矩阵快速幂相乘求Fibonacci 数列】PKU-3070-Fibonacci
赤裸裸的模板题,具体思路就看代码吧!题目#include#include#includeusing namespace std;#define mod 10000struct matrix{ __int64 a[2][2]; void init() { for(int i=0;i<2;i++) {
2012-03-31 23:56:55
883
原创 【tarjan求双连通分量】PKU-3177&3352
PKU上几乎一模一样的两道题,都是用tarjan来求双连通分量,唯一不同的就是3177会有重边的情况,而3352不会有,所以在加了判断重边之后的代码在两题提交都能过。题目:31773323大神题解:点击打开链接#include#include#include#includeusing namespace std;#define N 5005vector
2012-03-31 02:13:18
615
原创 【tarjan求割边】PKU-3694-Network
先给出一个图,然后一次增加一些边,问在每条边增加后桥的数目是多少……因为是刚刚接触有关割的知识不久,所以都是模范人家的代码的,而且网上都是最朴素的代码,加上自己的水,所以时限5000ms的题跑出了3000+ms,真是悲剧啊!题目#include#include#include#includeusing namespace std;#define N 100005vector
2012-03-31 00:27:05
807
原创 【tarjan算法求割点】PKU-1523-SPF
其实题目的数据不够规范,因为它的点可能不连续,而且数据里面一定有根节点1,这个在题目里体现不了!题目#include#include#include#include#includeusing namespace std;#define N 1005vector vec[N];int step,low[N],dfn[N],blg[N];void add(int x,int
2012-03-30 13:23:10
828
原创 【综合图论】PKU-2942-Knights of the Round Table
综合性很强的一道图论题,用到了补图,双连通分量,二分图等几个知识点,这里有某位大牛的神解题报告点击打开链接。题目#include#include#include#include#includeusing namespace std;#define N 1005vector vec[N],lin[N];stack sta;int n,step,cnt,ans,low[N
2012-03-29 19:58:03
473
原创 【计算几何】Codeforces Round #113 (Div. 2)-B. Polygons
其实是很裸的一道几何题,题目要求的就是判断一个小的多边形是否完全且严格(两个多边形不能有交点)包含在另一个凸多边形里面。而解决的方法有很多,我这里用到的就是判断一个点是否完全且严格包含在一个多边形内,判断的时候用到了二分和叉积。题目#include#include#includeusing namespace std;#define N 100005struct node{
2012-03-28 21:14:53
902
1
原创 【树形dp】PKU-3345-Bribing FIPA
dp[i][j]表示在以i为根的树选j个国家的最少费用,具体思维看代码……题目#include#include#include#include#include#include#include#includeusing namespace std;#define FRE freopen("a.txt","r",stdin);#define inf 999999999
2012-03-26 20:54:31
780
原创 【树形dp】PKU-3107-Godfather
题目要求找到这样的一个点,当删除这个点后使得形成的深林的最大的子树的节点最小。而且这些点可能有多个,请一一输出。其实这道题就是1655的翻版,不过在这道题中不能用stl中的vector,因为会超时,所以要用邻接表来存储。题目#include#include#include#include#include#include#include#includeusing name
2012-03-23 14:43:32
418
原创 【树形dp】PKU-2486-Apple Tree
在原来很裸的树形dp上加了些限制条件,不过知道状态转移还是很好做的,但状态转移不好想啊,都是看了人家的结题报告后才知道的!题目#include#include#include#include#include#include#include#includeusing namespace std;#define FRE freopen("a.txt","r",stdin)
2012-03-23 01:00:09
538
原创 【Havel-Hakimi定理】PKU-1659-Frogs' Neighborhood
1,Havel-Hakimi定理主要用来判定一个给定的序列是否是可图的。2,首先介绍一下度序列:若把图 G 所有顶点的度数排成一个序列 S,则称 S 为图 G 的度序列。3,一个非负整数组成的有限序列如果是某个无向图的序列,则称该序列是可图的。4,判定过程:(1)对当前数列排序,使其呈递减,(2)从S【2】开始对其后S【1】个数字-1,(3)一直循环直到当前序列出现负数(即不是可图的情
2012-03-22 09:36:59
682
原创 【搜索+强剪枝】UVA-11882 - Biggest Number
处理得很巧妙的DFS+BFS……题目#include#include#includeusing namespace std;#define FRE freopen("a.txt","r",stdin);struct node{ int x,y;}queue[1000];int n,m;int Max,flag,tatal;char map[20][20];
2012-03-20 23:41:58
1908
原创 【树状数组】PKU-2057-The Lost House
这里有挺完整的题解:http://blog.csdn.net/find_my_dream/article/details/4864657题目#include#include#include#include#include#include#include#includeusing namespace std;#define FRE freopen("in.txt","r
2012-03-16 12:45:22
476
原创 【记忆化搜索+图论】HDU-2833-WuKong
具体题解题目#includeusing namespace std;template T Max(T x,T y){return x>y?x:y;}template T Min(T x,T y){return x<y?x:y;}#define N 305#define inf 999999999int n,dis1[N],dis2[N],dp[N][N],map[N][N]
2012-03-15 20:26:29
744
原创 【dfs+分治】VK Cup 2012 Round 1-C. Abracadabra
这道题的思路真是太神奇了,在参考某大牛的代码后恍然大悟,对其思维无限膜拜啊……用了分治法,具体思路看代码……题目#includeusing namespace std;template T Max(T x,T y){return x>y?x:y;}template T Min(T x,T y){return x<y?x:y;}int dfs(int l1,int r1,int
2012-03-15 14:09:09
571
原创 【深搜+模拟】VK Cup 2012 Round 1-E. Polycarpus the Safecracker
CF上的题考的就是思维啊,而这道题就是要用到十分巧妙的处理……题意:给定一个素数作为一个正方阵的第一行,而下面几行都要补一个素数进去形成一个对称矩阵,即当前矩阵与转置后的矩阵相等。如:239 9001 307 0002 977
2012-03-15 01:25:01
1297
原创 【树状数组】PKU-2152-Fire
一道处理的很巧妙的树状数组……都是参考大牛的代码的……题目大牛题解#include#includeusing namespace std;template T Max(T x,T y){return x>y?x:y;}template T Min(T x,T y){return x<y?x:y;}#define N 1005#define inf 999999999
2012-03-14 20:01:23
491
原创 【KMP】ZOJ-3587-Marlon's String
KMP的巧妙应用……题目#include#include#includeusing namespace std;#define N 100005int next[N];long long f[2][N];void getnext(char str[]){ int i,j,len; len=strlen(str); i=0,j=-1; next[0]=-1; w
2012-03-14 00:48:11
634
原创 【双连通分量(tarjan)+树形dp】HDU-2242-考研路茫茫——空调教室
重拾tarjan第一题,不过这题还要用到树形dp……所以是一道很好的综合简单题……题目#include#include#include#includeusing namespace std;template T Max(T x,T y){return x>y?x:y;}template T Min(T x,T y){return x<y?x:y;}#define N 10
2012-03-13 18:23:21
2324
原创 VK Cup 2012 Qualification Round 2部分题解(C,D,E)
CF上的一场资格赛,有二十四小时的时间给我们做,所以为了晋级,我和队友合力弄掉了四题,而最后的E题其实也不难,后来也过了……因为A,B相对较水,所以以下只讲后三题……contestC题:比赛时一致认为暴力不行,比赛后发现很多都是暴力过的……因此,比赛时用到了树状数组……其实是队友做出的,无限YM……不过树状数组真是个好东西啊……#include#include#include
2012-03-13 01:15:10
10914
原创 【树形dp】ZOJ-3326-Tree of Tree
这道题和昨晚在CF上做的一道题很像,都是树形dp。刚开始时,我写了个很烂的代码水过了,时间复杂度为O(n^3).不过一看觉得不对了,人家的都是0ms的,于是去网上找题解优化,时间就降为O(n^2)了,终究还是自己太水了……题目优化前,300ms:#include#include#include#includeusing namespace std;template T M
2012-03-12 21:07:04
575
原创 【dp+dfs】VK Cup 2012 Round 1-D. Distance in Tree
dp+dfs好题,状态转移写得很赞……dp[i][j中的i表示以第几个点为中心,j长度,综合起来表示以i为中心长度为j的边的总数……题目#include#includeusing namespace std;int k;__int64 ans,dp[50005][505];vector v[50005];void dfs(int x,int y){ int i,j,z;
2012-03-12 17:47:05
627
原创 【模拟】ZOJ-3590 -3+1
今天浙大校赛最水的一道题,纯模拟……具体见代码……题目#include#includeusing namespace std;template T Max(T x,T y){return x>y?x:y;}template T Min(T x,T y){return x<y?x:y;}int main(){ long long i,l,n,d,x,a[3];
2012-03-11 20:09:33
954
原创 【IDA*+位运算】PKU-1084-Square Destroyer
估价函数设计为这样:一开始把答案置零,从小正方形开始判断,如果有这个正方形就把答案增加1.,然后删掉这四条边。这样得到的值还是比较准的。然后加上一个非常重要的判定:只要找到一个正方形,就在当前的dfs中枚举组成这个正方形的几根火柴,而不要管其他的火柴棒。理由很简单——这几根火柴棒总得删掉一根。这样做的目的能够剪掉一大票删法相同但是删除顺序不同的“方案”……题目#includeus
2012-03-10 01:24:37
672
原创 【搜索+强剪枝】PKU-1167-The Buses
在黑书上的很好的一道搜索题,开始时基本没什么思路,代码也是按照大牛题解这里敲出来的……题目#includeusing namespace std;int bg,ed,Min,temp,sum[60],use[60],first[60];bool yes(int s,int d){ int i; for(i=s;i<60;i+=d) if(sum[i]<=use[i])r
2012-03-09 00:52:46
634
原创 【IDA*(迭代加深)】PKU-2286||HUD-1667-The Rotation Game
第一次写迭代加深,发觉这货很神气的说……虽然代码都是模仿人家的,不过自己加了一个判断条件,时间立刻减少一半……某大牛对于IDA*的解析:所谓迭代加深,就是在深度无上限的情况下,先预估一个深度(尽量小)进行搜索,如果没有找到解,再逐步放大深度搜索。这种方法虽然会导致重复的遍历 某些结点,但是由于搜索的复杂度是呈指数级别增加的,所以对于下一层搜索,前面的工作可以忽略不计,因而不会导致时间上的亏空。
2012-03-08 21:00:34
551
原创 【记忆化搜索】PKU-2044-Weather Forecast
经过这题,我发现原来用vector做参数是会超时的,难怪没人这样用来啦……题目#include#includeusing namespace std;struct T{ int a[4];};int n,p[370][20],b[5]={1,4,13,16};vector v1[15],v2[15];bool hash[10][370][7][7][7][7];in
2012-03-08 14:11:27
548
原创 【最小表示法】HDU-4162-Shape Number
可以说是最用小表示法求循环串的最小字典序的模板题,所以就直接套用模板了……题目#include#includeusing namespace std;char a[300005],b[300005];int minl(char str[],int len){ int i=0,j=1,k=0,t; while(i<len&&j<len&&k<len) {
2012-03-08 02:48:24
855
原创 【DP】-Codeforces Round #110 (Div. 1)-C. Cipher
个人觉得很神奇的一道DP……题目要求求出给出字符串经过题目要求的变换可以得到多少各不同的字符串。可以证明的是,这些字符串加起来的和都一样,所以dp[i][j]的i表示的是字符串的长度,j表示的是字符串所有字母加起来的和,状态转移方程为dp[i+1][j+k]+=dp[i][j](1题目#include#includeusing namespace std;#define mo
2012-03-02 01:18:48
522
原创 【归并排序】ZOJ-3574-Under Attack II
这个用归并算法求逆序数的算法正的是很赞……贴下以后当模板……题目#include#include#includeusing namespace std;struct T{ int l,r;}p[30005];int cnt,a[30005];bool cmp(T x,T y){ return x.l<y.l;}void msort(int l,int r)
2012-02-29 01:24:36
455
原创 【DP+记忆化搜索】PKU-1191-棋盘分割
题目sum[x0][y0][x1][y1]表示的是左上角为(x0,y0),右上角为(x1,y1)的矩形的每个点分数总和的平方;dp[n][x0][y0][x1][y1]表示的是左上角为(x0,y0),右上角为(x1,y1)的矩形再经n刀切到的方差的平方加上平均值的平方的和再乘以n……状态转移方程为dp(n, x0, y0, x1, y1)=Min( Min( dp[n-1, x0, y
2012-02-27 23:25:30
545
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人