description
給乙個1到n的排列,詢問是否存在1<=p1< p2< p3< p4< p5< …< plen<=n (len>=3),
使得ap1,ap2,ap3,…aplen是乙個等差序列。
input
輸入的第一行包含乙個整數t,表示組數。
下接t組資料,每組第一行乙個整數n,每組第二行為乙個1到n的排列,數字兩兩之間用空格隔開。
n<=10000,t<=7
output
對於每組資料,如果存在乙個等差子串行,則輸出一行「y」,否則輸出一行「n」。
sample input
2 3
1 3 2
3 3 2 1
sample output
n y
hint
source
利用乙個i性質 因為是排列 所以 每個數字只會出現一次 因為要求長度》=3即可 所以我們直接求一下長度=3是否存在即可 我們一邊做一邊檢查是否左右兩邊是回文串 就是檢查數值的兩邊即可
一旦遇到不是回文串了說明肯定就可以滿足條件了 畢竟我們i只需要三個 我列舉中間的點 然後算兩邊即可 具體hash可以用樹狀陣列維護 看**即可
#include
#define ll long long
using
namespace
std;
inline
char gc()
return *s++;
}inline
int read()
while(isdigit(ch)) x=x*10+ch-'0',ch=gc();
return x*f;
}const
int n=1e5+10;
const
int g=11117;
const
int mod=1e9+7;
int n,a[n],t,p[n];
inline
int inc(int x,int v)
inline
int dec(int x,int v)
struct node
inline
void add(int x)
inline
int qs(int x)
inline
int qr(int x,int y)
}t1,t2;
int main()
t1.add(a[i]);t2.add(n-a[i]+1);
}if (flag) puts("y");else
puts("n");
}return
0;}
BZOJ2124 等差子串行
挺厲害的題 我們考慮當前加入了第i個數,為x,那麼我們可以維護一下哪個數出現過,出現過為1,沒出現為0,那麼加入x的時候我們只需要判斷以x為中心的極長子串是否是回文串即可 用乙個樹狀陣列維護兩個方向的雜湊值即可 include include include include include incl...
BZOJ 2124 等差子串行
給乙個1到n的排列,詢問是否存在 3 plen 使得ap1,ap2,ap3,aplen是乙個等差序列。輸入的第一行包含乙個整數t,表示組數。下接t組資料,每組第一行乙個整數n,每組第二行為乙個1到n的排列,數字兩兩之間用空格隔開。對於每組資料,如果存在乙個等差子串行,則輸出一行 y 否則輸出一行 n...
bzoj2124 等差子串行
傳送門 題目 給乙個1到n的排列,詢問是否存在1 p1 3 使得ap1,ap2,ap3,aplen是乙個等差序列。input 輸入的第一行包含乙個整數t,表示組數。下接t組資料,每組第一行乙個整數n,每組第二行為乙個1到n的排列,數字兩兩之間用空格隔開。n 10000,t 7 output 對於每組...