洛谷P6688 可重集

2022-06-13 14:48:10 字數 965 閱讀 1866

給出乙個長度為 \(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可重區間集的長度輸出 輸入樣例 ...