QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#722353#9543. Good Partitionsxh_team#WA 86ms21344kbC++201.9kb2024-11-07 18:41:562024-11-07 18:41:57

Judging History

你现在查看的是最新测评结果

  • [2024-11-07 18:41:57]
  • 评测
  • 测评结果:WA
  • 用时:86ms
  • 内存:21344kb
  • [2024-11-07 18:41:56]
  • 提交

answer

#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using i64=long long;
#define int ll
const int N=2e5+10,mod=1e9+7;
ll qpow(ll a,ll b,ll p){ll res=1;for(;b;b>>=1,a=a*a%p)if(b&1)res=res*a%p;return res;}
int n,m;
int a[N];
int ans[N];
int sum[N];
struct node{
    int l,r;
    int d;
}tr[N*4];

void pushup(node &u,node l,node r){
    u.d=__gcd(l.d,r.d);
}

void pushup(int u){
    pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}

void build(int u,int l,int r){
    tr[u].l=l,tr[u].r=r;
    tr[u].d=0;
    if(l==r){
        return;
    }
    int mid=l+r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
}

void modify(int u,int x){
    if(tr[u].l==tr[u].r){
        tr[u].d=ans[tr[u].l];
        return;
    }
    int mid=tr[u].l+tr[u].r>>1;
    if(x<=mid) modify(u<<1,x);
    else modify(u<<1|1,x);
    pushup(u);
}

void solve(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i],ans[i]=0;
    build(1,1,n);
    for(int i=1;i<n;i++){
        if(a[i]>a[i+1]) ans[i]=i;
    }
    if(n==1){
        cout<<1<<"\n";
    }else{
        for(int i=1;i<=n;i++) modify(1,i);
        int w=tr[1].d;
        if(w==0) w=n;
        cout<<sum[tr[1].d]<<"\n";
    }
    for(int i=1,x,v;i<=m;i++){
        cin>>x>>v;
        a[x]=v;
        if(n==1){
            cout<<1<<"\n";
            continue;
        }
        if(x!=n&&a[x]>a[x+1]) ans[x]=x;
        else ans[x]=0;
        if(x!=1&&a[x-1]>a[x]) ans[x-1]=x-1;
        else ans[x-1]=0;
        modify(1,x);
        if(x!=1) modify(1,x-1);
        int w=tr[1].d;
        if(w==0) w=n;
        cout<<sum[w]<<"\n";
    }
}

signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    for(int i=1;i<=200000;i++){
        for(int j=i;j<=200000;j+=i){
            sum[j]++;
        }
    }
    int _=1;
    cin>>_;
    while(_--) solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 4ms
memory: 5156kb

input:

1
5 2
4 3 2 6 1
2 5
3 5

output:

1
2
3

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 4ms
memory: 5216kb

input:

1
1 1
2000000000
1 1999999999

output:

1
1

result:

ok 2 lines

Test #3:

score: -100
Wrong Answer
time: 86ms
memory: 21344kb

input:

1
200000 200000
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 ...

output:

160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42
160
42...

result:

wrong answer 2nd lines differ - expected: '200000', found: '42'