QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#733913 | #9543. Good Partitions | Sunlight9# | TL | 8ms | 27964kb | C++20 | 4.0kb | 2024-11-10 22:02:17 | 2024-11-10 22:02:19 |
Judging History
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...