数据结构
文章平均质量分 69
Weiguang_123
这个作者很懒,什么都没留下…
展开
-
poj2823(单调队列队列)
STL:在队尾删除,在队尾进队#include #include using namespace std; const int maxn=1000000+10; int a[maxn],b[maxn],c[maxn]; int main() { ios::sync_with_stdio(false); int i,n,k;原创 2012-03-30 00:02:43 · 464 阅读 · 0 评论 -
hdu (3874)树状数组
求区间【L,R】的不同的数的和。解答:这题没有离散化。先记录该位置出现的数字往前最近出现的位置,然后按查询的的右端点排序,最后一次扫描各个点同时检查右端点在该位置的询问。#include #include #include #include #include #include #define LL __int64using namespace std;con原创 2012-08-20 15:22:05 · 605 阅读 · 0 评论 -
poj 3067(树状数组求逆序对)
题意:日本岛东海岸与西海岸分别有N和M个城市,现在修高速公路连接东西海岸的城市,求交点个数。做法:记每条告诉公路为(x,y), 即东岸的第x个城市与西岸的第y个城市修一条路。当两条路有交点时,满足(x1-x2)*(y1-y2) 上面说的可能有点难理解,详细说明如下。记第i条边的端点分别为xi,yi。由于x是从小到大排序的,假设当前我们在处理第k条边,那么第1~k-1条边的x原创 2012-08-22 14:50:48 · 5310 阅读 · 1 评论 -
poj (3468)线段树lazy操作
题意: 区间每个数加上一个数,询问一个区间之和.#include #include #include #include #include #include #include #include #include #define LL long long#define ls rt<<1#define rs rt<<1|1#define lson L,原创 2012-08-26 16:25:53 · 1033 阅读 · 0 评论 -
分状态的树状数组hdu 4267
我们用tree[v][k][mod]来表示树状数组的状态。假如a、b、c、k,那么用树状数组,区间更新,update(b,a%k,k,c),update(a-1,a%k,k,-c) ,就可以了~~~也就是说,区间[1,b]内每个ui % k == mod ,那么ui 的值就加c ,然后[1,a-1]区间内每一个ui-c,于是就完成了[a,b]这个区间内的更新了~~查询q的时原创 2012-09-11 03:37:21 · 686 阅读 · 0 评论 -
树状数组总结
树状数组的基本知识已经被各种大牛和菜鸟讲到烂了,我就不多说了,下面给出基本操作的代码。假定原数组为a[1..n],树状数组b[1..n],考虑灵活性的需要,代码使用int *a传数组。 #define lowbit(x) ((x)&(-(x)))int sum(int *a,int x){int s=0;for(;x;x-=lowbit(x))s+=a[x];retur原创 2012-09-11 03:30:55 · 639 阅读 · 0 评论 -
hdu 4125(手写递归 栈 )
(AC仅限于hdu,跑了3900+ms,险过。不过在poj上TLE,因为poj上的时间是3000ms)解题思路:对于此题首先将所给的数字构造一棵平衡二叉树,不过不能用纯模拟去构造这棵树,因为所给的数字构成的树可能就是一条链状!若用纯模拟去构造的话无疑会TLE!那么我们观察易得下一个数字的父节点必定是当前已加入的所有节点中比下一个节点大的所有数中的一个最小值,或者是当前已加入的所原创 2012-09-14 16:17:26 · 1248 阅读 · 1 评论 -
KMP
#include #include #include using namespace std;const int N=10000;char str[N];char sub[N];int next[N];int len;void getnext(){ len=strlen(sub); next[0]=-1; int i,j=-1;原创 2012-10-12 09:16:14 · 460 阅读 · 0 评论 -
矩形面积的并(交)
#include #include #include #include #include #define MAXN 22222#define MAXM 5555#define INF 100000007#define lch(x) x<<1#define rch(x) x<<1|1#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1原创 2012-10-12 22:44:16 · 1219 阅读 · 0 评论 -
hdu 3954(线段树的特殊lazy操作)
发现最巧妙的就是定义了最小升级系数dis,因为这个变量相当有用,但是又不容易想到(看来思维真的很重要)。。。dis变量的定义,很好的将lazy结合起来了。就用简单的加减就很直观的转换。。那么在有了这个变量之后,我们也就可以像一般线段树那样操作了。。若当前lazy标记要更新,则传递给子树。。并把自己的lazy标记清空。。若当前最大经验值大于升级的所需经验时就开始往下更新,直到不能更新原创 2012-10-21 15:14:02 · 1793 阅读 · 0 评论 -
hdu4027(线段树的lazy操作)
刚开始的时候第一反应这道题是成段的更新,不能一个数一个数的更新,那样肯定会超时的!但是再想了一会儿之后,发现成段更新比较困难,主要是这道题的每个节点的更新并不是统一的(也就是说并不是都加K,或者都减K之类的);所以我们并不能像一般的成段更新那样去更新。再仔细观察后,其实我们可以很容易的发现,一个数k(k也就是说当一个数为1的时候,我们没有必要对它进行操作和更新;而且一个很大的数仅仅原创 2012-10-21 20:52:50 · 2303 阅读 · 0 评论 -
hdu4366(线段树)
/*题意:给你 n个点。他们有 上下级关系,一个点只有一个上级,一个上级 可以有多个下级,每个点有两个属性,能力值 、忠诚度(每个节点的忠诚度不同),求我们要删除 一个节点, 则我们 需从 其下级中选出 一个节点,其能力值 比该节点 要高,且 忠诚度是(比其能力高的下级节点中的)最高题解:首先将树状结构,转化为 线状结构, 可以遍历一遍将树上每个点标记为一维区间上的某个点,且在同一棵子树原创 2012-11-03 16:28:49 · 1727 阅读 · 0 评论 -
hdu4391(线段树查找区间内出现的个数)
/*题意:刷墙, 以开始 有 n个节点,每个节点有一种颜色 ,m 次询问m次 输入 a,l,r,z 如果 a=1 将 l到 r 刷为 z 颜色,如果 a=2 询问 l 到 r 有 多少个 和 z 相同的 节点官方题解是: 分段哈希,自己一开始想写 一下 ,单写着写着 就 觉得很麻烦 ,各中判断条件。。。。。后来改为 线段树 优化了下 ,就是加了 个 mi mx 判断 查询原创 2012-11-03 21:42:56 · 2709 阅读 · 5 评论 -
hdu(4325)线段树+离散化+lazy
给你N朵花开的区间,然后M个询问,问你这点有多少花开。因为-1e8#include #include #include #include #include using namespace std;const int N=100003;int n,m;struct Node{ int l,r; int v; int ly;原创 2012-10-29 02:45:10 · 632 阅读 · 0 评论 -
Java HashMap 设计原理
HashMap 是Java使用非常频繁的一个类,由于最近比较清闲,特地翻看一下源码。下面为自己的个人体会,其中部分地方参考了网上的一些文章。 1.HashMap的存储特点。 既然叫HashMap,那么它就具有哈希表的一些特点:(1)需要哈希方法,把关键字映射到哈希表中(2)需要解决哈希冲突问题,即不同的关键字映射到同一个哈希地址上。这里先说哈希冲突的解决问题。(该图来源原创 2015-06-21 21:00:52 · 807 阅读 · 0 评论 -
hashmap 和 concurrentHashMap
通过Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个原创 2015-06-21 22:58:56 · 627 阅读 · 0 评论 -
hdu 3584 (三维树状数组模板 )
#include #include#include #include using namespace std;const int N=200;int C[N][N][N];int n,m;int lowbit(int a){ return a&(-a);}void Modify(int x,int y,int z,int c){ int tmpy,tmpz;原创 2012-08-21 02:30:40 · 800 阅读 · 0 评论 -
hdu 4046(树状数组)2011年预选网络赛
题意:给一个字符串中,0:L,R为L到R之间有多少个连续的wbw,可以重叠。1:p,ch为在字符串中的p位置改为ch。n为字符串的长度,m为操作的次数。思路:这道题没能该出来很自责,因为很简单。更改一个占位置最多只影响到三个位置。每个位置代表从这位置开始往后连续的三个字符是否为"wbw"。用梳妆数组统计就可以了。注意跟换之前和之后的变化关系。#include #include #i原创 2012-08-20 13:41:00 · 1432 阅读 · 0 评论 -
hdu 3938(离线并查集)
/* 离线并查集,边按小到大排序,询问也按小到大排序; 对于询问x,答案就是询问x-1的值加上询问x-1的L1和询问x的L2之间的边合并带来的值 对于一条属于L1和L2之间的边,如果端点u,v在一个集合中,忽略,否则新开的路是u 所在集合的大小乘上v所在集合的大小 */ #include #include #include using name转载 2012-04-14 15:33:31 · 602 阅读 · 0 评论 -
poj 2528 (线段树+离散化)
大致题意: 有一面墙,被等分为1QW份,一份的宽度为一个单位宽度。现在往墙上贴N张海报,每张海报的宽度是任意的,但是必定是单位宽度的整数倍,且<=1QW。后贴的海报若与先贴的海报有交集,后贴的海报必定会全部或局部覆盖先贴的海报。现在给出每张海报所贴的位置(左端位置和右端位置),问张贴完N张海报后,还能看见多少张海报 线段树就不说了》》主要是离散化怎么处理原创 2012-06-30 17:42:27 · 701 阅读 · 0 评论 -
poj 2155 (二维树状数组)
这个题目就是给你一个0-1矩阵,每次给你一个长方形的矩形,在矩形内的所有数据都做非运算。 看出来是一个二维的树状数组,就是求每个点经过了几次翻转,而c数组就是记录翻转的个数的!相当于加 1; Q时就做%2或者是&2运算; 很基础的模板题。代码:#include#include #include #include using原创 2012-06-26 11:44:11 · 456 阅读 · 0 评论 -
poj 2352(树状数组)
这道题好像被贱做了,看起来像二维的树状数组,其实只是一维的,可能是数据太大了,矩阵开不那么大,因为题意是求一个矩阵中做它左下部分的个数,而去输入的顺序是按y升序,后x升序输入。其实如果不按这个顺序可以下排序。 然后就是一维的树状数组的思路了。转个图,可以知道它的这数组性质了:http://dongxicheng.org/structure/binary_indexed_tree/#原创 2012-06-26 14:27:49 · 515 阅读 · 0 评论 -
poj 4047金华邀请赛 D题 (线段树+lazy优化)
/*题意:给出一个N个数的序列以及一个k(0<k<=n<=200000),m个操作p,x,y,其中p=0:将x位置的数替换为yp=1:将x y位置的数互换p=2: 查询x-y位置区间连续k个数的和的最大值分析:因为要求连续区间的最大,我们可以把区间和当做一个节点,这样区间就代表一个点,点就代表一个区间了,这样就可以把原来1~n个数重新分为1~n-k+1了,所以我们只要建一颗总节点范围为原创 2012-07-08 07:09:49 · 2045 阅读 · 0 评论 -
hdu4000(一维树状数组模板)
求i<j<k且a[i]<a[j]<a[k]的组数#include #include using namespace std;const int N=100001;int C[N];int n;void init(){ for(int i=1;i<=n;i++) C[i]=0;}int lowerbit(int a)原创 2012-04-15 16:32:45 · 1337 阅读 · 0 评论 -
hdu 1892(二维树状数组模板)
#include#include #include #include using namespace std;const int size = 1002;int C[size][size];int lowbit(int n){ return n&(-n);}void Modify(int x, int y, int de原创 2012-04-15 16:36:12 · 727 阅读 · 0 评论 -
hdu 1251(字典树)
经典的字典树题目。。字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。#include #include #include #in原创 2012-04-12 01:17:06 · 453 阅读 · 0 评论 -
多校第一场:hdu(4302)(树状数组+二分)
树状数组,1时候,二分左边第一个不是0的位置,和二分右边第一个不是0的位置.#include#include#include#include#include#include#include#include#include #includeusing namespace std;const int inf=1<<30;const int M=100030;int nu原创 2012-07-22 00:00:18 · 836 阅读 · 0 评论 -
hud 4358(树状数组+离散化)
http://page.renren.com/601081183/note/865145486?null&ref=minifeed&sfet=2011&fin=1&ff_id=601081183&feed=page_reblog&tagid=1981432999&statID=page_601081183_2&level=2#pragma comment(linker, "/STACK:102原创 2012-08-12 16:22:10 · 622 阅读 · 0 评论 -
zoj (单点更新区间查询:线段树)
题意:有n天,每天都可以买西瓜,每个西瓜的价格是ai,每个西瓜能吃bi天。问这n天每天都有西瓜吃的最小的代价是多少?如果你在第i天买了一个西瓜,那么之前买的西瓜就要全部扔掉,才能开始吃新的西瓜。定义dp[i]为到i天为止,每天都有西瓜吃的最小代价,那么状态转移方程就是:dp[i]=min(dp[i],dp[i-k-1]+a[i-k])。这样时间复杂度会达到O(n^2),所以要优化。在递推的过程转载 2012-08-13 22:00:37 · 982 阅读 · 0 评论 -
多校第三场:hdu4324(判三角形的有向环)
题意:在图中找三角形的有向环。先选出一部分的边建一棵树,判断剩下的边加进去是否出现环。#include #include #include #include using namespace std;const int M=2005;struct NN{ int v; int vis;};vectoredge[M];int fa[M原创 2012-08-01 14:09:45 · 1323 阅读 · 0 评论 -
hdu 2795(线段树:query:区间求最大值的位子)
题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子思路:每次找到最大值的位子,然后减去L线段树功能:query:区间求最大值的位子(直接把update的操#include #include #include #define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1using names原创 2012-08-18 10:21:21 · 663 阅读 · 0 评论 -
poj 2886(线段树+反素数)
#include #include #include #define lson L , m , rt << 1#define rson m + 1 , R , rt << 1 | 1using namespace std;const int maxn = 520000;struct Node{ int L,R; int sum;}tree[maxn*4];in原创 2012-08-18 15:39:01 · 1953 阅读 · 0 评论 -
poj 2828(线段树:单点插入,区间查询)
排队买票,但是 中途 出现插队情况,比如 0 123,代表值为123的人 插入到 0 的位置,如果后面 出现 0 456,那么新的 0的位置就是 456,123就变成是 1的位置了观察发现,最后一个插入到该位置的人位置是固定的,那么我们可以从后面进行插入操作,pos val 代表val要插入到pos位置,那么就是说 pos 前面要留出 pos个位置,因为 是从 0 开始的。线段树 :r原创 2012-08-18 12:06:45 · 1238 阅读 · 0 评论 -
java 基础整理
1.线程和进程的关系:进程是独立的运行环境,可以看作一个程序或应用,线程可以看作进程中的一个任务,几个进程可以同时有多个线程在运行,线程可以被称为轻量级进程,线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。2.多线程编程的好处:多线程并发可以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态,servlet通过多线程方式运行其service方法,一个实例原创 2015-06-21 20:53:53 · 894 阅读 · 0 评论