給出乙個長度為 \(n\) 的非負整數序列 \(a_1,a_2,a_3,\ldots, a_n\),給出 \(q\) 次操作,每次先給出乙個引數 \(op\):
本質相同的定義:令區間長度為 \(\text\) ,序列 \(p_\dots p_}\) 為 \(a_\dots a_\) 公升序排序後的結果,序列 \(q_\dots q_\text\) 為 \(a_\dots a_\) 公升序排序後的結果,存在乙個整數 \(k\) 使得滿足 \(\forall i,p_i+k=q_i\)。
顯然這個 \(k\) 只有可能是 \(\frac_a[i]-\sum^_a[i]}\)。
考慮給每乙個數字乙個特徵值 \(f(x)\),這樣我們就只需要判斷 \(\sum^_f(a[i]+k)\) 是否等於 \(\sum^_f(a[i])\) 即可。
發現這個特徵值需要通過若干個已知的數的特徵值,得到這中間所有數加上乙個整數後的特徵值。
所以我們取 \(f(x)=b^x\),其中 \(b\) 最好是質數。這樣的話,如果需要求全部加上 \(k\) 的特徵值,就只需要再乘 \(b^k\) 即可。
注意這道題卡自然溢位。
時間複雜度 \(o(m\log n)\)。
#include using namespace std;
typedef long long ll;
const int n=1000010;
const ll base1=5801519,prm1=35807437,base2=13331,prm2=999999491;
int n,m,a[n];
struct bit
ll query(int x)
}bit1,bit2,bit3;
ll fpow(ll x,ll k,ll p)
int main()
while (m--)
else
}return 0;
}
LuoguP6688 可重集 線段樹 hash
線段樹加 hash 判重模板題.hash 的話必須要用雙 base 雜湊,否則會 wa.然後這道題中最好不要用自然溢位,感覺比取模還要慢一些.由於讀入量巨大,必須要開讀入優化才能過.雜湊的方式就是對於每個數維護 sum base 由於值域不大,提前預處理出來 base 的 num 次方即可.code...
洛谷P3357 最長k可重線段集問題 費用流
給定平面 x o yx o y 上 nn 個開線段組成的集合 ii 和乙個正整數 kk 試設計乙個演算法,從開線段集合 ii 中選取出開線段集合 s subseteq is i 使得在 xx 軸上的任何一點 pp ss 中與直線 x px p 相交的開線段個數不超過 kk 且 sum limits ...
洛谷P3358 最長k可重區間集問題 費用流
對於給定的開區間集合 i 和正整數 k,計算開區間集合 i 的最長 k可重區間集的長度。輸入格式 的第 1 行有 2 個正整數 n和 k,分別表示開區間的個數和開區間的可重迭數。接下來的 n行,每行有 2 個整數,表示開區間的左右端點座標。輸出格式 將計算出的最長 k可重區間集的長度輸出 輸入樣例 ...