|
|
|
|
|
11 2012 档案
poj - 1988 Cube Stacking
摘要:题目的意思是把数字像串糖葫芦一样串来串去,询问某个数字下方有多少个数。我看明白了popopopolo的思路后就按他的想法自己写了一个,结果用了282ms,而他的只有32ms,排名第二,差距还真是大orz。仔细对比一下,他的数据类型是short,输入输出函数也是重写的。我试着把int改为short,结果是266ms,基本没什么优化,而我也懒得重写函数了。原来我只知道scanf比cin强,没想到手写的效率要更强。 1 #include <stdio.h> 2 #include <string.h> 3 #define N 30005 4 int fa[N],d[N]; 5
阅读全文
poj - 1163 The Triangle
摘要:纯水题。 1 #include <stdio.h> 2 int a[100][100]; 3 int max(int a,int b) 4 { 5 return a>b ?a :b ; 6 } 7 int main() 8 { 9 int n,i,j,ans;10 while(~scanf("%d",&n))11 {12 for(i = 0; i < n; i++)13 for(j = 0; j <= i; j++)14 scanf("%d",&a[i][j]);15 for...
阅读全文
poj - 3278 Catch That Cow
摘要:水题,搜索一个数转化成另一个数。 1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 using std::queue; 5 #define N 100010 6 int d[N]; 7 bool vis[N]; 8 int m,n,a; 9 int nxt(int x)10 {11 int t;12 if(x==0) t = a-1;13 else if(x==1) t=a+1;14 else t = a<<1;15 return t;16 }17 int bfs()1
阅读全文
poj - 1984 Navigation Nightmare
摘要:给出一个图,求两点的曼哈顿距离(|det(x)|+|det(y)|)。题目本身不难,用并查集记录集合及两点间的关系,可我不得不说这题给出数据的方式相当坑爹,硬是把一个在线的问题搞成离线的,就好像活生生把一个直男掰弯一样。 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 #define N 40010 6 #define M 10005 7 int fa[N]; 8 int X[26],Y[26]; 9 struct Dir{1
阅读全文
poj - 2488 A Knight's Journey
摘要:走马步,求能否遍历棋盘上所有格,如能,按最小字典序输出路径。做这题时我又看了下以前写的poj 2676,把代码又改进了下。 1 #include <stdio.h> 2 #include <string.h> 3 int X[] = {-2,-2,-1,-1,1,1,2,2}, 4 Y[] = {-1,1,-2,2,-2,2,-1,1}; 5 int m,n,path[26][2]; 6 bool find,vis[13][13]; 7 void dfs(int a,int b,int k) 8 { 9 int i,x,y;10 //if(find) return ;1
阅读全文
poj - 1703 Find them, Catch them
摘要:就是一些结点,分属两个帮派,也可能都不属于。input分两种,一种是给出异派的两个点,另一种是询问两个点的关系。这题和poj 1182相似,而且还要简单一些。 1 #include <stdio.h> 2 #include <string.h> 3 #define N 100005 4 int fa[N]; 5 bool side[N]; 6 int find(int n) 7 { 8 if(fa[n] == n) return n; 9 int t = fa[n];10 fa[n] = find(t);11 side[n] = side[n]^side[t];...
阅读全文
poj - 1177 Picture
摘要:很经典的题,我是学习的罗老的代码。就是给出一些矩形,求所有矩形重叠后最终图形的边长。思路就是(内部资料,不得外传)。这题的一个坑就是矩形的边重合时的情况。 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 #define N 5005 5 #define M 20005 6 int ans; 7 struct Seg 8 { 9 int x,y1,y2;10 bool f;11 Seg(){}12 Seg(int a,int b,int c,bool d)13 {14 ...
阅读全文
poj - 1947 Rebuilding Roads
摘要:树形DP,一棵树有N个结点,给出一个P,要求切断最少的边使树的规模达到P。这题我是参考的别人的代码,状态转移方程最初很难理解,后来明白了,它扫描时,默认父结点是光杆司令一个,随着扫描子树才把子树连到父结点上。 1 #include <stdio.h> 2 #define N 152 3 int fst[N],nxt[N],notrt[N]; 4 int dp[N][N],n,p; 5 void dfs(int u) 6 { 7 int i,j,v,t; 8 for(i = 0; i <= p; i++) dp[u][i]=N; 9 dp[u][1] = 0;10 ...
阅读全文
poj - 3342 Party at Hali-Bula
摘要:树形DP,还是求最大独立集,加上判断唯一性,这题我就卡在唯一性上了。 1 #include <stdio.h> 2 #include <string.h> 3 #define N 205 4 int fst[N],nxt[N],v[N],n,m; 5 int only[N][2],dp[N][2]; 6 char name[N][105]; 7 int max(int a, int b) 8 { 9 return a>b ?a :b;10 }11 int find(char *t)12 {13 for(int i = 0; i < m; i++)14 if(
阅读全文
poj - 3107 Godfather
摘要:和poj 1655类似,也是拆了一个树求什么值。这题我改进了一下,把两个DFS合一了。 1 #include 2 #define N 50005 3 int fst[N],nxt[N w[u]) w[u]=s[v];23 }24 }25 if(t > w[u]) w[u]=t;26 //printf("w[%d]:%d\n",u,w[u]);27 if(w[u] < min) min = w[u];28 return s[u];29 }30 int main()31 {32 int a,b,i,j,f=1;33 scan...
阅读全文
poj - 1611 The Suspects
摘要:并查集,求和0号同集合的点有多少个。 1 #include <stdio.h> 2 #include <string.h> 3 #define N 30005 4 int fa[N],num[N]; 5 int find(int a) 6 { 7 if(fa[a] == a) return a; 8 return fa[a] = find(fa[a]); 9 }10 void unin(int a,int b)11 {12 a = find(a);13 b = find(b);14 if(a == b) return;15 if(num[a] >...
阅读全文
poj - 1655 Balancing Act
摘要:给出一个树,若去掉其中一个结点,剩下的子树中规模最大的树的规模(估且称为D值),就是该点的D值。求所有结点中D值最小的点,输出点及其D值。这题用两次DFS,第一次求出所有结点的子结点数,第二次求出所有结点的D值。 1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #define N 20005 5 using namespace std; 6 vector<int> ed[N]; 7 int s[N],w[N],n; 8 int max(int a,int b) 9
阅读全文
poj - 1463 Strategic game
摘要:最小支配集,题目不难,就是它给出数据的方式有点CD。 1 #include <stdio.h> 2 #include <string.h> 3 #define N 1505 4 int to[N][12]; 5 int all[N],dp[N]; 6 bool root[N]; 7 int min(int a,int b) 8 { 9 return a<b ?a :b;10 }11 void dfs(int u)12 {13 int v,i,cnt=0;14 dp[u] = 1;15 all[u] = 0;16 for(i = 1; i <= to[u]..
阅读全文
poj - 2342 Anniversary party
摘要:树形DP,其实就和求最大独立集差不多,不同的是每个结点的权值不是0和1,而是一个int。最初我还费老大心思想当权值为负时的情况,后来才明白不需要。 1 #include <stdio.h> 2 #include <string.h> 3 const int N = 6010; 4 int fst[N],nxt[N],dp[N][2],v[N]; 5 bool root[N]; 6 int max(int a,int b) 7 { 8 return a>b ?a :b; 9 }10 void dfs(int p)11 {12 int e,q;13 for(e = f
阅读全文
poj - 1182 食物链
摘要:并查集进阶,除了用父亲数组保存父结点外,再用一个数组表示子结点与父结点之间的关系,查找与合并时都涉及到关系数组的修改。 1 #include <stdio.h> 2 #include <string.h> 3 int rank[50010],fa[50010]; 4 int find(int n) 5 { 6 int t = fa[n]; 7 if(fa[n] != n) 8 fa[n] = find(fa[n]); 9 rank[n] = (rank[n]+rank[t])%3;10 return fa[n];11 }12 void uni(i...
阅读全文
poj - 1308 Is It A Tree?
摘要:水题,判断是否是一棵树,如果一个结点有多个父亲or图中有环就不是。 1 #include <stdio.h> 2 #include <string.h> 3 int fa[1005],v[1005]; 4 int Find(int n) 5 { 6 if(fa[n] == -1) 7 return n; 8 fa[n] = Find(fa[n]); 9 return fa[n];10 }11 int main()12 {13 int ca=1,a,b,i,j,f;14 bool ok;15 while(scanf("%d%...
阅读全文
poj - 2373 Dividing the Path
摘要:很久之前做的了,已经想不起思路了,容我日后补充。 1 #include <stdio.h> 2 #include <deque> 3 #include <algorithm> 4 #define inf 1000000000 5 using namespace std; 6 int n, L, a, b, cnt = 1; 7 int f[1000010]; 8 bool d[1000010]; 9 struct node10 {11 int s, e;12 }p[1001], P[1001];13 bool cmp(const node &a, c
阅读全文
|
|