題目藍鏈
首先要預處理出每乙個位置的上乙個與當前位置的數相同的位置,然後就可以利用它求出\(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 因為...