傳送門 to luogu
首先看一眼標籤啊,字尾自動機
?懂了,詢問按照右端點排序。
再想想這個題啊,對於固定右端點,左端點在乙個區間內很有可能有規律的變換。肯定是用資料結構維護唄。
現在只看右端點的移動帶來的影響。無非就是增加了一些字尾。假設長度為 p
pp 的字尾,原本的 maxe
ndpo
s\max endpos
maxend
pos 為 x
xx ,那麼區間加 [x−
p+2,
n−p+
1]
[x-p+2,n-p+1]
[x−p+2
,n−p
+1] 即可,因為左端點屬於這個區間內的時候,原來的那個沒有被包含,而這個新的被包含了。
所以就是跳字尾樹。然而字尾樹上的點代表連續區間。也就是說,p
pp 是乙個連續區間。手玩可知,加入的是乙個梯形——左邊是等差,中間是區間加,右邊是等差。線段樹顯然可以維護。
不過,用 bit
\tt bit
bit 也挺不錯,因為只有單點查詢,維護差分陣列,詢問即為區間查詢。而此時的等差數列,就是區間修改了。
然後就通過了。雖然複雜度是錯誤的。正確的複雜度要用 lct
\tt lct
lct 維護字尾樹,一條實鏈上的點都滿足 maxe
ndpo
s\max endpos
maxend
pos 相同,可以一起改。複雜度就是 o(n
log2n
)\mathcal o(n\log^2n)
o(nlog2n
) 的。
#include
#include
#include
#include
using
namespace std;
typedef
long
long int_;
inline
intreadint()
const
int maxn =
200005
;int n;
// range of bit
namespace bit
for(
int i=r+
1; i<=n; i+
=(i&
-i))
} int_ query
(int l,
int r)
}const
int charsiz =26;
namespace sam
void
adjust
(int n)}}
struct query};
query ask[maxn]
;char xez[maxn]
;int_ ans[maxn]
;int
main()
sort
(ask+
1,ask+q+1)
;for
(int i=
1,p=
1; i<=n;
++i)
// printf("p = %d\n",p);
}for
(int i=
1; i<=q;
++i)
printf
("%lld\n"
,ans[i]);
return0;
}
洛谷 P1712 區間
在數軸上有 n個閉區間 l1,r1 l2,r2 ln,rn 現在要從中選出 m 個區間,使得這 m個區間共同包含至少乙個位置。換句話說,就是使得存在乙個 x,使得對於每乙個被選中的區間 li,ri 都有 li x ri。對於乙個合法的選取方案,它的花費為被選中的最長區間長度減去被選中的最短區間長度。...
洛谷p1603 區間dp
區間dp 在區間上進行動態規劃,求解一段區間上的最優解。主要是通過合併小區間的 最優解進而得出整個大區間上最優解的dp演算法。核心思路 思路 求解在乙個區間上的最優解,那麼把這個區間分割成乙個個小區間,求解每個小區間的最優解,再合併小區間得到大區間即可。所以可以列舉區間長度len 為每次分割成的小區...
洛谷 P2434 SDOI2005 區間
現給定n個閉區間 ai,bi 1 i n。這些區間的並可以表示為一些不相交的閉區間的並。你的任務就是在這些表示方式中找出包含最少區間的方案。你的輸出應該按照區間的公升序排列。這裡如果說兩個區間 a,b 和 c,d 是按照公升序排列的,那麼我們有a b請寫乙個程式 讀入這些區間 計算滿足給定條件的不相...