上一页 1 2 3 4 5 6 ··· 17 下一页

2012年8月21日

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 阅读(239) 评论(0) 推荐(0) 编辑

2012年8月20日

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 阅读(258) 评论(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 阅读(194) 评论(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 阅读(238) 评论(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 阅读(233) 评论(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 阅读(231) 评论(0) 推荐(0) 编辑

2012年8月19日

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 阅读(241) 评论(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 阅读(213) 评论(0) 推荐(0) 编辑

2012年8月16日

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 阅读(171) 评论(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 阅读(194) 评论(0) 推荐(0) 编辑

2012年8月13日

[贪心] 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 阅读(286) 评论(0) 推荐(0) 编辑

2012年8月12日

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 阅读(239) 评论(0) 推荐(0) 编辑

2012年8月9日

[模板]大整数相加、相乘

摘要: 欢迎测试!/* 大整数 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 阅读(949) 评论(0) 推荐(0) 编辑

2012年8月8日

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 阅读(281) 评论(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 阅读(168) 评论(0) 推荐(0) 编辑

2012年8月7日

[简单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 阅读(263) 评论(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 阅读(195) 评论(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 阅读(184) 评论(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 阅读(221) 评论(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 阅读(214) 评论(0) 推荐(0) 编辑

上一页 1 2 3 4 5 6 ··· 17 下一页

导航