2124 等差子串行 線段樹 hash

2021-07-11 02:59:52 字數 939 閱讀 3525

用hash值表示每個數當前是否出現過,然後正反維護兩棵線段樹。如果乙個數左邊和右邊的hash值不同則代表有等差子串行(有乙個出現過有乙個還沒出現過,因為是排列一定在後面出現)。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define n 50550

#define ll unsigned long long

using

namespace

std;

int sc()

while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();

return i*f;

}ll t[n][2],bin[n];

int n,a[n],flag;

void change(int x,int l,int r,int p)

int mid=l+r>>1;

if(p<=mid)change(x<<1,l,mid,p);

else change(x<<1|1,mid+1,r,p);

t[x][0]=t[x<<1][0]*bin[r-mid]+t[x<<1|1][0];

t[x][1]=t[x<<1|1][1]*bin[mid-l+1]+t[x<<1][1];

}ll ask(int x,int l,int r,int l,int r,int d)

void solve(int x)

int main()

if(flag)puts("y");else

puts("n");

}return0;}



BZOJ 2124 等差子串行 線段樹 hash

題目傳送門 等等 這題好像在 做過 哦,codeforces 452f,原題哈 為什麼我還是不會做啊 就當是複習一遍吧,這種想法還是挺好的。p.s.wa了兩發,錯在了updata上 好像updata這個地方好容易出錯啊。附上ac include include include using names...

BZOJ2124 等差子串行 線段樹 hash

傳送門 給出乙個n的排列,問是否存在乙個長度至少為3的等差子串行 n 10000 注意到我們給出的是乙個排列,而且我們只需要找長度為3的子串行即可 那麼我們可以列舉中間項x,用01串s和t來表示x前面的數中 1,x 1 和 x 1,x x 1 是否出現,每次判斷串s和t的反串是否相等即可,如果不相等...

BZOJ 2124等差子串行 線段樹 hash

題目描述 description 給乙個 1 到 n 的排列,詢問是否存在 1 p1 3 使得 ap1,ap2,ap3,aplen 是乙個等差序列。輸入描述 input description 輸入的第一行包含乙個整數 t,表示組數。下接 t 組資料,每組第一行乙個整數 n,每組第二行為乙個 1 到...