--数据结构---
a1s4z5
这个作者很懒,什么都没留下…
展开
-
Codeforces Round 761F - Dasha and Photos
给出一个n×mn\times m 的只包含小写字母的矩阵AA。有kk次独立的操作,每次把原矩阵的某个子矩阵用一个字母覆盖得到一个矩阵AxAx(称之为特殊矩阵)。定义AxAx和AyAy的距离dis(Ax,Ay)=∑1≤i≤n,1≤j≤m|Axi,j−Ayi,j|dis(Ax,Ay) = \sum\limits_{1\le i \le n ,1\le j \le m}|Ax_{i,j} - Ay_{i,原创 2017-02-03 14:00:11 · 698 阅读 · 0 评论 -
Hdu 5828 Rikka with Sequence
#include<bits/stdc++.h>using namespace std;#define LL long longstruct Info{ LL same,siz,sum; Info(LL x = 0){ same = sum = x; siz = x!=0; } void add(LL x){ sum +原创 2016-08-11 21:54:47 · 365 阅读 · 0 评论 -
Hdu 2896 病毒侵袭
依然是AC自动机模板题注意ASCII码可见字符包括空格应该都能一次敲过去?#include<bits/stdc++.h>using namespace std;const int maxn = 112345,maxLen = 130;int toid(char c){ return c; }queue<int> Q;struct ACMA{ int nex[maxn][maxLen],fa原创 2016-09-13 09:43:31 · 286 阅读 · 0 评论 -
hdu 2222 Keywords Search
学过SAM回头才看懂AC自动机我真是太弱了问模式串有多少个在给出的模式串中出现过AC自动机模板题#include<bits/stdc++.h>using namespace std;const int maxn = 1123456,maxLen = 26;int toid(char c){ return c - 'a'; }queue<int> Q;struct ACMA{ int nex原创 2016-09-12 19:49:54 · 222 阅读 · 0 评论 -
Hdu 5861 Road
考虑到每一个线段只有一次进入答案的机会和离开答案的机会用线段树求得每个线段进入答案和离开答案的机会暴力计算即可实践复杂度 O(n×log(m)+n)O(n \times log(m) + n)#include<bits/stdc++.h>using namespace std;const int maxn = 212345;int arr[maxn * 4];#define root 1,1,n原创 2016-08-19 10:41:02 · 542 阅读 · 0 评论 -
51nod 1295 XOR key
给出nn个数a1,a2...an(0≤ai≤109)a_1,a_2...a_n(0\le a_i \le 10^9),mm次询问每次询问给出一个区间[l,r][l,r]和一个整数xx,询问maxl≤i≤r{ai⊕ai}\max\limits_{l\le i \le r} \{a_i \oplus a_i\}考虑不带区间询问的如何解决我们可以将每个数按照从高位到低位插入到一个字典树中去,每次询问按照当原创 2016-08-27 21:34:53 · 586 阅读 · 0 评论 -
609E - Minimum spanning tree for each edge
给出一个带权图,对每个边求经过这条边的MST先求一遍MST自然是极好的,然后对于在MST上的边,自然就是全局MST了对于不在MST上的边,找到这个边两个端点在MST上的路径上最大权的边并去掉,然后加上询问的这条边的权就好了#include<bits/stdc++.h>using namespace std;#define LL long long const int maxn = 212345,原创 2016-08-04 20:36:38 · 401 阅读 · 0 评论 -
poj 1330 Nearest Common Ancestors
LCA 测板子的题学会了倍增#include<cstring>#include<cstdio>#include<vector>#include<algorithm>using namespace std;const int maxn = 112345,maxm = 112345,max_log = 17;const int ROOT = 1;int deep[maxn],fa[maxn]原创 2016-08-04 17:46:16 · 220 阅读 · 0 评论 -
hdu 5716 GCD
一句话题面,询问区间GCD和区间GCD等于所询问的区间GCD的区间个数数的个数1e5,数的大小1e9区间GCD满足区间加法,所以线段树搞搞就好了关于第二个询问,需要实现预处理GCD 为x的区间的个数具体的,考虑固定左端点的情况,不难发现gcd是随着区间长度的增加而递减的,形象的来说就是一些线段(不妨设为(g,length),其中g代表的是左端点固定时候右端点在这个线段中时的区间gcd,length代原创 2016-07-20 12:59:58 · 467 阅读 · 0 评论 -
bzoj1251 序列终结者
不错的伸展树入门题查询区间最大值,支持区间加一个值,区间翻转区间更新的时候像线段树一样打一个标记就好值得注意的一点是,虽然这是自底而上伸展的代码,但是该节点的祖先节点的lazy标记在zig/zag的过程中一定会”污染”到这个节点以及zig/zag的时候要保证这两个点是”干净的”其它的就很模板了,具体见代码#include<bits/stdc++.h>using namespace std;stru原创 2016-07-07 12:42:09 · 373 阅读 · 0 评论 -
hdu 1698 Just a Hook
hdu 1698 Just a Hook一个简单的线段树支持把某个区间内的点都改为z,求所有操作之后的区间和#include<bits/stdc++.h>using namespace std;const int maxn = 112345;int arr[maxn * 4];int lazy[maxn * 4];#define root 1,1,n#define lson o<<1,l,m原创 2016-05-03 15:37:18 · 262 阅读 · 0 评论 -
Hdu 1666 敌兵布阵
Hdu 1666 敌兵布阵单点更新,区间查询的线段树裸题强行拿来测了一下伸展树的板子#include<bits/stdc++.h>using namespace std;struct Info{ int mer; int size; Info(int m = 0){ mer = m; size = 1; }};Info operat原创 2016-07-06 11:16:45 · 344 阅读 · 0 评论 -
Bzoj 1500 维护数列
区间信息用lazy封装还是很劲的具体见代码嗯#include<bits/stdc++.h>using namespace std;struct Info{ int size; int lmax,rmax,sum,value; Info(int val = 0){ size = 1; lmax = rmax = sum = value = va原创 2016-07-12 16:36:47 · 328 阅读 · 0 评论 -
SPOJ NSUBSTR
给出一个长25×10425 \times 10 ^ 4 的字符串,定义f(x)f(x)为所有的长xx的子串中出现次数最多的那个的出现次数,求f(1),f(2)...f(strlen)f(1),f(2)...f(strlen)首先对输入的字符串建立SAMSAM然后对于每一个节点所对应的[min,max][min,max]这个区间,用rightright去更新这个区间的maxmax,这样最后的结果就是需原创 2016-09-06 09:42:41 · 303 阅读 · 0 评论 -
QsAmQ
SAM aab->aabb->aabbb原创 2016-08-26 20:00:23 · 427 阅读 · 0 评论 -
bzoj 3238 差异
给出一个长n的字符集为小写字母的字符串,求∑1≤i<j≤nlen(Suffixi)+len(Suffixj)−2×len(lcp(Suffixi,Suffixj))\sum \limits _{1 \le i < j \le n} len(Suffix_i) + len(Suffix_j) - 2 \times len(lcp(Suffix_i,Suffix_j)) SuffixxSuffix_x原创 2016-09-07 19:35:41 · 472 阅读 · 0 评论 -
Hdu 5967 小R与手机
LCT模板题如果某一次加边会成环,我们可以保证这个点一定是某一个根,在根上记录一下后继每一次切断某条边的之后同时查询根的是否有后继,后继是否可以连接具体见代码#include<bits/stdc++.h>using namespace std;const int maxn = 212345;struct Node{ int fa,son[2]; int vedg; void原创 2016-12-04 11:06:22 · 994 阅读 · 0 评论 -
Bzoj 4184 shallot
如果只有插入的话,直接维护线性基就好了但是现在有了删除,我们按时间分治,将操作建立成一个线段树。每一个数都有一个存活的区间,我们在线段树上更新这个区间。然后dfs线段树。线段树上每个节点维护的是到当这个节点的线性基。然后就可以免去删除操作了具体见代码#include<vector>#include<map>#include<stack>#include<cstdio>#include<cst原创 2016-11-24 10:35:13 · 506 阅读 · 0 评论 -
Bzoj 2049 Cave 洞穴勘测
加边删边维护联通性因为保证中间过程都是一个树,所以可以LCT来做其实也可以按时间分治维护一个可撤销并查集我写的是后者具体见代码#include<bits/stdc++.h>using namespace std;const int maxn = 3123;int arr[maxn];int fnd(int x){ return x == arr[x] ? x : arr[x] = fn原创 2016-12-06 17:10:25 · 552 阅读 · 1 评论 -
Bzoj 2002 弹飞绵羊
学会LCT很久了,今天才会写LCT因为我使用数组而不是指针来保存节点,干脆利用起了根节点的fa这个空间来保存虚边具体的,如果fa为正数,则为splay中的边。如果是0,没有父节点。如果是负数,取反之后表示虚边所指向的父亲。具体见代码#include<bits/stdc++.h>using namespace std;const int maxn = 212345;struct Node{原创 2016-12-02 16:36:19 · 481 阅读 · 0 评论 -
Hdu 5732 Subway
给你两个同构的树,找出他们节点间的对应方式树哈希本质上就是一个树dp。考虑以树的唯一的一个节点(比如重心,直径中点)作为树根,然后用一个和子树顺序无关的方式去哈希就好了。具体见代码#include<bits/stdc++.h>using namespace std;const int maxn = 112345;#define LL long long #define Deagconst i原创 2016-11-14 22:12:19 · 345 阅读 · 0 评论 -
CodeForces Round 718D - Andrew and Chemistry
给出一个每个节点的度小于4的树,问有多少种增加叶子的方式(保持每个节点的度小于4)。增加之后的树同构的算一种第二个树哈希#include<bits/stdc++.h>using namespace std;#define LL long long const int maxn = 112345;vector<int> edge[maxn];int dep[maxn],fa[maxn];void原创 2016-11-16 11:33:43 · 556 阅读 · 0 评论 -
Codeforces 347D - Lucky Common Subsequence
给出两个长100100的字符串aa,bb。再额外给出一个长100100的字符串 virusvirus。询问aa和bb最长的没有字串是virusvirus的公共子序列。输出这个子序列。在经典的LCSLCS的dpdp解法上再加一维,记录当前的最长公共子序列匹配virusvirus的长度。第三维转移可以用KMPKMP或者ACAC自动机。#include<bits/stdc++.h>using names原创 2016-10-31 13:39:36 · 490 阅读 · 0 评论 -
计蒜客 青云的机房组网方案
题面: 有一棵点数10510^5的树,每个节点有一个权值,权值范围是[1,105][1,10^5]的,问所有两个权值互质的节点之间距离的和题解关于虚树,记下一些key point以后要是忘了可以回来看看虚树是保留原树的所选定的一些节点,保留这些选定节点两两的LCALCA,按照这些保留点在原树中的关系所建的一个新树。可以保证如果选定节点是kk个,那么虚树的节点不会超过2×k2 \times k。原创 2016-10-03 13:47:12 · 609 阅读 · 2 评论 -
hihocoder 1387 A Research on The Hundred Family Surnames
题解网址以下为搬运 题意: 给一棵树,每个节点上有个颜色,很多询问,询问两种颜色,问从这两种颜色中各取一个节点,距离最大是多少。 题解:处理出每种颜色的节点们的直径(也就是距离最大的点对)。然后对于两种询问颜色(a,b)(a,b)的直径(au,av)(au,av)和(bu,bv)(bu,bv),答案就是max{dis(au,bu),dis(au,bv),dis(av,bu),dis(a原创 2016-09-30 17:26:50 · 523 阅读 · 0 评论 -
Hdu 2243 考研路茫茫——单词情结
求长度小于n(1≤n<231)n(1 \le n < 2^{31})的串中包含至少一个模式串的个数。模式串总长度不超过25。市面上的题解几乎都是反着考虑。但是其实正着考虑也是可以的。我们在AC自动机的状态上额外添加一个状态AcpAcp,也就是接受态。对于两个状态St→cxSt \xrightarrow c x如果xx是某一个模式串的结尾,那么重定向St→cAcpSt \xrightarrow c A原创 2016-10-11 17:35:36 · 448 阅读 · 0 评论 -
Bzoj 3530 数数
求[1,n](n≤101000)[1,n](n\le 10^{1000})中不包含给定数字作为字串的数字个数(mod109+7)\pmod{10^9+7},给定数字总长度≤1500\le 1500。一眼看过去是一个用AC自动机表示状态,用数位dp的模板题注意前导零是不会被统计到的具体见代码#include<bits/stdc++.h>using namespace std;const int ma原创 2016-10-11 16:54:04 · 299 阅读 · 0 评论 -
UVA 1728 Toll Management IV
一个n(n≤104)n(n \le 10^4)个点m(m≤105)m (m \le 10^5)条带权(0≤Ci≤1000)(0 \le C_i \le 1000)边的无向图,给出原图的一个最小生成树(输入的前n−1n-1条边)对于第ii条边,定义AiA_i和BiB_i为在不改变最小生成树形态下增加和减少的最大的值求 ∑i=1mAi×i+Bi×i×i\sum\limits_{i=1}^m A_i \t原创 2016-09-23 15:08:04 · 477 阅读 · 0 评论 -
Astar Round2A 1003 Snacks
将树按照dfs序映射到区间上,每个点的值代表这个点到根的路径上的点权和因为子树的dfs序连续,所以查询其实就是查询区间最大值更新的话就是给区间加一个数(因为更新了x的点权的时候会对它的子树中的所有点有影响这一些都可以用线段树维护具体见代码#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<qu原创 2016-05-22 20:51:56 · 246 阅读 · 0 评论 -
hdu 5238 Calculator
某线段树打模拟赛的时候不知道区间该维护什么东西使其变得可合并,然后就放着了赛后看了题解才知道这个题维护的是映射关系,感觉也是十分的厉害考虑一个算式a+4(mod7)=ba + 4 \pmod{7} = b我们发现来(mod7)\pmod{7}的同余系中,会有以下对应关系其实这就是一个映射具体的,保存这个映射可以直接开一个数组a[7],其中a[i]=(i+4)(mod7)a[7],其中a[i] =原创 2016-05-19 20:09:54 · 390 阅读 · 0 评论 -
hdu 4288 Coder
线段树单点更新,查询总的区间下标(mod5)=3\pmod{5}=3的数的和先离散化一下然后每个区间存一下这个区间下标(mod5)=k(0≤k≤5)\pmod{5}=k(0\le k\le5)的数的和,这个区间数的个数区间合并的时候考虑左区间数的个数然后怼起来就好了,具体见代码 #include<bits/stdc++.h>using namespace std;#define LL long原创 2016-05-18 15:47:11 · 269 阅读 · 0 评论 -
Poj 2892 Tunnel Warfare
一段区间上有一段连续的房子,每次可以消灭一个房子,修复一个房子,询问某一个房子所在的区间的长度一个简单的线段树题用splay写的话也很简单的,因为能正好对应splay的一些基本操作(别人的板子是坠吼的#include#include#include#include#includeusing namespace std;const int maxn =原创 2016-03-15 19:42:02 · 273 阅读 · 0 评论 -
POJ 1703 Find them, Catch them
这个题是并查集的扩展(也就是俗称的带权并查集那么做这个题之前要先掌握并查集并查集的内容其他网站已经有很多了,而且都讲的非常好,我就不重复造轮子了我理解的带权并查集只是是在路径压缩的时候同时维护当前节点和根节点的一些关系感觉好像就这么点东西Orz先挂上一个题意好了,这个题是有两个帮派,还有一堆人,对于这一堆人中,每次有两个操作D x y表示x和y是两个不同帮派原创 2015-12-25 20:47:18 · 294 阅读 · 0 评论 -
poj 3321 Apple Tree
要是你想做这个题,你首先要知道一个基(shen)本(qi)的性质:树上的每个子树的dfs序都是连续的一个很显然的性质(知道了就不会忘了)然后就可以做这个题啦区间和用树状数组简单的维护一下就好我的代码维护的是这个子树的空节点(就是没有苹果的节点),那么有苹果的节点数目就是(子树大小)-(空节点数)(轮这个题的坑(1. 数据范围绝对不止1e5,我开到了1e6才能原创 2015-11-21 14:49:54 · 350 阅读 · 0 评论 -
Hdu 5221 Occupation
算是一个简单的树剖+线段树(不过话说回来树剖也是经常和线段树一起(这个题应该叫做线段树在树上的简单应用(Orz感觉自己的线段树(特别是区间更新这个地方)还是很不熟练(观看下文需要一些简单的线段树知识,包括但不限于线段树的定义)如果不考虑树上的部分的话,这个题要求我们维护一个区间,其中区间中的每一个点都有一个标记和一个value,刚开始的时候,标记都是false1 将原创 2015-12-01 11:40:58 · 358 阅读 · 0 评论 -
poj 1182 食物链
刚开始用0,-1,1来表示和父节点的关系,写了好久都没写出来然后用0,1,2来表示和父节点的关系,写的相对于原来的方法来说轻松了很多(0表示和父节点是同类,1表示吃父节点,2表示被父节点吃)在一个三元环上走,0表示不动,1是前进一步,2是退一步(因为模3意义下2等于-1)这样的话就不用去可以的画表去推到底是什么和什么关系,只要%3就可以给你自动处理好了写出来的时候也是感原创 2015-12-29 17:54:30 · 258 阅读 · 0 评论 -
poj 2492 A Bug's Life
这个题面真是。。污浊不堪啊(/▽\) 和上一个题几乎一眼的思路记一个我的WA点吧合并的时候如果是分属两个不同的集合的话,那么不能直接的把合并过去的根节点的权值置为1,而是要根据两个子节点的关系来判断,其它的好像没什么(注意每一组输入之间要有空行。。这也是十分的蛋疼的233333--------------------我还是代码的混割线------原创 2015-12-28 22:09:14 · 335 阅读 · 0 评论 -
spoj SPOJ 1043 Can you answer these queries I
犹记得最大子序列和有一个递归算法就是对于每个区间,把它分为左右两个区间,并保存四个值(从左边第一个元素开始往右能达到的最大值(lmax),从右边第一个元素开始往左能达到的最大值(rmax),区间和(sum),最大子区间和(value))显然对于这个区间的最大值只有三种可能,左区间的最大和,右区间的最大和,从中间分开,左区间的rmax+右区间的lmax这样的话维护的这四个值是满足区间加法原创 2015-11-21 14:44:43 · 653 阅读 · 0 评论 -
Poj 2828 Buy Tickets
一个线段树加点思维的题目被窝用splay水过去了Orz(其实我也不想的,只是正好刚学splay,就看到一个动态插入的题,就。。。就没忍住Orz用splay写就不用什么思维了,我的思路是给这个队列加上一个虚拟的最后一人来处理刚开始一个人都没有的时候插入的情况这样写还可以在之后插入的时候无脑插在左边,不用担心没有右边的节点的情况,大概就酱以及代码如下#i原创 2015-11-19 14:55:56 · 284 阅读 · 0 评论 -
HDU 3487 Play with Chain
人生第一个splay题。区间分裂,区间合并还有区间翻转都是比较裸的板子一个区间分裂成三个区间还是写一个两两分裂的函数比较好写(区间合并也是感觉其他也没有什么要针对这个题说的只要splay写好了就能过以及代码如下#includeusing namespace std;#define l ch[0]#define r ch[1]struct no原创 2015-10-29 22:27:02 · 426 阅读 · 0 评论