记录编号 |
584835 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[国家集训队 2011]等差子序列 |
最终得分 |
100 |
用户昵称 |
ムラサメ |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.702 s |
提交时间 |
2023-11-16 13:14:27 |
内存使用 |
7.84 MiB |
显示代码纯文本
- #include<bits/stdc++.h>
- #define mod 1145141919
- typedef long long ll;
- using namespace std;
- struct node{
- long long l,r,sum;
- }t[2][40010];
- long long tt,n,a[10010];
- long long ps[5][10010],md,l1,r1,l2,r2,len,ans,num1,num2;
- long long bas[10010];
- bool flag;
- void build(long long i,long long l,long long r,bool ff){
- t[ff][i].l=l;
- t[ff][i].r=r;
- t[ff][i].sum=0;
- if(l==r){
- ps[ff][l]=i;
- t[ff][i].sum=0;
- return;
- }
- long long mid=(l+r)>>1;
- build(i*2,l,mid,ff);
- build(i*2+1,mid+1,r,ff);
- }
- void find(ll i,ll l,ll r,ll ff){
- if(l<=t[ff][i].r&&r>=t[ff][i].l){
- if(l<=t[ff][i].l&&r>=t[ff][i].r){
- ans=(ans+t[ff][i].sum*bas[r-t[ff][i].r])%mod;
- return;
- }
- find(i*2,l,r,ff);
- find(i*2+1,l,r,ff);
- }
- }
- void change(ll x,ll ff){
- ll now=ps[ff][x];
- t[ff][now].sum=1;
- while(now/2!=0){
- now/=2;
- t[ff][now].sum=(t[ff][now*2].sum*bas[t[ff][now*2+1].r-t[ff][now*2+1].l+1]+t[ff][now*2+1].sum)%mod;
- }
- }
- void work(){
- memset(t,0,sizeof(t));
- memset(a,0,sizeof(a));
- memset(ps,0,sizeof(ps));
- memset(bas,0,sizeof(bas));
- bas[0]=1;
- for(int i=1;i<=300005;++i){
- bas[i]=bas[i-1]*2%mod;
- }
- cin>>n;
- flag=0;
- for(int i=1;i<=n;i++){
- cin>>a[i];
- }
- build(1,1,n,0);
- build(1,1,n,1);
- for(int i=1;i<=n;i++){
- md=a[i];
- len=min(a[i]-1,n-a[i]);
- l1=a[i]-len;
- r1=a[i]+len;
- len=2*len+1;
- ans=0;
- find(1,l1,r1,0);
- num1=ans;
- r2=n+1-l1;
- l2=n+1-r1;
- ans=0;
- find(1,l2,r2,1);num2=ans;
- if(num1!=num2){
- flag=1;
- break;
- }
- change(md,0);
- change(n-md+1,1);
- }
- if(flag){
- cout<<"Y"<<endl;
- }
- else{
- cout<<"N"<<endl;
- }
- }
- int main(){
- freopen("sequence.in","r",stdin);
- freopen("sequence.out","w",stdout);
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- int t;
- cin>>t;
- for(int i=1;i<=t;i++){
- work();
- }
- return 0;
- }