08 2012 档案

2012 Multi-University Training Contest 4 D - Trouble
摘要:hash 1 # include <stdio.h> 2 # include <string.h> 3 4 # define N 205 5 # define M 100007 6 7 typedef long long int LL; 8 9 int n;10 LL a[6][N];11 int head[M], next[N*N+N];12 13 int hash(LL x)14 {15 return ((x%M)+M)%M;16 }17 18 void init_hash_table(void)19 {20 memse... 阅读全文

posted @ 2012-08-25 15:13 getgoing 阅读(248) 评论(0) 推荐(0) 编辑

HDOJ 4027 Can you answer these queries?
摘要:此题陷阱多多:数据类型(相应的输入输出)、区间端点可能反序、如果用C提交注意强制转换的格式(int(x)是不对的);思路:每次如果开根号的区间内含有未达到0或1的数就一直向下,找到这些数并直接更新一次,这样最多跟新4*N次,加上线段树的复杂度,为4*N*lgN,是最坏情况的复杂度,可能由于开根号耗时较多,总体比较耗时(700ms+),查询的复杂度为lgN。# include <stdio.h># include <math.h># define N 100005# define ls ((r)<<1)# define rs ((r)<<1|1)# 阅读全文

posted @ 2012-08-24 21:40 getgoing 阅读(392) 评论(0) 推荐(0) 编辑

PKU 2892 Tunnel Warfare
摘要:维护某个位置 i 左右可以到达的最大长度lx, ly,那么询问的输出为lx+ly-1(当然,如果 i 已经被标记(炸毁且尚未修复)输出0,这种情况加个判断);容易发现: 每次删除一个点时,这个点左边可以到达的所有点可以向右到达的最大长度要减去 ly,同理这个点右边的点可以到达左边的最大长度要减去 lx; 当修复一个点时,可以先询问它左(右)边的那个点的最大连通长度 lx(ly),那么可以对它前面 lx 个点向右可以到达的长度加上 ly+1,同理对它后面 ly 个点向左可以到达的最大长度加上 lx+1(两种操作都包含当前这个点),这样就相当于完成了修复;由于每次修复的是最近一次删除的点,可以.. 阅读全文

posted @ 2012-08-24 20:24 getgoing 阅读(248) 评论(0) 推荐(0) 编辑

HDOJ 3397 Sequence operation
摘要:难在异或对询问区间最大连续1长度的影响,每次异或时,把异或标记更新到底(cover标记不为-1),直接更新当前最大连续1区间的长度。 1 # include <stdio.h> 2 3 # define N 100005 4 5 # define ls ((r)<<1) 6 # define rs ((r)<<1|1) 7 # define mid (((x)+(y))>>1) 8 9 int n, m, a[N]; 10 int cover[N<<2]; 11 int sum[N<<2], lcon[N<<2 阅读全文

posted @ 2012-08-24 17:23 getgoing 阅读(289) 评论(0) 推荐(0) 编辑

PKU 3667 Hotel
摘要:维护左、右、总的连续区间长度,在 update 求总的最大长度时,写成了tsum[r] = Max(rsum[ls]+lsum[rs], Max(lsum[r], rsum[r])); 所以一直出错。/*notepad++ 调用 g++ 编译cmd /k C:\ACMSOFT\DEVC\Bin\g++.exe -g -W -Wall -o $(CURRENT_DIRECTION)\$(NAME_PART).exe $(FULL_CURRENT_PATH)*/# include <stdio.h># define ls ((r)<<1)# define rs ((r)&l 阅读全文

posted @ 2012-08-24 12:51 getgoing 阅读(227) 评论(0) 推荐(0) 编辑

[最小表示]PKU 3349 Snowflake Snow Snowflakes
摘要:最小表示法 + 排序 + 枚举, 整体复杂度:O(n*lgn*6)这道题普通的枚举就可以做,hash 和枚举差不多,繁琐的地方都在判断是否同构那里,我干脆用最小表示法把原串转换为原串的最小表示和反串的最小表示中的较小者,然后排序,枚举相邻的位置的串是否相等;最小表示法的一点更正:这篇博文中作者做了一个优化,我以前是参考优化后的做法写的,现在发现评论中有人提到了一个问题(最小位置直接出现在对升序序列后的情况下,这个优化实际上使复杂度变为了O(n^2),已经验证),把 j 减少到 i+1 不合理,所以又回到了原始的做法,具体见代码。# include <stdio.h># includ 阅读全文

posted @ 2012-08-23 22:41 getgoing 阅读(397) 评论(0) 推荐(0) 编辑

[二分] PKU 1840 Eqs
摘要:二分:3+2;# include <stdio.h># include <stdlib.h># define trq(x) ((x)*(x)*(x))int a[5];long long ans = 0;int h[105];int f[305*105*105], g[305*105];/************************************************************/int cmp(const void *x, const void *y){ return *(int*)x - *(int*)y;}int bins(int *v 阅读全文

