摘要: 昨天IcePoint第一次参战,首战失利!开始看到一道线段树的题,db前一天刚做的,敲之1A。我和gx看一道物理题,开始分析错过程了,3次WA,果断放下!后来db让我看一道贪心的题,纠结的是我们两个都没想出好的贪心策略,只好先放下。gx在做一道大数的题,用的枚举。。。我晕,果断TLE。然后我去看那题,用了一次log(),还是TLE。。。最后想到原来这题很水。被题坑了!整理好思路,敲之,3A。这时他们俩在做另外几道题,只是题意难懂,思路都很水。我有回来看那道贪心的题,想了半天,一狠心直接枚举,没想到果断1A。这是db已经把倒数第二题A了,然后他们俩人开始看一道二进制的题,很不厚道的扔给我一道.. 阅读全文
posted @ 2011-08-14 12:02 AC_Von 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 计算几何讲解:http://dev.gameres.com/Program/Abstract/Geometry.htm#判断两线段是否相交一个比较好的范例:http://www.wutianqi.com/?p=2407代码:#include <stdio.h>struct node{ double x1, y1; double x2, y2;}l[110];double X(double a, double b, double c, double d){ return a*d - b*c;}int judge(int i, int j){ double a = X(l[i].x1- 阅读全文
posted @ 2011-08-12 17:17 AC_Von 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 跟2182一样,都是找空。把数据倒插,pos[i]表示前边有pos[i]个空位,每填一个空位就把那个空位删掉。例如(0表示空位):0 201 191 380 31初始空位:1 2 3 40 0 0 0把第n个数填到pos[n]+1空位上:1 2 3 431 0 0 0第n-1个:2 3 40 38 0第n-2个:2 40 19第一个:220最后的结果就是1 2 3 431 20 38 19用线段数把1-n之间的空位数存起来,然后没次查询都更改一次 阅读全文
posted @ 2011-08-12 10:28 AC_Von 阅读(288) 评论(0) 推荐(0) 编辑
摘要: 这题其实就是求最长上升子序列,可是今天丢人丢大了,前几天刚做个这道题,今天比赛直接把代码贴上了,晚上学长让我讲讲怎么用DP做的。一看就傻眼了,我自己心里还想这题怎么能这么做呢!讨论完题目回头一想还确实是这么回事。唉,悲剧啊~~~~可以看看这组数11389 207 155 300 299 170 158 65 299 180 40它的最长上升序列怎么取?肯定不能在某个元素所在的递减子序列里边取两个元素。所以,从每个下降子序列里边取一个元素构成它的最长上升子序列。这个序了的最长上升子序列就是155,170,299。所以,最长上升子序列的元素个数就是题目要求的下降子序列的个数。最长上升子序列的求法这 阅读全文
posted @ 2011-08-11 21:07 AC_Von 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 这题刚开始没看懂啥一个,琢磨了半天,看了看Discuss。其实就是求某个坐标点(x, y)的左下放还有几个点,很巧的是题目的数据都已经排好序了,所以根本不用考虑y的事,树状数组求和水过了。(注意,i = 0时死循环,要把数据都往后移一个!)#include <stdio.h>#define N 32010int c[N], ans[N];int lowbit(int i){ return i&(i^(i-1));}void add(int i, int val){ i++; while(i < N) { c[i] += val; i += lowbit(i); }}i 阅读全文
posted @ 2011-08-10 20:58 AC_Von 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 线段树“以点代段”的思想很巧妙,但有时候数据过大直接建线段树会MLE,就比如这道题,如果不进行优化的话肯定是要MLE的(1 <= li<= ri <= 10000000,这得多大的内存消耗啊)。所以,离散化这个概念被引入,离散化这个词最近经常听,但就是不知道具体如何实现,今天借这道题学习了一下,这里写点总结。 比如说这样一串数(3,10000),(9,1000000),(5,100000),(1,1000),(7,1000000);用这组数据直接更新线段树,很有可能会挂掉的(不信可以自己试试。。。)。但如果在不影响线段树更新状态的前提下,把这几个大数用相应的小数取代,再更新的 阅读全文
posted @ 2011-08-10 17:05 AC_Von 阅读(1035) 评论(0) 推荐(2) 编辑
摘要: 用线段树水过,3s多。。。不说了,上代码:#include <stdio.h>#define inf 0x7fffffff#define N 50010struct node{ int l, r; int min, max;}node[N*4];int num[N], nmax, nmin;void creat(int t, int l, int r){ node[t].l = l; node[t].r = r; node[t].min = inf; node[t].max = -inf; if(l == r - 1) { if(num[l] > num[r]) { node 阅读全文
posted @ 2011-08-09 20:59 AC_Von 阅读(665) 评论(0) 推荐(0) 编辑
摘要: 初期:一.基本算法:(1)枚举. (poj1753,poj2965)(2008-10-27Done 位运算+宽搜)(2)贪心(poj1328,poj2109,poj2586)(3)递归和分治法.(4)递推.(5)构造法.(poj3295)(6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:(1)图的深度优先遍历和广度优先遍历.(2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)(2008-08-29Done)(poj1860,poj3259,poj1062,poj2253,poj1125 阅读全文
posted @ 2011-08-09 19:30 AC_Von 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 经典的线段树题目,包含了线段树的插入,更新,计数,操作过程如下:1、[0,8000]递归建立线段树,初始时每段的颜色为-1,表示无色;2、每次输入,更新对应线段的颜色;3、在区间[0, 8000]上统计颜色>=0的区间(即为已经图色的区间),将所对应的颜色映射到数组col[]中;4、对col[]进行简单的操作,输出得到的颜色和所对应的区间数;下面以50 4 40 3 13 4 20 2 20 2 3为例演示一下过程,这里简化一下,我只建立[0, 4]的线段树:代码+注释:#include <stdio.h>#include <stdlib.h>#include & 阅读全文
posted @ 2011-08-09 10:45 AC_Von 阅读(205) 评论(0) 推荐(2) 编辑
摘要: 这道题目的长度很吓人,其实就是一道很裸的Hufuman编码问题,一般的《数据结构》书上都有,不说了,上代码:#include <stdio.h>#include <string.h>#define N 128#define inf 0x7fffffffstruct node{ int val; //权值int left, right, parent;}p[1000];int f[N]; //存放每个字母权值int len[N]; //统计编码的长度void hufuman(int n){ int i, min1, min2, pos1, pos2, flag... 阅读全文
posted @ 2011-08-08 09:55 AC_Von 阅读(258) 评论(0) 推荐(0) 编辑
摘要: Crazy Search Time Limit: 10000/5000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 772Accepted Submission(s): 289Problem DescriptionMany people like to solve hard puzzles some of which may lead them to madness. One such puzzle could be finding a hidden prime number in 阅读全文
posted @ 2011-08-07 21:37 AC_Von 阅读(1512) 评论(1) 推荐(0) 编辑
摘要: 当今世界最为经典的十大算法--投票进行时作者:July、原地址:http://blog.csdn.net/v_july_v/article/details/6228235时间:二零一一年三月七日。参考:十三个经典算法研究与总结、目录+索引,本人第一大原创作品。内容说明:I、 本文原名为:当今世界最受人们重视的十大经典算法,后改为如上题目。II、本文分为俩部分: 第一部分、来自圣经的十大算法:为某网友票选出来的十个来自圣经的算法。 第二部分、当今世界最为经典的十大算法--投票进行时:是恳请本文的读者为您心目中当今世界最为经典的算法投上一票,最终在本BLOG内票选产生当今世界最为经典的十大算法(. 阅读全文
posted @ 2011-08-07 10:39 AC_Von 阅读(513) 评论(0) 推荐(1) 编辑
摘要: 水题,但是要细心#include <stdio.h>#include <stdlib.h>#define N 10007int a[N], b[N];int cmp(const void * a, const void * b){ return *(int *)a - *(int *)b;}int main(){ int n, i; while(scanf("%d", &n) != EOF) { for(i = 0; i < n; i++) scanf("%d", &a[i]); qsort(a, n, si 阅读全文
posted @ 2011-08-06 09:08 AC_Von 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 这题的数据有点问题,给的N个数里边最大的数是多少不知道,直接猜了个数用hash做了,居然1A了。。。。#include <stdio.h>#include <string.h>#define N 100007int hash[N];int main(){ int n, i, a; while(scanf("%d", &n) != EOF) { memset(hash, 0, sizeof(hash)); int max = -1; while(n--) { scanf("%d", &a); if(a > ma 阅读全文
posted @ 2011-08-06 08:24 AC_Von 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 背包问题,发现这个东西很灵活。看来还是不够理解啊。#include <stdio.h>#define N 1024struct knap{ int w; double v;}a[N];float dp[N*10+7];int main(){ int n, m, i, j; while(scanf("%d%d", &n, &m) != EOF) { if(!n && !m) break; for(i = 1; i <= m; i++) scanf("%d%lf", &a[i].w, &a[i 阅读全文
posted @ 2011-08-05 20:38 AC_Von 阅读(180) 评论(0) 推荐(0) 编辑
摘要: Robberieshttp://acm.hdu.edu.cn/showproblem.php?pid=2955背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱最脑残的是把总的概率以为是抢N家银行的概率之和…把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋);正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i].v)其中,f[j]表示抢j块大洋的最大的逃脱概率,条件是f[j-q[i].money]可达,也就是之前抢劫过;始化为:f[0]=1,其 阅读全文
posted @ 2011-08-04 22:12 AC_Von 阅读(344) 评论(0) 推荐(1) 编辑
摘要: 活说这道题,“如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。”这句话!有病!! 如果测试数据是 3 0 1 2 结果应该是 3 0 2,可是OJ的数据是 3 1 2,如果不是看到Discuss里有人提醒,我一个月也找不出错误来!! 不说了,气愤!!看代码:#include <stdio.h>#define N 10010#define inf 0x7fffffffint main(){ int a[N]; int n, i, sum, f, max; //freopen("data.in", "r", std 阅读全文
posted @ 2011-08-04 10:26 AC_Von 阅读(262) 评论(1) 推荐(0) 编辑
摘要: 动态规划题,F[n] 可由2, 3, 5, 7与F[n-1]的乘积得到,取这四个数的的最小值,就是当前F[n]的值,即F[n] = min{F[n-1]*2, F[n-1]*3, F[n-1]*5, F[n-1]*7}。 前6个数的递归过程: n1 = 1; n2 = min{1*2, 1*3,1*5,1*7} = 2; n3 = min{2*2, 1*3, 1*5, 1*7} = 3; n4 = min{2*2, 2*3, 1*5, 1*7} = 4; n5 = min{3*2, 2*3, 1*5, 1*7} = 5; n6 = min{3*2, 2*3, 2*5, 1*7} = 6; 代. 阅读全文
posted @ 2011-08-04 08:14 AC_Von 阅读(1045) 评论(0) 推荐(2) 编辑
摘要: 位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。C语言提供的位运算符列表:运算符含义描述&按位与如果两个相应的二进制位都为1,则该位的结果值为1,否则为0|按位或两个相应的二进制位中只要有一个为1,该位的结果值为1^按位异或若参加运算的两个二进制位值相同则为0,否则为1~取反~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0<<左移用来将一个数的各二进制位全部左移N位,右补0>>右移将一个数的各二 阅读全文
posted @ 2011-08-03 20:38 AC_Von 阅读(242) 评论(0) 推荐(1) 编辑
摘要: 今天有点郁闷,想刷两道水题解解闷的,结果找上了这道题,结果。。。。WA了n次,刚开始没考虑到大数,直接写了个整数的递归交上去了,然后WA就下来了!!后来看到discuss里有人说用字符串写,结果整了半天就是WA,没办法,找来别人的代码一看,我晕!以0结束,我直接没判断。。。。悲剧的一天啊~~~ 不说了, 看代码:#include <stdio.h>#include <string.h>int root(int x){ int sum = 0; while(x) { sum += x%10; x /= 10; } if(sum < 10) return sum; e 阅读全文
posted @ 2011-08-03 20:13 AC_Von 阅读(193) 评论(0) 推荐(1) 编辑
摘要: 借杭电这道题总结一下最长上升子序列(LIS)问题,最长上升子序列有o(n^2)和o(nlogn)两种算法(Matrix67那还有一种o(nm)的算法,不过没看懂)。 o(n^2)算法不用多说,就是依次遍历整个序列,每一次求出从第一个数到当前这个数的最长上升子序列,直至遍历到最后一个数字为止,然后再取dp数组里最大的那个即为整个序列的最长上升子序列。我们用dp[i]来存放序列1-i的最长上升子序列的长度,那么dp[i]=max(dp[j])+1,(j∈[1, i-1]); 显然dp[1]=1,我们从i=2开始遍历后面的元素即可。 LIS函数代码如下:// Author: Tanky Woo//. 阅读全文
posted @ 2011-08-03 19:55 AC_Von 阅读(318) 评论(0) 推荐(1) 编辑
摘要: DP,代码有点小白。。。#include <stdio.h>#include <string.h>#define N 351int main(){ int t, i, j, max; int a[N][N], f[N][N]; //freopen("data.in", "r", stdin); scanf("%d", &t); memset(a, 0, sizeof(a)); for(i = 1; i <= t; i++) for(j = 1; j <= i; j++) scanf(&quo 阅读全文
posted @ 2011-08-03 11:08 AC_Von 阅读(306) 评论(0) 推荐(0) 编辑
摘要: From:http://roclinux.cn/?p=864用快捷键,有两个好处:1 成就感!2 效率!停下手里活,学点一举两得的小技能,保证五分钟搞定!“棕色粗体”表示“我推荐的”!Ctrl-A 相当于HOME键,用于将光标定位到本行最前面Ctrl-E 相当于End键,即将光标移动到本行末尾Ctrl-B 相当于左箭头键,用于将光标向左移动一格Ctrl-F 相当于右箭头键,用于将光标向右移动一格Ctrl-D 相当于Del键,即删除光标所在处的字符Ctrl-K 用于删除从光标处开始到结尾处的所有字符Ctrl-L 清屏,相当于clear命令Ctrl-R 进入历史命令查找状态,然后你输入几个关键字符 阅读全文
posted @ 2011-08-03 08:20 AC_Von 阅读(182) 评论(0) 推荐(0) 编辑
摘要: Dijkstra算法 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的 阅读全文
posted @ 2011-08-02 22:10 AC_Von 阅读(587) 评论(0) 推荐(0) 编辑
摘要: 一道大水题,居然放了好几个星期才过,无语。。。。#include <stdio.h>#include <string.h>int main(){ char s[100000], tmp[3]; while(gets(s) != NULL) { int i = 0, flag = 0; tmp[2] = 0; while(s[i]) { tmp[0] = s[i]; tmp[1] = s[i+1]; if(!strcmp(tmp, "“") || !strcmp(tmp, "”")) flag = !flag; switch(s[i 阅读全文
posted @ 2011-08-02 21:10 AC_Von 阅读(360) 评论(0) 推荐(0) 编辑