- 博客(30)
- 资源 (1)
- 收藏
- 关注
原创 POJ 3469
用了一年的SAP模板T了,学习了一下非递归的写法SAP算法的核心:维护距离标号的方法是这样的:当找增广路过程中发现某点出发没有允许弧时,将这个点的距离标号设为由它出发的所有弧的终点的距离标号的最小值加一。这种维护距离标号的方法的正确性我就不证了。由于距离标号的存在,由于“怎么走都是最短路”,所以就可以采用DFS找增广路,用一个栈保存当前路径的弧即可。当某个点的距离标号被改变时,栈中指向
2012-09-29 20:52:06 914
原创 HDU 4328
单调栈和简单DP#include#include#includeusing namespace std;struct point{ int h; int w;}stack[1005];int n,m;char in[1010];int map[1010][1010];int dp[1010][1010];int sum[1010][1010];int DP
2012-09-28 15:44:51 751
原创 Codeforces 124 E
最小生成树的好题!需要构造只包含k个点的图,但是如果暴力去搞必然超时,所以只加入有可能成为MST中的边的边,最后求一遍最小生成树First of all, we can note that if each graph vertex is portal, the answer will be a sum of all edges' weights in MST (minimal span
2012-09-28 11:54:01 3330
原创 ZOJ 3613
斯坦纳树#include#include#include#define N 210#define M 5100using namespace std;int a[N],b[N];int a1[N],b1[N];int st[N],dp[N][1000],ans[1000];bool vis[N][1000];struct Edge{ int v,w,next;}e
2012-09-27 21:29:57 806
原创 WC2008 浏览计划
斯坦纳树#include#include#include#define N 11#define M 1100#define INF 100000000using namespace std;int n,m,k,K;int st[N][N];int dp[N][N][M];int pre[N][N][M];bool vis[N][N][M],ok[N][N];int ma
2012-09-27 16:03:20 806
原创 HDU 4085
斯坦纳树具体参见国家队论文#include#include#include#define M 1100#define N 55#define INF 100000000using namespace std;struct Edge{ int v,w,next;}edge[M*2];int head[N],cnt;int n,m,k,K;int st[N];i
2012-09-27 12:16:45 1256
原创 CF 126B
简单KMP#include#include#include#includeusing namespace std;char s[1000005];int next[1000005],flag,len;bool hash[1000005];void getnext(){ int k=1,j=0; next[k]=0; while(k<=len+1){
2012-09-22 20:52:52 988
原创 最短路--差分约束系统
看了一晚上头都大了。。。以前学的时候不是太懂加上好久没做就更不懂了http://imlazy.ycool.com/post.1702305.htmlhttp://hi.baidu.com/accplaystation/item/72c9e50dd1eb63e3f45ba6ff看了这两篇篇文章后有些微懂总结下来就是这么个结论:如果做后是取最值求最大值,把不
2012-09-21 21:26:00 731
原创 HDU 4288
线段树每个区间记录该区间内sum[0...4],在区间合并用时注意右区间需要用上左区间的所含元素个数。#include#include#include#define N 100100typedef long long ll;using namespace std;struct Point{ int l,r; int num;//number in the
2012-09-16 20:05:27 1262
原创 HDU 4339
常规做法大家应该都会了,这里说一下hash的做法(摘自官方解题报告) We can compare two substrings using hash (s[0]*(p^0)+s[1]*(p^1)+...+s[i]*(p^i), where ^ means power).Let's n be 1+max(l1, l2). For i (l1<=i and i<n) put s
2012-09-15 22:21:28 849
原创 HDU 4262
线段树记录区间中已取走的个数#include#include#include#define N 100100using namespace std;int n;int now;long long ans;int a[N],pos[N];struct Tree{ int l,r,num;}tree[N*3];void build(int s,int t,int id
2012-09-15 19:52:43 724
原创 HDU 4263
并查集的应用先算出用红边去构成生成树最多用x1条,那么蓝边最少就用n-1-x1;再算出用蓝边去构成生成树最多用x2条,那么蓝边最多就用x2;然后判断k是否介于之间即可#include#include#define N 1010using namespace std;int c1,c2;int f1[N],f2[N];int n,m,k;void init(){
2012-09-15 16:53:26 832
原创 HDU 4260
简单递归#include#include#includeusing namespace std;char s[100];int len;long long dfs(int pos,char to){ if(pos==-1) return 0; if(to=='A'){ if(s[pos]==to) return
2012-09-15 15:54:59 815
原创 HDU 4271
字符串的编辑距离的扩展//f[i,j]表示s[0...i]与t[0...j]的最小编辑距离。 f[i,j] = min { f[i-1,j]+1, f[i,j-1]+1, f[i-1,j-1]+(s[i]==t[j]?0:1) } f[i-1,j]表示将s[i]删去,剩下是s[0...i-1]与t[0...j]的最小编辑距离;f[i][j-1]表示在s[i]后面
2012-09-15 14:49:58 992
原创 HDU 4323
字符串的编辑距离#include#include#include#define inf 100000000using namespace std;int num[110],sum[110],dp[110][110];#include#include#include#include#includeusing namespace std;string str1[1510]
2012-09-14 21:09:09 746
原创 HDU 4383
区间DP好题#include#include#include#define inf 100000000using namespace std;int num[110],sum[110],dp[110][110];int main(){ int t,T,n; int l,i,j,k; scanf("%d",&T); for(t=1;t<=T;t++){
2012-09-14 20:19:22 787
原创 HDU 4267
简单树形DP#include#include#include#define N 102using namespace std;struct Edge{ int v,w,next;}edge[N*2];int n,t;int head[N],cnt;int pre[N],cost[N],num[N];bool mark[N];int dp[N][502],yes[N
2012-09-14 14:52:05 928
原创 HDU 4272
正解是状态压缩的搜索dfs求是否有可行解,bfs求最优解#include#include#include#includeusing namespace std;int n;int num[2000],num1[2000];int dp[1100][1100];int dfs(int pos,int sta){ int npos,nsta,i,j,cou;
2012-09-13 16:35:31 1089
原创 HDU 4267
这棵线段树又写跪了!需要明白(i - a) % k == 0等价与i%k=a%k单点查询#include#include#include#include#include#include#include#include#include#define eps 1e-7#define LL long long#define N 5
2012-09-12 20:12:24 739
原创 HDU 4277
这个乱搞题用hash+set搞或着DFS即可#include#include#include#include#include#define N 32768using namespace std;int a[20];int num[N+100];struct Point{ int sum,id;}p[N+100];sets;bool cmp(struc
2012-09-11 18:08:32 929
原创 hdu 3655
SPFA求1,2,3,这三个点的单源最短路然后枚举每个点做meeting point ,遍历这个点的临接边,然后判断这个边是否是(1,2,3)中的至少2个点的最短路上的边即可。#include#include#include#include#define N 3010#define M 200010#define inf 200000000typedef long long
2012-09-06 18:01:55 906
原创 2011年北京区域赛A题
次小生成树的简单应用#include#include#include#include#include#define N 1010using namespace std;int x[N],y[N],p[N],vis[N];double dis[N][N],d[N],mx[N][N];int main(){ int t,T,i,j,n; double A,B,
2012-09-05 20:08:21 2087
原创 FZU 1901
简单KMP#include#include#include#includeusing namespace std;char s[1000005];int next[1000005],flag,len;void getnext(){ int k=1,j=0; next[k]=0; while(k<=len+1){ if(j==0||s[k]=
2012-09-05 16:27:39 900
原创 Codeforces Beta Round #7, problem: (D) Palindrome Degree
#include#include#include#include__int64 dp[5000000+5];char s[5000000+5];using namespace std;int main(void){ __int64 ans=0,l=0,r=0,k=1; scanf("%s",s); for(int i=0;s[i];i++) {
2012-09-05 15:21:25 1566
原创 HDU 3973 AC's String
<!--@page {margin:0.79in}p {margin-bottom:0.08in; direction:ltr; color:#000000; text-align:justify; widows:0; orphans:0}p.western {font-family:"Calibri",sans-serif; font-size:1
2012-09-05 15:02:38 2280 3
原创 CF 113B || CF196D
watashi大神的代码#include #include #include #include using namespace std;vector pos(const string& s, const string& p) { vector ret; for (string::size_type i = s.find(p); i != string::npos; i =
2012-09-05 13:42:26 1237
原创 SPOJ HACKING
题意:给出一个长为 n 的,由字母表中前 k 个小写字母组成的字符串 s.求一个长度为m的字符串,要求该串也只能由字母表前 k 个小写字母组成,且其不能是 s 的子串.(题目指出一定有解)方法一:在判重时采用这样的方法,想把原串中长度为m1的字串都求出hash值存入set中,然后从0开始寻找第一个未出现在set中的数,将其翻译成相应的字符串.#include#include
2012-09-05 13:38:42 741
原创 BOJ 204
询问区间的最长回文#include#include#include#include#includeusing namespace std;const int maxn=200100;int rad[maxn*2];char str[maxn],s[maxn*2];int q;int odd[maxn],even[maxn];int mm[maxn],mo[maxn]
2012-09-03 16:22:45 670
原创 Codeforces 136 divIID && zoj 3633 && HDU 4358
三道类似的线段树可参见这里的代码http://blog.csdn.net/struggle_mind/article/details/7931956今天下午把HDU 4358重敲了一遍#include#include#include#include#define N 100100using namespace std;int val[N],a[N],nu
2012-09-02 21:57:28 1008
原创 HDU 3948
UESTC的神题啊!主要是去重比较难想主要思想就是:按sa数组i从2开始枚举到n,pre1记录的是上一次计算过的回文串,所以先与height[i]取小值,代表这次计算重复的回文串,然后与实际的回文串相比较计入总和。然后更新pre1,继续向下迭代。这里回文的两个后缀是不会重复计算的,因为在SA数组中如果有夹在之间的后缀,那么pre1的大小是不会变小的,所以不会被重复计算pre2同理更
2012-09-01 17:48:44 1803
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人