posted @ 2012-08-23 17:15 getgoing 阅读(231) 评论(0) 推荐(0) 编辑

[hash] PKU 2002 Squares
摘要:此题数据范围其实很小,枚举主对角线,求出另两个点的坐标,看是否存在(所有点都不相同);hash的模版写法:# include <stdio.h># include <string.h># define odd(x) (((x)+100000)&0x1)# define MAXN 1005# define MOD 10007int n;int x[MAXN], y[MAXN];int head[MOD], next[MAXN];int hash(int xx, int yy){ int hkey = xx*13131 + yy; return (hkey%MOD 阅读全文

posted @ 2012-08-23 15:26 getgoing 阅读(236) 评论(0) 推荐(0) 编辑

[数组hash] PKU 3274 Gold Balanced Lineup
摘要:题解;数组hash:hash的是排列,不能用相加、相乘取模,常用hash函数的资料; 1 # include <stdio.h> 2 # include <string.h> 3 4 # define get(x, i) ((((x)>>(i))&0x1) ? 1:0) 5 6 # define N 100005 7 # define K 35 8 # define MOD 100007 9 10 int sum[N][K], c[N][K], a[N], h[MOD << 3];11 12 int Max(int x, int y)13 阅读全文

posted @ 2012-08-23 10:08 getgoing 阅读(237) 评论(0) 推荐(0) 编辑

