code: #include <string> #include <cstring> #include <cstdio> #include <algorithm> #define N 50003 #define lson now<<1 #define rson now<<1|1 #define inf 100000000 using namespace std; void setIO(string s) { string in=s+&…
4491: 我也不知道题目名字是什么 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 278  Solved: 154[Submit][Status][Discuss] Description 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 Input 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数量接下来Q行,每行2个整数l,r Output 对于每个询问,…
4491: 我也不知道题目名字是什么 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 317  Solved: 174[Submit][Status][Discuss] Description 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 Input 第一行n,表示A数组有多少元素 接下来一行为n个整数A[i] 接下来一个整数Q,表示询问数量 接下来Q行,每行2个整数l,r Output 对于每个…
我也不知道题目名字是什么 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 Input 第一行n,表示A数组有多少元素 接下来一行为n个整数A[i] 接下来一个整数Q,表示询问数量 接下来Q行,每行2个整数l,r Output 对于每个询问,求[l,r]内最长子串,使得该子串为不上升子串或不下降…
[BZOJ4991]我也不知道题目名字是什么(线段树) 题面 BZOJ 题解 对于线段树维护的区间维护以下东西: 区间左(右)端开始(结束)的最长(短)子串的长度 左端右端的值,以及当前区间内的答案 每次向上合并只需要分类讨论即可 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm…
bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并) bzoj Luogu 给出一个字符串 $ S $ 及 $ q $ 次询问,每次询问一个字符串 $ T $ 有多少本质不同的子串不是 $ S[l,r] $ 的子串. 题解时间 跟上一道题有点像哈. 只不过这一次是要将 $ T $ 放在 $ S $ 上匹配. 我们先不管每次选取的 $ S $ 段不同,就假设我们已经建好了选取的 $ S $ 段的SAM(也就是前68pts啦) 我们直接把 $ T $ 放上去匹…
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数量接下来Q行,每行2个整数l,r 输出 对于每个询问,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 样例输入 91 2 3 4 5 6 5 4 351 61 72 71 95 9 样例输出 66564 题解 离线扫描线+线段树 考虑询问 $[l,r]$ ,对于选出子串的左端点i,右端点…
LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\)也建SAM,计算上面所有节点的答案.记\(pos[i]\)表示\(i\)节点第一次出现的下标(同一节点代表的串出现的位置集合相同,所以随便记一个即可). 则节点\(i\)的答案为:\(\max(0,\ len[i]-\max(len[fa[i]],\ mx[pos[i]]))\). 考虑\(l,r…
题目描述 小A 被选为了ION2018 的出题人,他精心准备了一道质量十分高的题目,且已经把除了题目命名以外的工作都做好了. 由于ION 已经举办了很多届,所以在题目命名上也是有规定的,ION 命题手册规定:每年由命题委员会规定一个小写字母字符串,我们称之为那一年的命名串,要求每道题的名字必须是那一年的命名串的一个非空连续子串,且不能和前一年的任何一道题目的名字相同. 由于一些特殊的原因,小A 不知道ION2017 每道题的名字,但是他通过一些特殊手段得到了ION2017 的命名串,现在小A 有…
题目链接: [Noi2018]你的名字 题目大意:给出一个字符串$S$及$q$次询问,每次询问一个字符串$T$有多少本质不同的子串不是$S[l,r]$的子串($S[l,r]$表示$S$串的第$l$个字符到第$r$个字符组成的子串). 首先考虑$l=1,r=|S|$的情况,对$T$串建立后缀自动机,可以知道$T$串本质不同的子串个数就是后缀自动机上每个点的$len[i]-len[pre[i]]$($len[i]$代表这个点所能表示的最长串长度),这也就是后缀自动机上每个点贡献的子串个数.对于每个点…
BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已解锁的节点\(x\)(已解锁是指父节点已经处理完的点,刚开始就是\(fa[x]=0\)的\(x\)),为其子树预定\(sz[x]\)大小的位置. 把\(d_i\)从小到大排序依次枚举,每次要尽量往\(1,2,...,n\)这个序列中尽量靠后的位置填(填到\(p\)表示\(Ans_p=d_i\)).…
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 9280  Solved: 2421[Submit][Status][Discuss] Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文.   Input…
bzoj题面什么鬼啊-- 题目大意:有一个初始值均为0的数列,n次操作,每次将数列(ai,bi-1)这个区间中的数与ci取max,问n次后元素和 离散化,然后建立线段树,每次修改在区间上打max标记即可 #include<iostream> #include<cstdio> #include<map> #include<algorithm> using namespace std; const int N=100005; int n,g[N],tot,a[N…
为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50644748 然后是我根本没法跟DaD3zZ相比的拙劣的代码: #include<cstdio> #include<cstring> #include<algorithm> #define…
O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) -------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> using namespa…
3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1469  Solved: 631[Submit][Status][Discuss] Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作. 第三分钟,k说,要能查询,于是便有了求一段数的和的操作.…
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3196 题面; 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6372  Solved: 2406[Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为…
题目链接 各种zz错误..简直了 /* 19604kb 36292ms 题意:选$k$段不相交的区间,使其权值和最大. 朴素线段树:线段树上每个点维护O(k)个信息,区间合并时O(k^2),总O(mk^2logn)->GG 考虑费用流:建一条n+1个点的链(点权设在边上,故需n+1个点),链上每个点和S.T连边,相邻点连边 这样数列中的区间和每条增广路一一对应 每次最多增广k次,O(nmk)->still GG 考虑费用流这一过程的实质:每次增广相当于贪心,本质上只有两种情况: 选取一段(新增…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1828 [题目大意] 现在有一些线段[l,r]的需求需要满足,i位置最多允许a[i]条线段堆叠, 问最多能满足多少条线段的需求 [题解] 我们将所有的线段按照右端点排序,那么从头到尾考虑能不能满足需求一定能得到最优解, 因为对于相同右端点的来说,先后顺序不影响放入, 而对于右端点不同的来说,右端点靠前的先处理一定比靠后的先处理更优. 处理方式相当于线段树的区间查询和区间修改. [代码]…
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 根据题意,就是比较斜率大小 只看一段区间的话,那么这段区间能看见的楼房数量就是这段区间的单调栈的大小 那么这题就是用线段树来维护这个单调栈 len[k]表示对于区间k来说单调栈的大小是多少 那么自底向上maintain(k)的时候,len[k]=len[lson]+find(rson,max[lson]) find(k,x)就是表示以数字x进去k区间,那么能走的步数是多少 那么…
题目大意 1.将x到当前根路径上的所有点染成一种新的颜色: 2.将x到当前根路径上的所有点染成一种新的颜色,并且把这个点设为新的根: 3.查询以x为根的子树中所有点权值的平均值. 分析 原题codechef ,Gangsters of Treeland 那题没有换根操作 用神转化把问题转操作1转化成access操作 操作3转化成每个点到根上有多少条虚边 用dfn序+线段树维护 现在多了个换根操作,只是线段树上加个分类讨论而已 注意 longdouble会Wa,double就A了 姿势 1.用df…
我也不知道为什么把题看成以插入点为结尾的最长生生子序列--还WA了好几次 先把这个序列最后的样子求出来,具体就是倒着做,用线段树维护点数,最开始所有点都是1,然后线段树上二分找到当前数的位置,把这个点标为0(相当于对于这之前的序列这个点是不存在的),把每个数的位置记为p[i] 然后用另一颗线段树维护每个位置上的LIS,根据时间序,每次插入数的时候求一下以他结尾的LIS然后放进线段树上对应的p[i](因为按照数从小到大所以直接查这个数位置之前的即可),然后再取全部点的max即可 #include<…
题目大意:略 令$ION2017=S,ION2018=T$ 对$S$建$SAM$,每次都把$T$放进去跑,求出结尾是i的前缀串,能匹配上$S$的最长后缀长度为$f_{i}$ 由于$T$必须在$[l,r]$上匹配,设现在能匹配的长度为$len$,在后缀自动机的$x$点,添加一个字符$c$,则$trs[x][c]$的$right$集合中必须包含$endpos\in[l+len,r]$,这个操作可以用线段树合并实现 否则$len$就要缩短,直到$len$缩短到$dep[pre_{x}]$,$len$如…
Description Hint Solution 不妨先讨论一下无区间限制的做法. 首先"子串"可以理解为"前缀的后缀",因此我们定义一个 \(\lim(i)\),表示 \(T\) 的一个前缀 \(T[1\cdots i]\) 中,选取一个最长后缀,使得这个后缀在 \(S\) 中出现过.\(\lim(i)\) 就是这个最长后缀的长度. 其实与朴素的 SAM 求最长公共子串有点相似,这里主要是求 本质不同的公共子串的个数. 我们对 \(S\) 建 SAM,然后把 \…
正题 题目链接:https://www.luogu.com.cn/problem/P4770 题目大意 给出一个长度为\(n\)的字符串\(S\).\(q\)次询问给出一个串\(T\)和一个区间\([L,R]\),求\(T\)有多少个本质不同的子串不是\(S_{L\sim R}\)的子串. \(1\leq n\leq 5\times 10^5,1\leq Q\le 10^5,\sum|T|\leq 10^6\) 解题思路 因为给了很多\(L=1,R=n\)的部分分所以应该是提示我们先从这个方面考…
Description 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 Input 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数量接下来Q行,每行2个整数l,r Output 对于每个询问,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 Sample Input 9 1 2 3 4 5 6 5 4 3 5 1 6 1 7 2 7 1 9 5 9 Sample Output 6 6 5 6 4…
传送门 题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串. 思路: 注意要求的是子串而不是子序列!!! 然后直接用线段树维护最大子段和的方式合并一下就完了. 注意要维护当前区间最靠左/右的数是什么. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; inline int read(){ int ans=0; char ch=getchar();…
http://www.lydsy.com/JudgeOnline/problem.php?id=3626 LNOI的树链剖分题没有HAOI那么水,学到的东西还是很多的. 我如果现场写,很难想出来这种题,是时候复习一波离线算法泡脑子了.(没有暴力分的题,想不出来正解就爆零,太可怕了) 排序后离线操作通过前缀和计算答案,题解是hzwer的博客上复制的 http://hzwer.com/3891.html 直接引用清华爷gconeice的题解吧 显然,暴力求解的复杂度是无法承受的. 考虑这样的一种暴力…
http://www.lydsy.com/JudgeOnline/problem.php?id=1798 之前写了个快速乘..........................20多s...... 还好1a.. 那么本题就是维护两个tag即可.和上一题一样. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #inc…
可以很容易的写出dp方程: F[i][j]=min(F[l][j-1]+w[l][i])+c[i] (w[i][j]是从l+1到i-1这些点p里,所有满足d[p]+s[p]<d[i] && d[p]-s[p]>d[l]的点的w[p]之和) 考虑i+1,会对方程造成什么变化 w[l][i]会变得跟大了(满足d[p]+s[p]<d[i]的点更多了) 可以发现增长的是一个区间,求和也是一个区间 线段树解决 CODE: #include<cstdio> #includ…