QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#733913#9543. Good PartitionsSunlight9#TL 8ms27964kbC++204.0kb2024-11-10 22:02:172024-11-10 22:02:19

Judging History

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

  • [2024-11-10 22:02:19]
  • 评测
  • 测评结果:TL
  • 用时:8ms
  • 内存:27964kb
  • [2024-11-10 22:02:17]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
const int MAXN=5e5+7;
int t;
int n,m,gcdk;
vector<int> sum[MAXN];
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;
        }
    }
    for(int i=0;i<=2e5;i++) sum[1].push_back(1);
    for(int i=1;i<=cnt;i++)
    {
        int x=prime[i];
        if(prime[i]>2e5) break;
        int sumk=1;
        sum[x].push_back(sumk);
        while(sumk<2e5)
        {
            sumk*=x;
            sum[x].push_back(sumk);
        }
    }
    return;
}
set< pair<int,int> > s[MAXN/2];
int tot=0,id[MAXN],id_num=0;
bool pd[MAXN];
int ton[MAXN];
void add(int x)
{
    int lim=sqrt(x)+5;
    int sss=x;
    for(int i=1;i<=cnt;i++)
    {
        if(prime[i]>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[++id_num]=prime[i];
        ton[prime[i]]++;
    }
    if(x!=1)
    {
            
        s[x].insert({1,sss});
        if(!ton[x]) id[++id_num]=x;
        ton[x]++;
        
    }
    return;
}
void del(int x)
{
    int lim=sqrt(x)+5;
    int sss=x;
    for(int i=1;i<=cnt;i++)
    {
        if(prime[i]>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(x!=1)
    {
        
        s[x].erase({1,sss});
        ton[x]--;
        
    }
    return;
}
int b[MAXN];
int get_ans()
{
    int res=1;
    int numk=0;
    for(int i=1;i<=id_num;i++)
    {
        int idk=id[i];
        if(s[idk].size()==0) continue;
        b[++numk]=idk;
        if(s[idk].size()==tot)
        {
            auto it=s[idk].begin();
            int lim=(*it).first;
            res*=sum[idk][lim];
        }
    }
    id_num=numk;
    for(int i=1;i<=numk;i++) id[i]=b[i];
    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];
        gcdk=1;
        for(int i=2;i<=n;i++)
        {
            if(a[i]<a[i-1])
            {
                pd[i-1]=1;
//                cerr<<i-1<<" asd"<<endl;
                add(i-1);tot++;
            }
        }
        
        int ans;
        if(tot==0) ans=n,gcdk=1;
        else ans=get_num(get_ans());
        
        cout<<ans<<"\n";
//        cerr<<ton[2]<<" as"<<tot<<" asd"<<endl;
        while(m--)
        {
            int loc,v;
            cin>>loc>>v;
            
            if(loc>1&&a[loc]<a[loc-1])
            {
                pd[loc-1]=0;
                del(loc-1);tot--;
            }
            
//            cerr<<gcdk<<"  adasdasd"<<endl;
            if(loc<n&&a[loc+1]<a[loc])
            {
                pd[loc]=0;
                del(loc);tot--;
            }
            a[loc]=v;
            if(loc>1&&a[loc]<a[loc-1])
            {
                pd[loc-1]=1;
                add(loc-1);tot++;
            }
            if(loc<n&&a[loc+1]<a[loc])
            {
                pd[loc]=1;
                add(loc);tot++;
            }
            if(tot==0) ans=n,gcdk=1;
            else ans=get_num(get_ans());
            cout<<ans<<'\n';
        }
        tot=0;gcdk=1;
        id_num=0;
        for(int i=0;i<=n;i++)
        {
            pd[i]=0;ton[i]=0;
            s[i].clear();
        }
    }
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 7ms
memory: 25952kb

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: 8ms
memory: 27964kb

input:

1
1 1
2000000000
1 1999999999

output:

1
1

result:

ok 2 lines

Test #3:

score: -100
Time Limit Exceeded

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
200000
144
200000
156
200000
136
200000
42
200000
50
200000
58
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0...

result: