
数据机构
QiHang_QiHang
这个作者很懒,什么都没留下…
展开
-
字典树模板
int trie[1000010][26];int num[1000010] = {0};int pos = 1;void Insert(char word[]){ int c = 0; for(int i = 0; word[i]; i++) { int n = word[i]-'a'; if(trie[c][n] ==...原创 2018-08-04 09:12:26 · 212 阅读 · 0 评论 -
HDU6319 2018多校第三场(单调队列)
题意给你n个数a[N],求每个m长区间[i,i+m-1](1<=i<=n-m+1)里面的最大值maxval[i]和更新最大值的次数cnt[i](区间从左至右严格大于maxval[i]的次数)。题解利用单调队列可以很好的求出每个区间的maxval,但如果正向跑不好得出cnt,反相跑的话发现每次队列中的值就是cnt。因为维护的是一个单调递减队列,每一次加入的值小于队尾的值就直接...原创 2018-07-31 10:54:57 · 313 阅读 · 0 评论 -
POJ2823(单调队列,二分出队列)
题意给你n个数和一个区间的长度k,求从前往后每个[i,i+k-1] (1<=i<=n-k+1)区间的最大值和最小值。题解用单调队列搞一搞,然后。。。然后就超时了,学习了一下可以二分出队列,就去弄了一下二分(其实k不大的话二分也没啥用啊)。然后。。。然后就超时了。好吧为什么G++就是会超时呢?用C++就过了。代码#include<cstdio>#i...原创 2018-07-31 17:07:30 · 532 阅读 · 0 评论 -
树状数组模板
int N, c[maxn];int lowbit(int i) { return i&(-i);}//单点更新void add(int i, int value){ while(i <= N) { c[i] += value; i += lowbit(i); }}//前缀和int sum(int i...原创 2018-08-14 17:56:56 · 216 阅读 · 0 评论 -
AC自动机模板
HDU2222求匹配串中模式串出现的个数(不重复)#include<cstdio>#include<algorithm>#include <iostream>#include <string.h>#include <vector>#include <queue>#include <math.h>原创 2018-08-07 11:08:25 · 261 阅读 · 0 评论 -
HDU6356 (ST)
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>#include <iostream>#include <queue>#include <vector>#include <map&a原创 2018-08-07 17:12:02 · 332 阅读 · 0 评论 -
HDU6333 2018多校第四场(莫队+组合数)
题意T组样例,给两个数n,m,求下式。题解先观察一手杨辉三角找找规律11 11 2 11 3 3 11 4 6 4 1可以得到f(n,m+1)=f(n,m)+C(n,m+1)f(n+1,m)=2f(n,m)-C(n,m).抽象的看由(n,m)可以得到(n-1,m)(n+1,m)(n,m-1)(n,m+1)所以可以用莫队来解决。#includ...原创 2018-08-03 15:26:38 · 576 阅读 · 1 评论 -
BZOJ2038 小Z的袜子(莫队)
题意BZOJ2038题解询问区间(L, R)选两只袜子颜色相同的概率ans = C(a,2) + C(b,2) + C(c,2) + ... / C(R-L+1, 2)找规律可得 (a^2 + b^2 + c^2 - a - b - c) / (R - L + 1)(R - L)即(a^2 + b^2 + c^2 - (R - L + 1) ) / (R - L + 1)...原创 2018-08-03 16:06:32 · 266 阅读 · 0 评论 -
HDU5919 Sequence II (主席树)
题意给出一个序列,问区间[l, r]中所有不同元素出现的第一个位置(取最左)组成的序列中的中位数。题解如果我们从后往前的话在当前位置i我们在主席树上i这个位置加1,在它之前出现的位置减1,然后我们在主席树询问区间的时候每个数都只出现一次了。查询[l, r]的时候,查询第l个版本的主席树就好,复杂度O(nlogn)。#include <iostream>#incl...原创 2018-07-22 09:41:22 · 221 阅读 · 0 评论 -
POJ2104求区间第K大(主席树)
#include <iostream>#include <stdlib.h>#include <stdio.h>#include <algorithm>#include <math.h>#include <map>#include <vector>#include <string.h&原创 2018-07-21 17:29:17 · 273 阅读 · 0 评论 -
线段树简述
线段树是一棵二叉搜索树,常用于解决区间问题。线段树每一个非叶子节点[left,right],它的左二子区间[left,(left+right)/2],右儿子区间[(left+right)/2+1,right]。线段树的结构体,内元素包括,此节点包含区间[left,right],和value //线段树结构体 #include using namesp原创 2017-12-17 19:48:04 · 397 阅读 · 0 评论 -
POJ2299 线段树求逆序数
题意:将一个无序的序列排成有序的最小步数,该算法通过交换两个相邻的序列元素来处理n个不同的整数序列,直到序列按升序排序。思路:就是求序列逆序数,我的方法用线段树求解(我的逆序数模板可能跟其他大佬有一丢丢不同可以看一下这个线段树简述)。具体:将一个序列一个一个列出来,看“排在它前面元素有多少个比他大的”。线段树节点的权值value表示区间[left,right]有多少原创 2017-12-18 20:29:05 · 359 阅读 · 0 评论 -
并查集理解
作用连通分量的查询与合并理解1.将连通分量看成一个集合,该集合包含了连通分量的所有点。连同方式无关紧要,只有属于和不属于与这个集合的区别。2.每个集合都可看成一棵树,这个集合的标志(这棵树的标志)就是这棵树的根。3.如果把节点x的父亲节点保存在pre[x]中,那么再从pre[x]找它的父亲节点pre[pre[x]],一直向上找就可以找到这棵树的根。就是这棵树的标记,当x原创 2017-11-25 15:43:57 · 318 阅读 · 0 评论 -
线段树区间更新
为什么要用到区间更新?答:当每次更新区间[a,b]时,如果只用到单点更新,更新n次复杂度为O(n*log(n)),还不知for(a,b)。如何解决?答:新方法:延迟标记(Lazy Tag) 例如对区间[a,b]进行加c操作,如果当前区间与需要修改的区间完全覆盖时,打上一个Lazy标记并停止递归,如果下一次查 询或更改此区间,将这个标记分解传递到其左右孩子。这个思想使复杂度任保持在O(lo...原创 2018-06-06 19:50:28 · 536 阅读 · 0 评论 -
POJ3468线段树区间修改模板题
题意n个数m个操作1~n的值两种操作:“Q a b ”查询区间[a,b]值的和“C c a b”区间[a,b]每个值加c输出每次查询的值代码#include <iostream>#include <stdlib.h>#include <stdio.h>#include <algorithm>#include <math.h&g...原创 2018-06-06 19:58:41 · 268 阅读 · 0 评论 -
HDU1166线段树点更新
Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。中...原创 2018-06-19 20:01:23 · 196 阅读 · 0 评论 -
HDU6278(主席树+二分)
题意区间第k大代码#include<cstdio>#include<algorithm>#include<string.h>#include <string.h>#include <math.h>#include <vector>using namespace std;typedef long l...原创 2018-07-28 17:21:45 · 320 阅读 · 0 评论 -
HDU1542线段树扫描线求矩形面积
AtlantisTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 17436 Accepted Submission(s): 7080 Problem DescriptionThere are several ancie...原创 2018-07-20 17:05:57 · 274 阅读 · 0 评论 -
HDU6315(线段树维护区间最小值和区间求和)
题意给定一个初始数组b和一个初始值全部为0的数组a,每次操作可以在给定的区间(l,r)内让a[i](l=<i<=r)加一,或者查询区间区间(l,r)中a[i]/b[i](l=<i<=r)(向下取整取整)的和。题解a[i]/b[i]向下取整,那么a[i]每次加1,a[i]加b[i]次就对总和的贡献加1。那么我们维护一个b数组最小值,每次更新区间最小值tree[rt...原创 2018-07-26 17:07:47 · 850 阅读 · 0 评论 -
HDU1255求矩形面积交(线段树+扫描线)
分情况讨论1.cnt>1 : 说明该区间被覆盖两次或以上,那么长度就可以直接计算,就是该区间的长度剩下的情况就是cnt=1或cnt=02.先看叶子节点,因为是叶子没有孩子了,所以被覆盖两次货以上的长度就是0(无论cnt=1或cnt=0都是0,因为是叶子。。。)3.不是叶子节点 ,且cnt=1.注意这里,cnt=1确切的意义是什么,应该是,可以确定,这个区间被完全覆盖了1...原创 2018-07-21 16:12:30 · 275 阅读 · 0 评论 -
BZOJ2212(线段树合并)
题意TP现在有一棵二叉树,所有非叶子节点都有两个孩子。在每个叶子节点上有一个权值(有n个叶子节点,满足这些权值为1..n的一个排列)。可以任意交换每个非叶子节点的左右孩子。要求进行一系列交换,使得最终所有叶子节点的权值按照遍历序写出来,逆序对个数最少。第一行n下面每行,一个数x如果x==0,表示这个节点非叶子节点,递归地向下读入其左孩子和右孩子的信息,如果x!=0,表示这个节...原创 2018-08-24 15:08:55 · 560 阅读 · 0 评论