摘要: 题意:日本计划在东边的城市和西边的城市中建路,东边的点从1.....n,西边的点从1..........m,求这些点连起来后有多少交叉......思路:一开始看到这个题目,完全没有思路。想了一下,把图画出来后,发现.....原来是树状数组的题目。反思:这道题目思路很简单,但是我还是wa了3次,因为我没有将和定义为int64位......以前做树状数组题,也有好几次因为这个问题wa的,以后对于sum,一律将其赋值为64位的........................#include<iostream>#include<algorithm>using namespace 阅读全文
posted @ 2012-12-29 17:35 紫忆 阅读(950) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4107思路:在结构体中开max、min域,max、min用来标记某一段区间的最大最小值。在更新数据的时候,用区间的max\min去与p比较,如果整段区间都小于p,那么num+=c;如果min>=p,那么num+=2*c;这样,就不用每次都更新到最低端...........#include<iostream>using namespace std;#define M 200005struct{ int l,r,num; int max,min;}tree[M*4];int n,m,p;void 阅读全文
posted @ 2012-12-25 14:29 紫忆 阅读(521) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=3460题意:一开始没有明白题意,看了好久,才明白,原来它是将一个单词打印出来后再在打印机里面删除字母,也就是说,如果单词前缀相同,则只需删除单词不相同的部分,再插入下一个单词不相同的部分。这样的话,可以用字典树,要是单词前缀相同,则在字典树上只有一个结点,那么,要是将最长的那个单词也删除了,则是对字典树上的结点插入一次再删除一次,还要输出n次,也就是2*numnode+n;但是最长的那个单词len不需要删除,则是2*numnode+n-len;#include<iostream>#include& 阅读全文
posted @ 2012-12-24 15:57 紫忆 阅读(419) 评论(0) 推荐(0) 编辑
摘要: http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=11157#include<iostream>#include<cstring>using namespace std;typedef struct tree { int num,flag; tree *next[26];}tree;tree *root;char s[1005][25];void creat(char str[]){ int len=strlen(str); tree *p=root,*q; for(int i=0;i< 阅读全文
posted @ 2012-12-24 14:01 紫忆 阅读(743) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4031思路:将防御和攻击分开,用树状数组统计攻击次数,再开一个数组统计成功防御次数。#include<iostream>using namespace std;struct { int num,count;}d[20005];int c[20005],n,str[20005][2];int lowbit(int x){ return x&(-x);}void updatac(int i,int j){ while(i<=n) { c[i]+=j; i+=lowbit(i); }}in 阅读全文
posted @ 2012-12-24 13:12 紫忆 阅读(355) 评论(0) 推荐(0) 编辑
摘要: http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10486思路:树状数组。这道题重点怎么建立树到树状数组的映射关系:利用dfs遍历树,对每个节点进行两次编号,第一次搜到第i个节点时的深度dep,为这个节点管辖区间的上限low[i](也为这个节点的下标),然后搜这个节点的子节点,最后搜回来后的深度dep,为这个节点管辖区间的下限high[i],如下图所示。接下来就是树状数组部分了。[]中的第一个数,为树中这个点映射到线性数组中的所在位置。例如[1,5]中的1代表着映射之后,树的第一个结点在数组中也是第一个位置;#in 阅读全文
posted @ 2012-12-23 17:31 紫忆 阅读(244) 评论(0) 推荐(0) 编辑
摘要: http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10491题意:给出一组数据,初始值全部为0,再给出两个坐标,对在这范围之类的数据取反(1变为0,0变为1),在讯问一个点,输出那个点的值。思路:二维树状数组,区间更新,单点求值,先将取反次数相加,在对2取余。#include<iostream>using namespace std;#define max 1010int c[max][max];int lowbit(int x){ return x&(-x);}int getsum(int x, 阅读全文
posted @ 2012-12-20 21:14 紫忆 阅读(334) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1075思路:这是字典树水题,只要对插入字典书中的单词标号,然后再根据标号的单词去找相对应的单词就好..............最需要注意的是,hello插入字典树后,如果查找hell应该是返回0的。这里需要对单词末尾进行标记.................#include<iostream>#include<string.h>using namespace std;typedef struct tree{ int num; int flag; tree *next[26];}tree 阅读全文
posted @ 2012-12-18 15:33 紫忆 阅读(1366) 评论(0) 推荐(1) 编辑
摘要: 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?”解决这类问题,通常我们的方法是枚举从A串的什么位置起开始与B匹配,然后验证是否匹配。假如A串长度为n,B串长 阅读全文
posted @ 2012-12-13 14:30 紫忆 阅读(263) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2846思路:题目属于判断字符串中是否包含子串的问题,对于一般的字典树,用来判断前缀,而这里不能直接这么去建树。在建树的时候将字符串X=X1X2....Xn的分别以X1,X2....Xn开头的后缀子串插入到Trie树中,如此一来就可以判断某个字符串是否被包含在另一个字符串当中。当然,这里还有个问题,比如插入了字符串abab,那么当查找字符串ab时就会重复计数,因此需要多设计一个标识以表示在插入"abab"和"ab"时时同一个字符串即可(是同一个字符串就不需要使计数器加1) 阅读全文
posted @ 2012-12-13 14:24 紫忆 阅读(1032) 评论(0) 推荐(1) 编辑