LOJ10121 與眾不同

2022-08-13 22:48:16 字數 990 閱讀 3913

題目藍鏈

首先要預處理出每乙個位置的上乙個與當前位置的數相同的位置,然後就可以利用它求出\(pos[i]\),表示以第\(i\)個數為結尾的最長完美序列的起始位置。然後就可以求出每乙個位置往前最多可以選多少個數,我們用rmq來維護一下這個東西

詢問的時候,由於\(pos\)單調不降,直接在\([l, r]\)中二分一下找到最靠前的乙個位置使得\(pos[mid] > l\),因為要保證選的數要在\([l, r]\)的範圍內。所以\(ans = max(mid - l, max(mid, r))\),\(max(l, r)\)表示rmq維護的最大值

#include using namespace std;

#define squ(x) ((ll)(x) * (x))

#define debug(...) fprintf(stderr, __va_args__)

typedef long long ll;

typedef pairpii;

inline int read()

const int maxn = 2e5 + 10;

const int maxm = 2e6 + 10;

int n, m;

int lst[maxm], pos[maxn], f[maxn], max[maxn][18], pow[18], log[maxn];

int find(int l, int r)

return r + 1;

}int query(int l, int r)

int main()

for (int i = 1; i <= n; i++)

} while (m--)

return 0;

}

這道題是真的坑 其實是我坑...

這道題我不得不承認,還是有一點難度的

rmq一定要經常打一下,要不然會有很多細節寫錯

\(debug\):打錯的地方已在**中\(mark\)

LOJ 10121 與眾不同 RMQ 二分

題目大意 給你乙個整數序列,定義乙個合法子串為子串內所有數互不相同,會有很多詢問,求區間 l,r 內最長連續合法子串長度 一道思維不錯的 rmq 題,noip要是考這種題可能會考掛一片 預處理出 f 陣列表示以i結尾的最長子串的起始位置,需要乙個輔助 last 陣列,表示某個數上一次出現的位置 那麼...

與眾不同 LibreOJ 10121

題目描述 a 是某公司的 ceo,每個月都會有員工把公司的盈利資料送給 a,a 是個與眾不同的怪人,a 不注重盈利還是虧本,而是喜歡研究 完美序列 一段連續的序列滿足序列中的數互不相同。a 想知道區間 l,r l,r 之間最長的完美序列長度。輸入格式 第一行兩個整數 n,m n,m,n n 表示連續...

與眾不同2

for i 1 to n do begin read a i st i max st i 1 last a i 1 q i i st i 1 last a i i end 可以發現st陣列單調不減。於是對於乙個分割點mm有兩種情況 1 mm左邊一部分st值 l 1 2 mm右邊一部分st值 l 因為...