????求吊,悬赏4关注
查看原帖
????求吊,悬赏4关注
516831
Leo_LeLe楼主2023/7/18 16:49

RT

#include<bits/stdc++.h>
#define mids(l,r) const auto mid = (l + r) >> 1
#define lb(x) (x&-x)
#define ls (x<<1)
#define rs (ls|1)
#define int long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define tl t[0]
#define tr t[1]
using namespace std;
const int maxn = 1e6+10,m1 = 1e9+7,m2 = 998244353,b1 = 233,b2 = 23333;
int T,n,a[maxn],pb1[maxn] = {1,b1}, pb2[maxn] = {1,b2};
struct data{
    int h1,h2;
}t[2][maxn<<2],*seg;
data merge(const data& u,const data& v,int vsiz) {
    return data{
        .h1 = u.h1 * pb1[vsiz] % m1 + v.h1,
        .h2 = u.h2 * pb2[vsiz] % m2 + v.h2 
    };
}
void pushup(int x,int rsiz) { seg[x] = merge(seg[ls],seg[rs],rsiz); }
void upd(int x,int l,int r,int p,int v) {
    if(l == r) return void(seg[x] = {v,v});
    mids(l,r);
    if(p <= mid) upd(ls,l,mid,p,v);
    else upd(rs,mid+1,r,p,v);
    pushup(x,r-mid);
}
data get(int x,int ml,int mr,int ql,int qr) {
    if(ql <= ml && mr <= qr) return seg[x];
    mids(ml,mr);
    if(ql > mid) return get(rs,mid+1,mr,ql,qr);
    if(mid >= qr) return get(ls,ml,mid,ql,qr);
    return merge(get(ls,ml,mid,ql,qr),get(rs,mid+1,mr,ql,qr),min(qr,mr)-mid);
}
void upd(int p,int v) {
    seg = tl;
    upd(1,1,n,p,v);
    seg = tr;
    upd(1,1,n,n+1-p,v);
}
bool check(int pos) {
    seg = tl;
    data hl = get(1,1,n,max(1ll,pos+pos-n),min(n,pos+pos-1));
    seg = tr;
    pos = n + 1 - pos;
    data hr = get(1,1,n,max(1ll,pos+pos-n),min(n,pos+pos-1));
    return hl.h1 == hr.h1 && hl.h2 == hr.h2;
}
void work() {
    cin>>n;
    for(int i = 1;i<=n;++i) cin>>a[i];
    for(int i = 1;i <= n;++i) {
        if(!check(a[i])) return cout<<"Y\n",void(0);
        upd(a[i],1);
        upd(a[i+1],2);
    }
    cout<<"N\n";
}
signed main() {
    for(int i = 2;i<maxn;++i) pb1[i] = pb1[i-1] * b1 % m1, pb2[i] = pb2[i-1] * b2 % m2;
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>T;
    while(T--) work(),memset(t,0,sizeof t);
}
2023/7/18 16:49
加载中...