![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 67
Jinx_jinx_again
啊啊啊啊哈哈哈
展开
-
CF 13E Holes (块状链表)
题目大意:有N个洞,每个洞有相应的弹力,能把这个球弹 i+power【i】 位置去。有两个操作,0 a b 把a位置的弹力改成b1 a 在a处放一个球,要你输出他能弹多少次,最后一次落在哪个洞。块状链表 是用数组作为节点的链表,但是链表又可以用数组实现。所以我们要记录的是block[i] 表示[i]这个位置属于第几个块每一个洞在这个块中跳到的最尾位原创 2014-03-11 22:28:50 · 1209 阅读 · 2 评论 -
POJ 2892 Tunnel Warfare (树状数组+二分)
题目大意:三个操作D pos 将pos位置摧毁,让它和周围不相连。Q pos 问和pos 相连的有多少个村庄。R 修复最近摧毁的村庄。思路分析:树状数组记录这个区间有多少个1。如果 [s-e] 有e-s+1个1 的话。那么这个区间是相连的。这样的话,我们就可以用二分的办法求出与某个位置最大相连的数量。还有这里二分while(l{i原创 2014-06-26 18:47:39 · 783 阅读 · 0 评论 -
uva 11987 Almost Union-Find (并查集)
题目大意:三个操作。1. 合并两个集合2.把第一个元素放到第二个集合里3.输出集合的数量和和。。思路分析:要用p记录这个元素所在集合编号,然后用编号建立并查集。#include #include #include #include using namespace std;typedef long long LL;int set[111111原创 2014-06-07 00:38:53 · 1024 阅读 · 0 评论 -
hdu 2222 Keywords Search(AC 自动机)
AC 自动机的入门题。k原创 2014-06-08 22:43:08 · 610 阅读 · 0 评论 -
hdu 2896 病毒侵袭 (ac自动机)
思路分析:query 的时候不要b原创 2014-06-09 18:22:09 · 678 阅读 · 0 评论 -
hdu 3065 病毒侵袭持续中 (ac 自动机)
思路分析:重要的是query 的时候 ,如果这个字母原创 2014-06-10 00:03:38 · 652 阅读 · 0 评论 -
Codeforces Round #216 (Div. 2) E. Valera and Queries (BIT)
题目大意:给出很多条分布在 x 轴上的线段。然后给出很多点集,问这些点集分布在多少条不同的线段上。思路分析:把点集分散成若干条线段。如果点集做出的线段包含了某一条给出的线段的话,也就是说这个点集上不会有点在这条线段上。所以我们就是求出 点集做出的线段包含了多少个给出的线段就可以了。那么也就是比较l r的大小,排序之后用BIT#include #in原创 2014-07-23 15:18:08 · 677 阅读 · 0 评论 -
POJ 3274 Gold Balanced Lineup (hash)
点我点我点我!!!基本上是求出前缀和,然后按照原创 2014-07-24 09:10:36 · 580 阅读 · 0 评论 -
uva 12003 Array Transformer (块状数组)
大白书上的393页。一直在原数组上乱搞。其实要用另外一个数组记录块。原数组是不能变的。注意好原数组和块数组的关系,细心一点处理边界。还是不难的。#include #include #include #include #define maxn 300005#define SIZE 600using namespace std;int a[maxn];原创 2014-07-06 15:46:21 · 1018 阅读 · 0 评论 -
hdu 1387 Team Queue (链表)
题目大意:不同的人在不同的队伍里,插入链表的时候如果这个链表里有他的队友,就把它放到最后一个队友的最后,如果没有队友,就把它放到整个链表的最后面。出链表的时候把第一个人拿出来。思路分析:要模拟这个链表就要记录这整个链表中的队伍存在的情况。所以要再开一个链表的头指针和尾指针,在整个大的链表中再模拟小区域的链表。然后就是deque部分,也就是注意head的判断以及更新。原创 2014-06-16 13:07:08 · 939 阅读 · 0 评论 -
POJ 2201 Cartesian Tree (笛卡尔树)
裸笛卡尔建树。#include #include #include #include using namespace std;struct node{ int key,value,id; bool operator < (const node &cmp)const { return key<cmp.key; }}sa原创 2014-06-17 23:51:11 · 716 阅读 · 0 评论 -
Codeforces Beta Round #10 B. Cinema Cashier (树状数组)
题目大意:n波人去k*k的电影院看电影。要尽量往中间坐,往前坐。直接枚举,贪心,能坐就坐,坐在离中心最近的地方。#include #include #include #include #define maxn 1000005#define lowbit(x) (x&(-x))using namespace std;struct BI原创 2014-07-09 22:31:09 · 938 阅读 · 0 评论 -
POJ 1195 Mobile phones (二维树状数组)
题目大意:对一个矩阵上的某个值进行修改,然后求出子矩阵的和。思路分析:这题discuss 上说二维线段树过不了。所以二维树状数组搞。理解树状数组的意义就是 1 - n 上所有的和。然后两重循环。#include #include #include #include #define maxn 1040#define lowbit(x) (x&(-原创 2014-07-31 20:33:11 · 595 阅读 · 0 评论 -
hdu 4777 Rabbit Kingdom (离线树状数组)
题目大意:给出m个查询,查询出[ l - r] 之间去 这个区间所有的数都互质的数有多少个。思路分析:首先我们处理出来每一个位置,左边和右边第一个与之不互质的数的位置。记在pre 和 next下。这个方法用分解质因数就好。一个区间内的答案,等于这个区间的所有数减去有与之互质数的个数。现在要统计的就是1.对于一个给定的查询[l,r] 区间,统计有多少个 i (l2原创 2014-09-07 00:32:15 · 1196 阅读 · 0 评论 -
Poj 2778 DNA Sequence (AC自动机+矩阵)
题目大意:给出N个串,问在长度为L的所有串中,不包含任一已知串的个数有多少个。思路分析:已知一个矩阵A,A[i][j] 表示 节点i 到 节点 j 有一条变可以到达的方法数。那么A^2 ,这个矩阵的 [i][j] 就代表这个节点 i 到节点 j 有两条边可以到达的方法数。那么知道这个结论,我们要做的就是求一个节点到另外一个节点,要经过L条变(对应这长度为L的单词),而又原创 2014-09-02 12:41:27 · 888 阅读 · 0 评论 -
hdu 4742 Pinball Game 3D (BIT + 分治)
题目大意:一个三维空间,如果球A 能 碰撞到 球B 要求A的三维的坐标都小于等于 B的坐标,A球撞到B求之后A球就消失了,问你最后n个球最多碰多少次,而且有多少种方式能达到这个数量。思路:可以联想到的是二维的这样的题目。如果是三维的话,就用排序x去掉一维。然后我们要找到 y z。然后对于一个区间上,我们对y排序,但是在排序之前记录下此时的id排序之后,就能得到y原创 2014-03-13 18:44:55 · 1012 阅读 · 0 评论 -
CF 295E Yaroslav and Points(Splay)
题目大意:两个操作1 id op 把id的位置+op2 id op 查询在【id,op】之间的所有的数的差思路:关键是pushup函数。自己退一下会发现,跟区间的总和,区间的节点个数有关。比如如果左区间是 1 2 的话右区间来一个 9那么就要加上9-1+9-2 #include #include #include #incl原创 2014-04-29 01:01:59 · 953 阅读 · 0 评论 -
hdu 3038 How Many Answers Are Wrong(并查集)
题目大意:给出m个询问,问【l,r】之间的和 ,求出有多少次询问不和之前的矛盾的。思路分析:用并查集记录当前节点到根节点的和。#include #include #include #include #define maxn 222222using namespace std;int set[maxn];int sum[maxn];in原创 2014-05-05 20:52:58 · 855 阅读 · 0 评论 -
SPOJ GSS5 Can you answer these queries V (线段树)
比GSS3 麻烦在于要判断两个区间的相交性。分为三种情况.1. x1 y1 x2 y2 这种情况就是 x1 y1 的右最大 + sum【y1 x2】 + x2 y2的做最大2.x1 x2 y2 y1 其实就是 y1==y2的时候要么区间在 x2-y2之间要么区间的头在 x1 x2之间,尾在 x2 y2之间3. x1 x2 y1 y2。这种情况原创 2014-05-18 00:09:34 · 1229 阅读 · 0 评论 -
hdu 4747 Mex(线段树)
将所有的数换种写法mex = mex(1,1)+mex(1,2)+...+mex(1,n)+mex(2,2)+...+mex(2,n)+...mex(n,n).应该知道如何算出 左端点不动的mex 也就是 mex(i,i) +....+mex(i,n)...那么如何进行下一次 就要删除左端点。更新的时候也好想到。但是要知道 mex(i,i原创 2014-03-28 00:44:07 · 1007 阅读 · 0 评论 -
hdu 2850 Load Balancing (优先队列 + 贪心)
题目大意:怎么分配n个任务到m个服务器上使得负载尽量平衡。思路:将任务从大到小排序,依次放入负载最小的那个服务器中。因为是spj 的缘故,所以可以使用这个贪心。比如数据6 27 5 3 3 3 3就会得到错误答案。#include #include #include #include #include using nam原创 2014-04-30 00:14:00 · 1040 阅读 · 0 评论 -
hdu 1251 统计难题 (字典树)
字典树的模板题。记录一下模板。#include #include #include #include using namespace std;struct node{ struct node *br[26]; int num;};node *root;void Trie_init(){ root=new node; root-原创 2014-03-29 22:35:29 · 620 阅读 · 0 评论 -
hdu 1671 Phone List (字典树)
先按长度从大到小排序。然后判断短的是不是长的的前缀就好。注意要回收内存#include #include #include #include using namespace std;struct node{ struct node *br[10]; int num;};node *root;void Trie_init(){原创 2014-03-29 23:04:35 · 815 阅读 · 0 评论 -
hdu 4099 Revenge of Fibonacci (字典树)
题目大意:问前缀为给出的 串的斐波那契数列的最小下标,斐波那契最多给出前40个。思路:我们保存斐波那契的前50 个。然后在高精度加的时候损失的精度也不会影响结果。然后插入的时候只插入前40个 多了就不插#include #include #include #include using namespace std;struct foo原创 2014-04-15 00:37:42 · 1045 阅读 · 0 评论 -
ZOJ 3765 Lights (SPLAY)
gcd[x] =GCD( GCD( gcd[ls],gcd[rs]),val[x]) );注意判断没有亮灯状态的情况#include #include #define inf 0x3f3f3f3f#define maxn 222222#define keyTree (ch[ch[root][1]][0])using namespace std;type原创 2014-04-15 23:05:39 · 845 阅读 · 0 评论 -
POJ 2513 Colored Sticks(字典树,并查集,欧拉回路)
题目大意:有很多根木棒,木棒两头各有颜色,问能不能将木棒首位相连。使得连接的地方颜色相同。思路分析:简单的欧拉回路的判断,用并查集判断联通性。如果允许的话也可以用map做,但是会超时。所以用字典树判断单词出现的位置。坑点是会有木棒数量为0 的情况#include #include #include #include #pragma com原创 2014-04-17 18:03:58 · 1005 阅读 · 0 评论 -
zoj 3612 Median (splay)
题目大意:添加和删除一个数,然后输出中位数。简单的Splay 维护Splay上有多少个节点就可以了#include #include #define inf 1LL<<60#define maxn 222222#define keyTree (ch[ch[root][1]][0])using namespace std;typedef long原创 2014-05-05 19:35:17 · 860 阅读 · 0 评论 -
POJ 1733 Parity game (并查集)
题目大意:问m个问题里面 前面有多少个问题是不矛盾的。问题是问区间里的 1 个个数是奇数还是偶数。思路分析:和 hdu 3038 是一个模型。然后判断奇偶用异或就可以了。#include #include #include #include using namespace std;int set[55555];int sum[55555]原创 2014-05-06 22:07:27 · 821 阅读 · 0 评论 -
SPOJ GSS3 Can you answer these queries III (线段树)
题目大意:求区间最大子区间的和。思路分析:记录左最大,右最大,区间最大。注意Q_L 和 Q_R 就好。#include #include #include #include #define lson num<<1,s,mid#define rson num<<1|1,mid+1,e#define maxn 55555using原创 2014-05-07 00:16:21 · 1096 阅读 · 0 评论 -
hdu 2492 Ping pong (线段树)
题目大意:对于任意一组 x,y,z 满足xa[y]>a[z] ) 如果有其中一个元素不同,则称为不同。问给出的序列里有多少组不同。思路:用线段树维护 一个数左边有多少个数比其小右边有多少个数比其大。然后相乘就得当前y可以得到的数量。#include #include #include #include #define lson n原创 2014-04-20 23:27:29 · 924 阅读 · 0 评论 -
hdu 3642 Get The Treasury (三维的扫描线)
题目大意:给出N个立方体。求一个三维空间中被包围三次的空间的体积之和。思路分析:发现Z的范围很小。那么我们可以枚举Z轴,然后对 x y做扫描线。而且不用枚举所有的Z ,只需要将Z离散化之后枚举。#include #include #include #include #define maxn 2222#define debug puts("fuck!原创 2014-05-09 23:53:24 · 1114 阅读 · 0 评论 -
ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)
题目大意:让每天都能吃到西瓜。最少需要花多少钱。思路分析:dp[pos] 就表示 要让 前i天每天都有西瓜吃,最少需要花多少钱。那么如果你买这个西瓜的话。那么这个西瓜能吃的持续时间都要更新一下。然后再在每个西瓜的更新部分取最小的,就可以是这个点所能得到的最小值。其实就是 dp[i] = min (dp[i] , dp[ j - k +1] + a[j]);原创 2014-05-17 00:52:47 · 1109 阅读 · 0 评论 -
SGU 319 Kalevich Strikes Back(线段树扫描线)
题目大意:n个矩形,将一个大矩形分成 n+1 块。矩形之间不重合,但是包含。求这n+1个矩形的面积思路分析:用线段树记录他们之间的父子关系。然后dfs 计算面积。当给出的矩形上边的时候,就要记录到该矩形的父亲去。#include #include #include #include #define lson num<<1,s,mid#define rs原创 2014-04-26 01:26:44 · 928 阅读 · 0 评论 -
SPOJ GSS4 Can you answer these queries IV (线段树)
题目大意:给出N个数 0 操作 把 l ----- r之间的数全部开平方1 操作 输出 l -----r 之间的和思路分析:判断区间里的数字是否全相同。如果相同,将cov 置为该数查询的时候和更新的时候,如果碰到cov != -1 的 就直接返回就可以了#include #include #include原创 2014-05-17 17:09:33 · 1168 阅读 · 0 评论 -
Hdu 5032 Always Cook Mushroom (树状数组)
题目大意:在一个1000*1000的二维平面上,每一个整点都有一个权值,权值大小是 the production in the grid points (x, y) is (x + A)(y + B) where A, B are two constant. 思路分析:先离线处理出所有的询问,对于每一个询问都有一个极角,按照极角排序。然后对于平面上每一个点,都依次的加入到B原创 2014-09-25 00:45:41 · 1252 阅读 · 1 评论