![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 84
cstirling
这个作者很懒,什么都没留下…
展开
-
HDU 5877 Weak Pair 【dfs】【树状数组】【离散化】
题目:点击打开链接题意:给出一棵有根树,找出多少对点,满足两点是祖先关系且权值之积小于等于k。思路:可以用链式前向星保存边,建立一棵树,容易想到au*av代码:#include #include #include #include #include #include #include #include #define PR pair#define MP make_原创 2016-10-15 09:53:21 · 270 阅读 · 0 评论 -
HDU 3336 Count the string 【KMP】【dp】
题目:点击打开链接题意:给定一个字符串,求出字符串中对应各个前缀,在字符串中出现的次数和。分析:显然用kmp,得出next数组后观察容易得到,每一个字符的next为要跳转的位置,则当每次跳转后都要给先前会跳转的字符次数加一,故可以用dp的思想,根据当前的次数和,下一个(即序号前一个)的次数等于当前位置的次数加一,将所有的次数相加就可以得到答案了。原创 2016-10-14 01:32:44 · 178 阅读 · 0 评论 -
Sam后缀自动机模板
const int maxn = 112345 ,mlen = 26;struct Sam{ int len[maxn*2],fa[maxn*2],nex[maxn*2][mlen]; int _cnt,root,omg; int newNode(int L = 0){ len[_cnt] = L; memset(nex[_cnt],fa原创 2016-12-15 17:15:02 · 352 阅读 · 0 评论 -
浙江理工大学zstu2016新生赛题解
A:Save the Princess题目:点击打开链接题意:n个人横向排好队,其中左数第k个是公主,LYF和BH分别可以杀掉队列最左边的或者最右边的人,直到某个人拯救公主,两个人都会选择最佳杀人方案,LYF先杀,问谁能拯救公主。分析:当公主在队列两端时,LYF先行动,所以LYF是赢家,其他情况时,当某个人正好杀掉与公主相邻的人时,另一个人肯定是赢家,所以不能先杀公主与公主相邻的人,因原创 2016-11-21 17:37:05 · 4852 阅读 · 8 评论 -
字典树模板
struct trie{ int cnt; trie *nxt[26]; trie() { cnt=1; for(int i=0;i<26;i++)nxt[i]=NULL; }};trie *root,*p,*q;void Insert(char *str){ p=root; for(int i=0;原创 2017-03-17 16:07:10 · 230 阅读 · 0 评论 -
树链剖分&树状数组区间加减区间求和模板
#pragma comment(linker,"/STACK:100000000,100000000")#include#include#include#includeusing namespace std;const int N=50010;#define ll long longint n,m,p,a[N];int ti[N],idx,par[N],son[N],sz[N],原创 2017-04-26 22:55:48 · 393 阅读 · 0 评论 -
Splay模板
POJ 3580 点击打开链接#include #include const int inf=0x3f3f3f3f;const int N=200100;using namespace std;//除了Get_pre和Get_nxt函数,其他节点都是按照下标从小到大排列的struct node{ node *ch[2],*fa; int sz,val,mn,add原创 2016-12-15 17:13:50 · 614 阅读 · 0 评论 -
bitset模板
const int M=3200;//M=N/32struct Bitset{ unsigned v[M]; void Reset() {for(int i=0;i<M;i++) v[i]=0;}//整体置0 void Set() {for(int i=0;i<M;i++) v[i]=-1;}//整体置1 unsigned Test(int x) {return原创 2017-08-17 09:02:46 · 247 阅读 · 0 评论 -
线段树扫描线模板
#include //hdu1542 求平面矩形面积交#include #include #define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int N=1222;using namespace std;int n,cnt;struct node{ double l,r,h; int f; node(原创 2016-11-28 16:43:53 · 346 阅读 · 0 评论 -
SA后缀数组模板
下标都是从1开始的计数排序const int N=100010;#define MS(x,y) memset(x,y,sizeof(x))int sa[N],rnk[N],height[N],tax[N],tp[N],n,m,k;char str[N];void rsort(){ for(int i=0;i<=m;i++) tax[i]=0; for(int i=原创 2016-12-16 20:12:00 · 384 阅读 · 0 评论 -
KMP算法&拓展KMP算法模板
KMPchar a[N],b[N];int nxt[N]; int n,m; void Cal_nxt() { int i; nxt[0]=-1; for(i=1;i<m;i++) { int j=nxt[i-1]; while(j>=0&&b[i]!=b[j+1]) j=nxt[j];原创 2016-08-26 16:34:45 · 555 阅读 · 0 评论 -
CodeForces 126B Password 【kmp】
题目:B. Passwordtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputAsterix, Obelix and their temporary buddies Suffix and Prefix has finally fou原创 2016-10-14 13:13:36 · 262 阅读 · 0 评论 -
CodeForces 734C Anton and Making Potions 【二分】【贪心】
题目:点击打开链接题意:要制作n个药,初始制作一个药的时间为x,魔力值为s,有两类咒语可以加速,一类有m种咒语,每种咒语使制作一个药的时间变成a[i],花费b[i]的魔力,二类有k种咒语,每种咒语瞬间产生c[i]个药,花费d[i]的魔力,c[i]和d[i]都是不递减的,求最短时间内产生n个药的时间。分析:总花费的时间ans=(n-c[j])*a[i],b[i]+d[j]#pragma原创 2016-11-17 22:53:18 · 293 阅读 · 0 评论 -
CodeForces 719E Sasha and Array 【线段树】【快速矩阵幂】
题目:点击打开链接题意:给出有n个元素的数列ai(1分析:容易想到用快速矩阵幂求斐波那契数列,同时用线段树储存和矩阵以及lazy矩阵,如果lazy标记为指数的话每次更新都要用一遍快速矩阵幂,就会超时。因为矩阵乘法满足分配律,且区间[l,r]加上x可以表示为乘上x次q矩阵,所以线段树维护矩阵之和,同时每次更新的时候,x可以先用快速矩阵幂,求出变换x次后的矩阵,然后在线段树中更新,即和矩阵和l原创 2016-11-17 20:22:44 · 336 阅读 · 0 评论 -
CodeForces 61E Enemy is weak 【树状数组】
题目:点击打开链接题意:给定一个数列,求出多少组满足条件的数,使得下标iaj>ak分析:很显然,这题需要用树状数组做,先离散化,定义数组s1表示当前已经加入的数,数组s2表示当前加入的数的先前的s1之和,从后往前加入每个数,因为满足题意的数一定是大于前面的某个数,所以当加入到s1时找到前面的s1之和,即为有多少比该数小的数,将个数赋值为s2的该数的值,此时统计比该数小的数的s2值之和,将该原创 2016-10-13 23:23:04 · 366 阅读 · 0 评论 -
CodeForces 474F Ant colony 【线段树】【gcd】【二分】
题目:点击打开链接题意:给定一个数列,求出区间长度减去询问区间内能被区间内所有其他的数整除的数出现的个数的值。思路:将原数列存进一个结构体,先按照数列的值从小到大排序,相同时按照数列编号从小到大排序,因为a%b==0等价为gcd(a,b)==b,所以我们可以通过线段树或者ST表预处理出所有区间内的gcd值,然后查找到对应区间内的gcd值,就是该区间内能被区间内所有其他的数整除的数,然后通过原创 2016-10-13 19:24:49 · 329 阅读 · 0 评论 -
CodeForces 501D Misha and Permutations Summation 【树状数组】
题目:点击打开链接题意:给出长度n的两个数列,求字典序编号为这两个数列的字典序编号之和模n!的数列思路:观察数列,可以发现原创 2016-10-13 18:44:14 · 295 阅读 · 0 评论 -
CodeForces 356A Knight Tournament 【线段树】
题目:点击打开链接题意:n个人m次战斗,每次战斗区间[l,r]中未战斗失败的人战斗,输入胜者x,其余败者淘汰,答案输出每个人的被哪个人击败的,最终胜者输出0思路:线段树做,将区间以x为界拆成两个部分,分别更新,更新时若改区间都为战败,则标记该节点,改节点的值为x,直到更新到叶子节点,若遇到已经更新的节点则直接返回,最后递归输出就好了。代码:#include #include #原创 2016-10-12 22:58:52 · 281 阅读 · 1 评论 -
CodeForces 617E XOR and Favorite Number 【莫队】
题目:点击打开链接题意:给定一个数列,求询问区间内任意区间段的连续异或值等于k的个数。思路:对于异或运算,al,a(l+1)...ar的异或值等于a1,a2...a(l-1)的异或值异或上a1,a2...ar的值,故我们可以直接保存前缀异或和,用莫队算法,cnt数组表示在区间内出现的个数,由于x^k==y,x^y==k,则插入一个数时,答案加上该数异或k的cnt值,该数的cnt值加一,删除原创 2016-10-12 22:26:38 · 409 阅读 · 0 评论 -
HDU 4638 Group 【莫队】
题目:点击打开链接题意:对于给定数列,求出区间内重新排序后连续数字段的个数思路:离线,若已知某个区间内的答案,对于临近区间的答案可以用O(1)复杂度求出,所以可以用莫队算法。cnt数组记录当前区间内x出现的个数,在加入该数时,如果cnt[x-1]和cnt[x+1]都为1,则区间合并答案减一,如果cnt[x-1]和cnt[x+1]都为0,则区间增加答案加一,删除该数时,如果cnt[x-1]和原创 2016-10-12 22:03:09 · 225 阅读 · 0 评论 -
CodeForces 551E GukiZ and GukiZiana 【分块】
题目:点击打开链接题意:对于给定数列,操作一是把[l,r]区间内的数加x,操作二是求出一个值,该值为数x出现的最右位置减最左位置,若不存在x输出为-1。思路:对于这种迷之询问,用分块大法。将n个数分成sqrt(n)块,初始化将a数组赋值给d数组,将d数组分块从小到大排序,新建一个数组p储存每一块所加的和,更新时,如果l,r都在同一块,暴力更新a并再排序d,若不在同一块,对于l所在块,暴力找原创 2016-10-12 21:49:56 · 352 阅读 · 0 评论 -
HDU 5919 Sequence II 【主席树】
题目:点击打开链接题意:给出一个数列,记录给定询问区间内每一个数第一次出现位置,求出中位数,强制在线。思路:由于求的是区间内第一次出现的数的位置,所以类似于求出区间内有几种不同的数,显然可以用主席树做,若数列的区间的某个点是一个数第一个出现的位置,则在主席树该位置权值为一,反之为零,由于是求出第一次出现的位置,所以我们可以把数列反转,更新时,如果更新的数未出现过,则直接新建一棵树,根据前一原创 2016-10-12 21:17:17 · 371 阅读 · 0 评论 -
莫队算法模板
题目链接:http://codeforces.com/contest/617/problem/E#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #define PR pai原创 2016-09-25 19:40:37 · 227 阅读 · 0 评论 -
HDU 3642 Get The Treasury 【线段树】【扫描线】
题目:点击打开链接题意:求空间内至少三个长方体重叠相交的体积分析:我们可以先把所有的长方体的两点的x,y,z保存下来,因为给出的长方体坐标x,y,z,z很小,所以可以考虑离散化z,然后对于每一个z,利用扫描线计算出所有长方体的高包含z的长方体的x,y面的面积,该面积也要求至少重叠三次,然后这一段的重叠的体积就是重叠面积乘上z与下一个z的高度差。//#pragma comment(lin原创 2016-11-29 21:59:53 · 251 阅读 · 0 评论 -
AC自动机的两个模板
指针型//求目标串中出现了几个模式串#includeusing namespace std;const int N=1000010;struct trie{ trie *nxt[26]; trie *fail; int cnt; trie() { for(int i=0;i<26;i++) nxt[i]=NULL;原创 2016-09-21 20:01:49 · 271 阅读 · 0 评论