PKU 3225 Help with Intervals
摘要:线段树经典入门题目;这道题有几点不同的地方:1. 维护的是集合,一个点或者一段区间都是一个集合,(2,3) 是一个集合,不能简单的用线段代替集合;2. 用离散的 01 值表示集合,对集合的运算需要转化为 01 区间的异或与赋值操作;3. 01 区间上进行异或和赋值,在 pushdown 的时候只能存在一个信息,一个线段要么被赋值,要么异或,不能既被赋值,同时进行异或(cover[]和xor[]不能同时有效);4. 结果要求输出运算结果(集合),在查询时,要做的不是查询到左端点、右端点,而是把被赋值的区间全部标记下来(O(n)),然后一次扫描完成输出,这道题卡了很长时间就是这里没想清楚(既然用了 阅读全文

posted @ 2012-08-22 21:44 getgoing 阅读(322) 评论(0) 推荐(0) 编辑

USACO sec2.1 Healthy Holsteins
摘要:状态压缩,先将生成的所有状态排序,然后枚举即可。/*PROG : holsteinLANG : C*/# include <stdio.h># include <stdlib.h>struct scoop{int a[30];};int V, G, r[(1 << 17) + 5];struct scoop g[17], v;/***************************************************/int bcnt(int x){ int ret = 0; while (x) { ++ret; x &= x-1; .. 阅读全文

posted @ 2012-08-21 17:41 getgoing 阅读(294) 评论(0) 推荐(0) 编辑

USACO sec2.1 Ordered Fractions
摘要:首先两重 for 循环对可能取的值约分,分子分母分别存放,根据比较分数大小的方法排序,然后按顺序输出(相同的只输出一个);/*PROG : frac1LANG : C++*/# include <stdio.h># include <stdlib.h># define MAXN (160 * 160)/***************************************************/int num[MAXN], den[MAXN], r[MAXN], m = 0;int cmp(const void *xx, const void *yy){ in 阅读全文

posted @ 2012-08-21 16:00 getgoing 阅读(297) 评论(0) 推荐(0) 编辑

USACO sec2.1 Hamming Codes
摘要:直接枚举就行了,不带回溯的搜索。/*PROG : hammingLANG : C++*/# include <stdio.h># define id(x) ((x)>>3)# define of(x) ((x)&0x7)# define get(x) ((h[id(x)]>>of(x))&0x1)# define set(x) (h[id(x)] |= (0x1<<of(x)))int n, b, d;char h[(1<<5) + 1];int sol[70];/*************************** 阅读全文

posted @ 2012-08-21 15:24 getgoing 阅读(230) 评论(0) 推荐(0) 编辑

USACO sec1.5 Checker Challenge
摘要:八皇后问题,最大输入13,单case,时限1s;和 HDOJ 不同的是:Do not precalculate the value and print it (or even find a formula for it); that's cheating. Work on your program until it can solve the problem properly. If you insist on cheating, your login to the USACO training pages will be removed and you will be disqual 阅读全文

posted @ 2012-08-21 11:32 getgoing 阅读(320) 评论(0) 推荐(0) 编辑

USACO sec1.5 Superprime Rib
摘要:没打表。/*PROG : sprimeLANG : C++*/# include <stdio.h>/*******************************/char isp(int x){ int i; if (x%2 == 0) return x == 2; if (x%3 == 0) return x == 3; if (x%5 == 0) return x == 5; for (i = 7; i*i < x; i+= 2) if (x%i == 0) return 0; return 1;}void g(int x, int r... 阅读全文

posted @ 2012-08-21 11:07 getgoing 阅读(265) 评论(0) 推荐(0) 编辑

USACO sec1.5 Prime Palindromes
摘要:素回文数,打表。。打表输出# include <math.h># include <time.h># include <stdio.h># define id(x) ((x)>>3)# define of(x) ((x)&0x7)# define get(x) ((pt[id(x)]>>of(x))&0x1)# define set(x) (pt[id(x)] |= (0x1<<(of(x))))# define MAXN 100000000char pt[(MAXN>>3) +1];void 阅读全文

posted @ 2012-08-21 10:50 getgoing 阅读(379) 评论(0) 推荐(0) 编辑

USACO sec1.4 Mother's Milk
摘要:BFS 1 /* 2 PROG : milk3 3 LANG : C++ 4 */ 5 # include <stdio.h> 6 7 # define MAXN 20005 8 9 /**********************************************/10 int a[3], c[3], ss;11 char vis[MAXN];12 int Q[MAXN], front, rear;13 int sol[25];14 15 void cal(int s)16 {17 a[0] = s%21;18 a[1] = s/21%21;19 a[... 阅读全文

posted @ 2012-08-21 09:41 getgoing 阅读(243) 评论(0) 推荐(0) 编辑

PKU 2828 Buy Tickets
摘要:从后往前逐个添加,每次放到第pos[i]+1个空位置上;维护区间内空位置的个数,修改和查询都是二分查找。 1 # include <stdio.h> 2 3 # define ls ((r)<<1) 4 # define rs ((r)<<1|1) 5 # define mid (((x)+(y))>>1) 6 7 # define MAXN 200010 8 9 int p[MAXN], v[MAXN], a[MAXN];10 int sum[4 * MAXN];11 12 void build(int x, int y, int r)13 { 阅读全文

posted @ 2012-08-20 15:08 getgoing 阅读(260) 评论(0) 推荐(0) 编辑

PKU 3468 A Simple Problem with Integers
摘要:区间修改,询问,带有 lazy tag。# include <stdio.h># define ls ((r) << 1)# define rs ((r) << 1 | 1)# define mid (((x)+(y))>>1)# define MAXN 100005typedef long long int LL;int a[MAXN];LL sum[MAXN * 4];LL lazy[MAXN * 4];void update(int r){ sum[r] = sum[ls] + sum[rs];}void build(int x, int 阅读全文

posted @ 2012-08-20 13:14 getgoing 阅读(197) 评论(0) 推荐(0) 编辑

HDOJ 1698 Just a Hook
摘要:带 lazy tag 的线段树,维护区间和,含区间修改操作(最后一次询问)。# include <stdio.h># define MAXN (100005 * 4)char lazy[MAXN];int sum[MAXN];void build(int x, int y, int r){ sum[r] = y-x+1; lazy[r] = 0; if (x == y) return ; int mid = (x+y)>>1, ls = r<<1, rs = r<<1|1; build(x, mid, ls); build(mid+1, y, r 阅读全文

posted @ 2012-08-20 11:20 getgoing 阅读(239) 评论(0) 推荐(0) 编辑

PKU 2528 Mayor's posters
摘要:第三次写这个题了,这次不再用线段树,因为估计了暴力能过(复杂度的估计不太明显,最坏不超过10^8,实际很可能更低或者大部分情况下更低(O(n)))!235ms,超时了几次,猜测是因为memset,所以加了个位优化,AC。 1 # include <stdio.h> 2 # include <stdlib.h> 3 # include <string.h> 4 5 # define id(x) ((x)>>3) 6 # define of(x) ((x)&0x7) 7 # define get(x) ((h[id(x)]>>of 阅读全文

posted @ 2012-08-20 10:40 getgoing 阅读(239) 评论(0) 推荐(0) 编辑

HDOJ 2795 Billboard
摘要:看了notonlysuccess的博客线段树维护最大值,这道题需要注意的是当h>n时,令h = n,原因是如果wi都小于w,最多只用前n行,反之一定结果是-1。# include <cstdio>int h, w, n, wi;int m[4 * 200010];int Max(int x, int y){ return x > y ? x : y;}void update(int r){ m[r] = Max(m[r << 1], m[r << 1 | 1]);}void build(int x, int y, int r){ m[r] = w 阅读全文

posted @ 2012-08-20 09:16 getgoing 阅读(232) 评论(0) 推荐(0) 编辑

USACO sec1.4 The Clocks
摘要:用的BFS,将每一个数字除以4,得到四种不同的状态:0 1 2 3,为了实现判重,用2位表示一个状态,整个钟表需要2*9 = 18位,不大;题解中第二种做法貌似是推理得到了一般解法。 1 /* 2 PROG : clocks 3 LANG : C++ 4 */ 5 6 # include <cstdio> 7 # include <cstring> 8 # include <queue> 9 10 using namespace std; 11 12 int ss; 13 char vis[0x3FFFF + 0x1]; 14 int pre[0x3FFFF 阅读全文

posted @ 2012-08-19 11:09 getgoing 阅读(243) 评论(0) 推荐(0) 编辑

USACO sec1.4 Packing Rectangles
摘要:这道题是 IOI95 的题目,直接做感觉有难度,主要原因是题目描述的六种形式是否是完备的,其实这个问题不需要考虑(题目已经明确指出了,或许已经被证明了),剩下的就是枚举了;1Y,这道题考的是生成排列的方法和模拟中细节的处理。 1 /* 2 PROG : packrec 3 LANG : C++ 4 */ 5 # include <cstdio> 6 # include <cstdlib> 7 8 int h[5][2]; 9 int pp[25][5], k = 0; 10 int solu[6*24*16+5][2], n = 0, m = 0; 11 12 /**. 阅读全文

posted @ 2012-08-19 01:15 getgoing 阅读(215) 评论(0) 推荐(0) 编辑

USACO sec1.4 Arithmetic Progressions
摘要:预处理+暴力,4.8s险过;注意长度为N的等差数列是指总共有N个数,所以公差上界为2*M*M/(N-1);/*PROG : ariprogLANG : C*/# include <stdio.h># include <stdlib.h># define MAXN (62505 * 2)int N, M, ans;char f[MAXN];short p[MAXN], q[MAXN];void pre(void){ int i, j, x; for (i = 0; i <= 250; ++i) for (j = i; j <= 250; ++j) { x =. 阅读全文

posted @ 2012-08-16 23:17 getgoing 阅读(174) 评论(0) 推荐(0) 编辑

USACO sec1.3 Barn Repair
摘要:题意比较难懂。有编号为 1 2 3。。。S 的牛棚,其中C个有牛而其余的没有,现在所有牛棚护栏都被大雨淋坏了,而提供牛棚护栏的商人只能提供一定数目(M个)的护栏(长度则随意,想要多长就能提供多长),为了节省money,FJ决定在所有有牛的棚子都修好的前提下,尽可能使得所需护栏的总长度最小(或者被护栏围住的牛棚总数最少)。首先如果S<=M,完全可以只要S个就行了,是满足要求且最少的;如果S>M,就需要把一些不连续的含牛的牛棚用一个大的护栏围住,其中包含不含牛的牛棚,要使这些不含牛的被围牛棚总的数目最少,就尽量使同一个护栏下不连续的片段尽可能小,就有了贪心的思路。太绕口了。/* PRO 阅读全文

posted @ 2012-08-16 22:10 getgoing 阅读(197) 评论(0) 推荐(0) 编辑

[贪心] COJ 1236 删数游戏
摘要:每次查找第一个降序的首字符,如果不存在就删除结尾字符,链表,O(n)。# include <cstdio># include <iostream>using namespace std;struct node{ char ch; node *pre, *next;};void b(node *head, char *s){ head->ch = s[0]; node *tmp = head; for (int i = 0; s[i]; ++i) { node *cur = new node; cur->ch = s[i+1]; ... 阅读全文

posted @ 2012-08-13 16:30 getgoing 阅读(292) 评论(0) 推荐(0) 编辑

PKU 1679 The Unique MST
摘要:判断最小生成树是否唯一,可以证明如果MST不唯一,必然是由于有两条边的权相等(反过来不成立),那么在第一次求MST时可以标记这类边,然后逐一去掉重新求MST,看是否和之前的相等。/* 判断最小生成树是否唯一, kruskal */# include <stdio.h># include <stdlib.h># define N 105# define M 5005int n, m;int p[N];int r[M], u[M], v[M], w[M];char h[M], ud[M], pi[M];int find(int x) {return x==p[x] ? x: 阅读全文

posted @ 2012-08-12 09:04 getgoing 阅读(241) 评论(0) 推荐(0) 编辑

[模板]大整数相加、相乘
摘要:欢迎测试!/* 大整数 C 模版 (大整数相加,相乘) 字符串形式输入,s[0]为最高位 author : http://www.cnblogs.com/JMDWQ/*/# include <stdio.h># include <string.h># define MAXN (10000 + 5) /* MAXN -- 输入中整数的最大位数 */char a[MAXN], b[MAXN], c[2 * MAXN]; int bign_prep(char *s);void str_rev(char *s); int ... 阅读全文

posted @ 2012-08-09 16:46 getgoing 阅读(955) 评论(0) 推荐(0) 编辑

HDOJ 免费馅饼
摘要:简单DP,记忆化会RE,递推即可。# include <cstdio># include <cstring># define N 100005int n, t, f[N][11], a[N][11];int Max(int x, int y){return x>y ? x:y;}/*int dp(int x, int y){ int &ans = f[x][y]; if (ans >= 0) return ans; if (x > t) return ans = 0; ans = 0; ans = Max(ans, dp(x+1, y)); i 阅读全文

posted @ 2012-08-08 15:36 getgoing 阅读(285) 评论(0) 推荐(0) 编辑

HDOJ 最少拦截系统
摘要:最好还是用堆来维护吧,幸亏没超时。# include <stdio.h>int top, s[30005];int main(){ int n, h, i ,find, cur, mini; while (~scanf("%d", &n)) { top = 0; for (i = 1; i <= n; ++i) { scanf("%d", &h); find = 0; for (int i = 0; i < top; ++i) { ... 阅读全文

posted @ 2012-08-08 14:47 getgoing 阅读(170) 评论(0) 推荐(0) 编辑

[简单DP] COJ 1123 PK武林盟主
摘要:状态转移方程p[i,j] = 0.5*(p[i-1,j]+p[i,j-1])。浮点数运算,初始时要向上取整。# include <stdio.h># include <math.h># include <string.h>int ap1, ap2, hp1, hp2;double f[1005][1005];double cal(int x, int y){ if (f[x][y] >= 0) return f[x][y]; if (x <= 0) return f[x][y] = 0; if (y <= 0) return f[x][y] 阅读全文

posted @ 2012-08-07 16:08 getgoing 阅读(267) 评论(0) 推荐(0) 编辑

[无向图割点] PKU 1523 SPF
摘要:targan算法。 1 # include <cstdio> 2 # include <cstring> 3 4 # define N (1000 + 5) 5 6 int n, son, tmpdfn; 7 int low[N], dfn[N], subnets[N]; 8 char g[N][N]; 9 10 int Min(int x, int y)11 {12 return x<y ? x:y;13 }14 15 void tarjan(int u, int r)16 {17 dfn[u] = low[u] = ++tmpdfn;18 for (int v 阅读全文

posted @ 2012-08-07 14:57 getgoing 阅读(196) 评论(0) 推荐(0) 编辑

[强联通分量_tarjan] PKU 1236 Network of Schools
摘要:和每日一题一样,只不过是给出每个顶点的邻接点,这里使用邻接表来做。 1 # include <cstdio> 2 # include <cstring> 3 4 # define N (100 + 5) 5 # define M ((N) * (N)) 6 7 int n, m; 8 int top, cols, tmpdfn; 9 int c[N], in[N], out[N], low[N], dfn[N], first[N], s[N]; 10 int u[M], v[M], next[M]; 11 char ins[N]; 12 13 int Min(int x 阅读全文

posted @ 2012-08-07 13:12 getgoing 阅读(185) 评论(0) 推荐(0) 编辑

[MST_prim] PKU 1258 Agri-Net
摘要:prim入门练习题。prim的流程如下:// 清空顶点集;任选一个点u作为起点,加入顶点集,从u出发选一条最小边(u, v),将v加入顶点集,重复直到所有点都进入顶点集。其中最小边可以用堆来做,还可以用邻接表加速(这里嫌麻烦)。 1 # include <cstdio> 2 # include <queue> 3 4 using namespace std; 5 6 typedef pair<int, int> pii; 7 8 # define N (100 + 5) 9 # define INF 0x7FFFFFFF10 11 int n;12 int 阅读全文

posted @ 2012-08-07 11:30 getgoing 阅读(224) 评论(0) 推荐(0) 编辑

[强联通分量_tarjan] 0725
摘要:tarjan算法的思路不难理解,用low来标记同一个强联通分量中的点,初始时low[i]=dfn[i],当访问到已经在当前栈中的顶点时,相当于找到了一个强联通分量的根节点(一个强联通分量中最早访问到的作为根节点),然后递归地更新栈中所有节点,如果遇到low[k]=dfn[k],说明k就是这个分量的根,于是对之前的所有点出栈并标记(此处标记用连续的值1,2,3代表第几个强联通分量,其实可以直接用low就行,cols记录强联通分量的个数)。 1 # include <cstdio> 2 # include <cstring> 3 4 # define N (100 + 5) 阅读全文

posted @ 2012-08-07 10:26 getgoing 阅读(215) 评论(0) 推荐(0) 编辑

[线段相交] 0807
摘要:模版,注意使用int可能在求叉乘的过程中溢出,解决办法:使用double(使用int在在返回时只返回符号有时也可以);使用double的:# include <cmath>const double eps = 1e-8;struct Point{double x, y;} ;int dcmp(double x){ if (fabs(x) < eps) return 0; return x>0 ? 1:-1;}int direction(Point p1, Point p2, Point p3){ double tmp = (p3.x-p1.x)*(p2.y-p1.y) 阅读全文

posted @ 2012-08-07 09:26 getgoing 阅读(164) 评论(0) 推荐(0) 编辑

[强联通分量_DFS] 0725
摘要:N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。input format:输入有多组样例,大约1000组。每组样例第一行包含两个整数N,M(2<=N<=100),N代表学校的个数,M代表边的个数(M<N*N)接下来M行,每行包含连个整数u,v,代表u可以向v单向发送数据。output format每组样例对应两行,分别是问题一和问题二的解。sam 阅读全文

posted @ 2012-08-07 09:03 getgoing 阅读(224) 评论(0) 推荐(0) 编辑

[简单DP] COJ 1122 Game
摘要:这道题直接模拟即可,DP相当于一个优化,记录下从第i行第j列出发后到达的最终位置,下次需要时直接取,优化前后最坏情况下复杂度都是O(10^6)。# include <cstdio># include <cstring> # define N 1000 + 5 int n, m;int cnt[N], ff[N], f[N][N];char g[N][N]; int down(int row, int col){ int &ans = f[row][col]; if (ans != -1) return ans; if (row == n) return ans 阅读全文

posted @ 2012-08-07 07:13 getgoing 阅读(759) 评论(0) 推荐(0) 编辑

[强联通分量] COJ 1128 Download Station
摘要:两边DFS求强联通分支,缩点;算法流程:dfs(G);dfs(G') in the order which f[] decreases. output tree in the dfs forest as a strongly connected component第一遍DFS为每个顶点打上时间戳,第二遍是反向DFS,按照时间戳递减的顺序访问每个结点,原图中的边作为反向边进行遍历,此时对于强联通分量必定是可以通过其中任一个点访问到,而原图中时间戳较晚(较早访问到的,注意加时间戳的位置)但不属于某个强联通分量的顶点必然到某个强联通分量有一条单向边,反向DFS时由于原边方向改变,无法通过这条 阅读全文

posted @ 2012-08-06 22:43 getgoing 阅读(275) 评论(0) 推荐(0) 编辑

[拓扑排序] PKU 2585 Window Pains
摘要:拓扑排序判断有向图是否有环,1A啊!!!对每个位置(前3行前3列),如果它控制范围内的某个位置上为 j ,而这个位置原始值为 i ,则添加一条 i 到 j 的边,如果出现环则说明电脑出问题了;不知道数据中是否含有非法的,所以就加了个判断:判断是否出现了非法状态,即某个位置出现了不属于这个位置的数字。# include <cstdio># include <cstring># define N 5# define NS ((N-1)*(N-1)) + 1const int n = 3;const int m = 9;int in[NS];int f[N][N];char 阅读全文

posted @ 2012-08-06 11:44 getgoing 阅读(181) 评论(0) 推荐(0) 编辑

[拓扑排序] PKU 1094 Sorting It All Out
摘要:第一道拓扑排序,拓扑排序的过程很简单:每次拿出一个入度为0的顶点放入solu[]尾部,并将它可以直接到达的顶点的入度减1;对这道题需要得到唯一顺序,每次发现有多个入度为0的顶点时,说明还未排好序,此时不应该直接返回cannot be determined而是对所有入度为0的顶点执行上述操作,如果发现到某一步没有入度为0的顶点了说明出现矛盾,此时返回出现矛盾;PS:这道题的输入有重复。# include <cstdio># include <cstring># define N 26 + 1int n, m;int in[N], tmp[N];char ans[N], g 阅读全文

posted @ 2012-08-06 10:08 getgoing 阅读(179) 评论(0) 推荐(0) 编辑

[状态压缩DP] PKU 3311 Hie with the Pie
摘要:和COJ送货到家一样,不过这里不要求每个点只经过一次,因此可以先用floyd预处理出任意两点间的最短距离,然后状态压缩DP。# include <cstdio># include <cstring># define INF 0x3C3C3C3C# define N 10 + 2int n;int w[N][N];int f[1<<N][N];int Min(int x, int y){ return x<y ? x:y;}int dp(int s, int i){ int &ans = f[s][i]; if (ans != -1) retur 阅读全文

posted @ 2012-08-05 22:54 getgoing 阅读(227) 评论(0) 推荐(0) 编辑

[简单DP] HDOJ 4323 Magic Number
摘要:// 编辑距离的方法可以水过这道题编辑距离的计算方法即一个不完全的证明见:http://en.wikipedia.org/wiki/Levenshtein_distance具体如下图:# include <cstdio># include <cstring># define LEN 10 + 2# define N 1500 + 5int n, m;char s[LEN];int len[N];char dic[N][LEN];int Abs(int x){ return x>0 ? x:-x;}int Min(int x, int y, int z){ int 阅读全文

posted @ 2012-08-05 22:12 getgoing 阅读(240) 评论(0) 推荐(0) 编辑

[字典树入门] HDOJ 1251 统计难题
摘要:不需要保存是否结束(isend),在插入时每经过一个节点,将该节点的计数器 +1,在查找时输出最后一个字符所在节点的cnt值即可;PS:为什么加了删除树(del_Trie)会超时呢?# include <cstdio># include <cstring># define LEN 10 + 1struct node{ int cnt; node * next[26]; node () { cnt = 0; memset(next, 0, sizeof(next)); }};void insert_Trie(node *root, cha... 阅读全文

posted @ 2012-08-05 19:01 getgoing 阅读(217) 评论(0) 推荐(0) 编辑

[状态压缩DP] PKU 2411 Mondriaan's Dream
摘要:参考http://wenku.baidu.com/view/e262a86f1eb91a37f1115c26.html状态设计:0表示横放,1表示竖放,可以预处理出所有合法状态,f[i, s] 表示到达第 i 层的状态(类似俄罗斯方块,前 i 层合并之后剩余的状态)。状态转移:f[i, s] = sum{f[i-1, s']},s' 为和 s 符合的状态 j 与 s 的异或值。# include <cstdio># include <cstring># define N 11 + 1typedef long long int LL;int m, n;LL 阅读全文

posted @ 2012-08-05 17:25 getgoing 阅读(244) 评论(0) 推荐(0) 编辑

[状态压缩DP] COJ 1129 送货到家
摘要:第一道状态压缩DP;这道题要求一个无向图的最小权回路,要求经过所有点,所以可以任选一个点(这里选0)作为起点,以后的状态f[s, i]表示从0出发到i结束的最小权路径,最终求得f[1<<n-1, k]后要加上w[0, k],然后求最小值:for k = 0:n-1 ans = min(f[1<<n-1, k]+w[0, k]);print(ans); 1 # include <cstdio> 2 # include <cstring> 3 4 # define N 15 5 # define INF 0X1FFFFFFF 6 7 int n; 8 阅读全文

posted @ 2012-08-05 09:21 getgoing 阅读(166) 评论(0) 推荐(0) 编辑

USACO Section 1.3 Calf Flac
摘要:manacher求最长子串。/*PROG : calfflacLANG : C++*/# include <cstdio># include <cctype># define N 20000 + 5int n;char s[N];int Min(int x, int y){ return x < y ? x : y;}int manacher(char *s, int len, int &st){ int n = len*2+1; char t[2 * N]; /* insert '#' in string s to form a 2*le 阅读全文

posted @ 2012-08-05 08:25 getgoing 阅读(220) 评论(0) 推荐(0) 编辑

[集合DP] UVA 10651 Pebble Solitaire
摘要:根据题目描述,每次变换都减少了一个石子,所以只要求出初始状态最多可以变换多少次,用初始状态石子数目减去这个变换次数就得到最后剩余最少的石子的数目;最多有12位,用一个 int 表示状态,状态的转移可以用位运算实现。 1 /* 2 UVA 10651 - Pebble Solitaire 3 */ 4 # include <cstdio> 5 # include <cstring> 6 7 char s[20]; 8 int f[5000]; 9 10 bool move(int &x, int i, char d)11 {12 int t = (x>> 阅读全文

posted @ 2012-08-03 17:01 getgoing 阅读(319) 评论(0) 推荐(0) 编辑

[简单DP] UVA 10051 Tower of Cubes
摘要:DAG上的DP,六个方向,打印不要求字典序,相反方向可以通过异或得到(定义0-5代表题目所说的五个方向);f[i, p] = 1;for (k = 1:i-1) f[i, p] = max(f[i, p], f[k, q]+1) if (color[i][p^1] == color[k][q]) 1 /* 2 UVA 10051 - Tower of Cubes 3 */ 4 # include <cstdio> 5 # include <cstring> 6 7 # define N 500 + 5 8 # define F 6 9 10 const char s[F 阅读全文

posted @ 2012-08-03 16:03 getgoing 阅读(252) 评论(0) 推荐(0) 编辑

[单调队列] UVA 10534 Wavio Sequence
摘要:单调队列,Staginner的分析;关键在于正确性和最优性的证明:正确性:通过单调队列的维护,不会得到比实际最长串更大的长度;最优性:通过单调队列的维护,能得到不小于最长串的长度; 实际存在的最长串在出现之后,单调队列的长度不会小于这个最长串的长度(替换不改变长度,只有进队时增加了长度),而之前出现的较大的队列尾会被替换,较小的会被较大的通过入队的方式更新。 1 /* 2 UVA 10534 - Wavio Sequence 3 */ 4 # include <cstring> 5 # include <cstdio> 6 7 # define N 10000 + 5 阅读全文

posted @ 2012-08-03 15:13 getgoing 阅读(297) 评论(0) 推荐(0) 编辑

[简单DP] POJ 1651 Multiplication Puzzle
摘要:一看就知道是矩阵链,但是忘了矩阵链具体是怎么做的了,记的是把区间划分开来DP。定义f[i, j]为 i-j 内的最小值(初始是1-n),如果第 k 个为最后选的数,那么 f[i, j] = f[i, k]+f[k,j]+a[i]*a[k]*a[j];需要注意的是边界条件:如果区间内不含选取的数(i+1==j)最小值应该定义为0。 1 /* 2 POJ 1651 Multiplication Puzzle 3 */ 4 5 # include <cstdio> 6 # include <cstring> 7 8 # define N 100 + 5 9 # define 阅读全文

posted @ 2012-08-03 10:26 getgoing 阅读(231) 评论(0) 推荐(0) 编辑

[简单DP] POJ 2192 Zipper
摘要:给出三个串a b c,问 c 是否能由 a b 串中的字符通过混合得到,要保持同一个串中两个字符的前后关系不变。状态:f[i ,j] 表示长度为 i 且使用了b串 j 个字符(使用 a 串 i-j 个字符),布尔型,表示状态是否可达。状态转移: f[i, j] = f[i-1, j] && f[i-1, j-1],对于边界f[0, 0] = true。也可以令 f[i, j] 为使用了 a 串 i 个字符、b 串j个字符是否可达,如下: 1 /* 2 POJ 2192 Zipper 3 */ 4 # include <cstdio> 5 # include < 阅读全文

posted @ 2012-08-03 09:46 getgoing 阅读(203) 评论(0) 推荐(0) 编辑

UVA 400 Unix ls
摘要:字符串,需要注意格式,和样例输出用fc命令比较,一致时就行了。# include <cstdio># include <cstring># include <cstdlib># include <cmath># define N 100 + 5# define M 60 + 5int n;char fname[N][M];int cmp(const void *x, const void *y){ return strcmp((char*)x, (char*)y);}int max(int x, int y){ return x>y ? x 阅读全文

posted @ 2012-08-02 17:01 getgoing 阅读(200) 评论(0) 推荐(0) 编辑

UVA 10115 Automatic Editing
摘要:字符串函数的应用。# include <cstdio># include <cstring># define RULESN 10 + 5# define MAXLEN 80 + 5int n;char src[RULESN][MAXLEN];char des[RULESN][MAXLEN];char text[4 * MAXLEN];void replace(char *t, char *s, char *d){ int len = strlen(s); char *p, tmp[4 * MAXLEN]; while (p = strstr(t, s)) { ... 阅读全文

posted @ 2012-08-02 16:21 getgoing 阅读(174) 评论(0) 推荐(0) 编辑

UVA 644 - Immediate Decodability
摘要:枚举。第一次遇见:Your submission with number ***** for the problem 644 - Immediate Decodability has failed with verdict ./* 644 - Immediate Decodability*/# include <cstdio># include <cstring>int n;char s[10][15];bool in(char *p, char *t){ for (int i = 0; p[i]; ++i) if (!t[i] || p[i] != t[i]) re. 阅读全文

posted @ 2012-08-02 15:57 getgoing 阅读(218) 评论(0) 推荐(0) 编辑

COJ 1259: 跳跳
摘要:BFS,直接入队即可。# include <cstdio># include <queue># include <cstring>using namespace std;# define N 100 + 5int n;char g[N][N];char vis[N][N];struct pos{int x, y, d;};pos st;queue <pos> Qst[10];const int dx[] = {0,0,1,-1};const int dy[] = {1,-1,0,0};int bfs(void){ queue <pos> 阅读全文

posted @ 2012-08-02 08:36 getgoing 阅读(215) 评论(0) 推荐(0) 编辑

HDOJ 4308 Saving Princess claire_
摘要:简单BFS,遇到'P'时把所有'P'标记,并对所有'P'多向下搜索一步,此时遇到'*'时入队;BFS的特点:搜到即标记,搜到就判断。# include <cstdio># include <cstring># include <queue>using namespace std;# define N 5000+5int n, m, cost;char g[N][N];char vis[N][N];struct pos{ int x, y, d; pos() { d = 0; }};pos st; 阅读全文

posted @ 2012-08-02 07:17 getgoing 阅读(209) 评论(0) 推荐(0) 编辑

[字符串]
摘要:题目:给出一个整数n,问1-n之间包括n在内的所有数中49出现的次数。输入首先为一个整数T,表示接下来有T组输入。# include <cstdio># include <cstring># define N 10000000# define LEN 22typedef long long int LL;LL f[LEN][10];LL pow10[LEN];void init(void){ pow10[0] = 1; for (int i = 1; i < LEN; ++i) { pow10[i] = 10*pow10[i-1]; if (i>=... 阅读全文

posted @ 2012-08-01 23:44 getgoing 阅读(152) 评论(0) 推荐(0) 编辑

HDOJ 2896 病毒侵袭
摘要:WA;这道题题意不清晰,单词相互包含的要不要计算?网上AC的程序跑出来的结果都不太一样,我的是计算在内的。 1 # include <cstdio> 2 # include <cstring> 3 # include <queue> 4 # include <algorithm> 5 6 using namespace std; 7 8 # define WORD_LEN 200 + 5 9 # define TEXT_LEN 10000 + 5 10 # define ALPHA_SIZE 128 + 5 11 12 int n, m, tot 阅读全文

posted @ 2012-08-01 13:40 getgoing 阅读(195) 评论(0) 推荐(0) 编辑

HDOJ 2222 Keywords Search
摘要:Accepted2222593MS30816K2430 BG++第一道 AC 自动机,理解了就好写;需要注意字典可能重复,重复的不能按一次算。# include <cstdio># include <cstring># include <queue>using namespace std;# define WORD_LEN 50 + 5# define MAXN 10000 + 5# define ALPHA_SIZE 26int n, id;char t[1000000 + 10];char w[MAXN][WORD_LEN];struct node{ n 阅读全文

posted @ 2012-08-01 11:41 getgoing 阅读(381) 评论(0) 推荐(0) 编辑

导航

点击右上角即可分享
微信分享提示