摘要:        
可以用线段树进行区间染色、合并的操作。 由于数据范围比较小,离散化后直接暴力更新也是可以的。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 10010int N, lc[4 * MAXD], rc[4 * MAXD], mc[4 * MAXD], to[4 * MAXD];int M, tx[MAXD];struct Seg{ int x, y; char b[5]; }seg[MAXD];int cmp(const void *_p, const void *_q){ in    阅读全文
        
            posted @ 2012-05-01 10:56
Staginner
阅读(381)
评论(0)
推荐(0)
        
            
        
        
摘要:        
可以用f[i][j]表示递推到第i个节点时保留j个树枝的最优解,决策的时候要么只从某个子树中选取,要么就同时从两个子树中选取,而且如果选择了某个子树中的树枝,那么就必须选择和这个子树相连接的树枝。#include<stdio.h>#include<string.h>#define MAXD 110#define MAXM 210int N, Q, e, first[MAXD], next[MAXM], v[MAXM], w[MAXM], f[MAXD][MAXD];void add(int x, int y, int z){ v[e] = y, w[e] = z; ne    阅读全文
        
            posted @ 2012-05-01 09:50
Staginner
阅读(192)
评论(0)
推荐(0)
        
            
        
        
摘要:        
一开始想的是按列划分阶段,一列一列地摆放,这样就可以用f[i][j][k]表示递推到第i列时一共有j个方块且第i列放了k个方块的方案种数。但实际上一共递推了多少列对解题并无直接的益处,因为对列只有一个限制条件,就是至少两列,而至少两列则可以通过最后一列地方块数不为N来限制,于是我们不妨把第一维省略,直接用f[i][j]表示递推到一共有i个方块时最后一列有j个方块的方案种数。#include<stdio.h>#include<string.h>#define MAXD 510int N;long long f[MAXD][MAXD], ans[MAXD];void pre    阅读全文
        
            posted @ 2012-05-01 09:03
Staginner
阅读(198)
评论(0)
推荐(0)
        
            
        
        
摘要:        
URAL_1016 由于立方体位于同一个点时可能有不同的形态,从而有不同的结果,因此我们可以根据立方体的形态将棋盘上一个点拆成若干个点,然后做最短路即可。当然,由于状态比较复杂,可以用哈希表映射出每个点的存储位置。#include<stdio.h>#include<string.h>#define MAXD 1000010#define Q 1000000#define HASH 1000003#define INF 0x3f3f3f3fint dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, 1, -1};int ch[][6] = {{0, 1    阅读全文
        
            posted @ 2012-05-01 06:10
Staginner
阅读(272)
评论(0)
推荐(0)
        
            
        
        
摘要:        
URAL_1015 立方体只有3种本质不同的旋转,因此我们可以将所有骰子的初始状态以及旋转后的衍生状态都存到一个哈希表中,每次可以用bfs或dfs模拟旋转一个骰子,同时在哈希表中查找出现了哪些其他的骰子并标记已经查找过即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 200010#define HASH 100007int ch[][6] = {{5, 3, 2, 0, 4, 1}, {0, 1, 5, 2, 3, 4}, {2, 4, 1, 3, 0, 5}};int     阅读全文
        
            posted @ 2012-05-01 04:56
Staginner
阅读(241)
评论(0)
推荐(0)
        
            
        
        
摘要:        
URAL_1014 基本的贪心思路是留下尽量少的项,而且这些项的字典序尽可能小。因此,要优先生成8,然后优先生成9,6,4,最后生成质数。至于为什么先生成9,再生成6,再生成4,这个可以将2、3的个数分奇偶讨论一下就很清楚了。 此外还有一些细节需要注意,比如N=1的时候输出1,N=0的时候输出10。#include<stdio.h>#include<string.h>int N, h[15];void solve(){ int i; memset(h, 0, sizeof(h)); while(N % 8 == 0) ++ h[8], N /= 8; wh...    阅读全文
        
            posted @ 2012-05-01 04:03
Staginner
阅读(178)
评论(0)
推荐(0)
        
            
        
        
摘要:        
URAL_1013 和URAL_1009的思路是一样的,只不过需要高精度,所以就直接用java写了。具体的一些思路可以参考我的URAL_1009的题解:http://www.cnblogs.com/staginner/archive/2012/05/01/2477513.html。 如果N再大一点的话,也可以用二分矩阵的方法优化dp的计算过程。import java.math.BigInteger;import java.util.Scanner;public class Main { static int N, K; static BigInteger[][] f = new B...    阅读全文
        
            posted @ 2012-05-01 03:43
Staginner
阅读(189)
评论(0)
推荐(0)
        
            
        
        
摘要:        
URAL_1012 和URAL_1009的思路是一样的,只不过需要高精度,所以就直接用java写了。具体的一些思路可以参考我的URAL_1009的题解:http://www.cnblogs.com/staginner/archive/2012/05/01/2477513.html。import java.math.BigInteger;import java.util.Scanner;public class Main { static int N, K; static BigInteger[][] f = new BigInteger[200][2]; public sta...    阅读全文
        
            posted @ 2012-05-01 03:40
Staginner
阅读(239)
评论(0)
推荐(0)
        
            
        
        
摘要:        
URAL_1008 没有太看懂题目描述的搜索顺序,但感觉应该是bfs,当然写成bfs也确实能AC。 此外要注意题目中Input部分的说明,题意是在两种表示方法之间进行转换,因此如果输入Sample Output的内容就应该输出Sample Input的内容。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 110#define INF 0x7fffffffint N, g[MAXD][MAXD], vis[MAXD][MAXD], sx, sy, minx, miny, cnt    阅读全文
        
            posted @ 2012-05-01 03:28
Staginner
阅读(278)
评论(0)
推荐(0)
        
            
        
        
摘要:        
URAL_1011 由于限定了P、Q的精度,实际上总人数不会超过10^5,因此依次枚举可能的总人数即可。#include<stdio.h>#include<string.h>#define D 10000double P, Q;int query(int p, int q){ int i, x, y; for(i = 1; ; i ++) { x = i * p / D + 1; y = i * q / D; if(i * q % D == 0) -- y; if(x <= y) ...    阅读全文
        
            posted @ 2012-05-01 02:02
Staginner
阅读(177)
评论(0)
推荐(0)
        
            
        
        
摘要:        
#include<stdio.h>#include<string.h>#include<stdlib.h>int N, f;long long ans, x, px;int main(){ int i; while(scanf("%d", &N) == 1) { ans = -1; scanf("%lld", &px); for(i = 1; i < N; i ++) { scanf("%lld", &x); if(llabs(x - px) > ans) ...    阅读全文
        
            posted @ 2012-05-01 01:42
Staginner
阅读(181)
评论(0)
推荐(0)
        
            
        
        
摘要:        
URAL_1009 其实本质只有两类数,0和非0,所以可以用f[i][0]、f[i][1]表示递推到第i位时为0以及非0的情况种数进行dp。#include<stdio.h>#include<string.h>#define MAXD 20int N, K;long long f[MAXD][2];void solve(){ int i, j, k; f[1][1] = K - 1, f[1][0] = 0; for(i = 2; i <= N; i ++) f[i][0] = f[i - 1][1], f[i][1] = (K - 1) * (f[i - 1].    阅读全文
        
            posted @ 2012-05-01 01:26
Staginner
阅读(304)
评论(0)
推荐(0)
        
 
                    
                 
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号