QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#733618#9543. Good PartitionsSunlight9#WA 30ms19588kbC++203.2kb2024-11-10 20:10:012024-11-10 20:10:02

Judging History

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

  • [2024-11-10 20:10:02]
  • 评测
  • 测评结果:WA
  • 用时:30ms
  • 内存:19588kb
  • [2024-11-10 20:10:01]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
const int MAXN=5e5+7;
int t;
int n,m;
int a[MAXN];
int cnt=0,prime[MAXN];
bool vis[MAXN];
void pre()
{
    int lim=5e5;
    vis[1]=1;
    for(int i=2;i<=lim;i++)
    {
        if(!vis[i]) prime[++cnt]=i;
        for(int j=1;j<=cnt && i*prime[j]<=lim;j++)
        {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
    return;
}
set< pair<int,int> > s[MAXN/2];
int tot=0;
bool pd[MAXN];
int ton[MAXN];
set<int> id;
void add(int x)
{
    int lim=sqrt(x)+5;
    int sss=x;
    for(int i=1;i<=cnt;i++)
    {
        if(x>lim) break;
        if(x%prime[i]) continue;
        int numk=0;
        while(x%prime[i]==0) numk++,x/=prime[i];
        s[prime[i]].insert({numk,sss});
        if(!ton[prime[i]]) id.insert(prime[i]);
        ton[prime[i]]++;
    }
}
void del(int x)
{
    int lim=sqrt(x)+5;
    int sss=x;
    for(int i=1;i<=cnt;i++)
    {
        if(x>lim) break;
        if(x%prime[i]) continue;
        int numk=0;
        while(x%prime[i]==0) numk++,x/=prime[i];
        s[prime[i]].erase(s[prime[i]].find({numk,sss}));
        ton[prime[i]]--;
        if(!ton[prime[i]]) id.erase(prime[i]);
    }
}
int get_ans()
{
    int res=1;
    int numk=0;
    for(auto i : id)
    {
        int idk=i;
        if(s[idk].size()==tot)
        {
            auto it=s[idk].begin();
            int sumk=1,lim=(*it).first;
            for(int j=1;j<=lim;j++) sumk*=idk;
            res*=sumk;
        }
    }
    return res;
}
int get_num(int x)
{
    int res=0;
    for(int i=1;i*i<=x;i++)
    {
        if(x%i) continue;
        res++;
        if(i*i==x) break;
        res++;
    }
    return res;
}
int main() {
    cin.tie(nullptr) -> sync_with_stdio(false);
    
    pre();
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=2;i<=n;i++)
        {
            if(a[i]<a[i-1])
            {
                pd[i-1]=1;
                tot++;
                add(i-1);
            }
        }
        // cerr<<" asd"<<endl;
        int ans;
        if(tot==0) ans=n;
        else ans=get_num(get_ans());
        cout<<ans<<"\n";
        while(m--)
        {
            int loc,v;
            cin>>loc>>v;
            
            if(loc>1&&a[loc]<a[loc-1])
            {
                pd[loc-1]=0;
                tot--;
                del(loc-1);
            }
            if(loc<n&&a[loc+1]<a[loc])
            {
                pd[loc]=0;
                tot--;
                del(loc);
            }
            a[loc]=v;
            if(loc>1&&a[loc]<a[loc-1])
            {
                pd[loc-1]=1;
                tot++;
                add(loc-1);
            }
            if(loc<n&&a[loc+1]<a[loc])
            {
                pd[loc]=1;
                tot++;
                add(loc);
            }
            if(tot==0) ans=n;
            else ans=get_num(get_ans());
            cout<<ans<<'\n';
        }
        tot=0;
        id.clear();
        for(int i=0;i<=n;i++)
        {
            pd[i]=0;ton[i]=0;
            s[i].clear();
        }
    }
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 6ms
memory: 18156kb

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: 0ms
memory: 18052kb

input:

1
1 1
2000000000
1 1999999999

output:

1
1

result:

ok 2 lines

Test #3:

score: -100
Wrong Answer
time: 30ms
memory: 19588kb

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:

1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
200000
1
2...

result:

wrong answer 1st lines differ - expected: '160', found: '1'