用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 到...