QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#745798#9543. Good PartitionsP3KOWA 226ms15364kbC++171.9kb2024-11-14 11:41:592024-11-14 11:42:00

Judging History

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

  • [2024-11-14 11:42:00]
  • 评测
  • 测评结果:WA
  • 用时:226ms
  • 内存:15364kb
  • [2024-11-14 11:41:59]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;

const int MAXN=2e5+5;

typedef long long ll;

ll n,q,a[MAXN],d[MAXN];
int prime[MAXN],num[MAXN],v[MAXN],cnt;

void getfac(int x){
	num[0]=x,num[1]=1;
	for(int i=2;i<=n;i++){
		if(!v[i]){
			prime[++cnt]=i,num[i]=2,v[i]=1;
		}
		for(int j=1;j<=cnt&&prime[j]*i<=n;j++){
			if(i%prime[j]==0){
				v[i*prime[j]]=v[i]+1;
				num[i*prime[j]]=num[i]/(v[i]+1)*(v[i*prime[j]]+1);
				break;
			}else{
				v[i*prime[j]]=1;
				num[i*prime[j]]=d[i]*2;
			}
		}
	}
}

ll gcd(ll x,ll y){
	return y==0?x:gcd(y,x%y);
}

struct seg{
	ll g;
}tr[MAXN*4];

void pushup(int p){
	tr[p].g=gcd(tr[p<<1].g,tr[p<<1|1].g);
}

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

void insert(int p,int l,int r,int tag,ll v){
	if(l==r){
		tr[p].g=v;
		return;
	}
	int mid=l+r>>1;
	if(tag<=mid)insert(p<<1,l,mid,tag,v);
	else insert(p<<1|1,mid+1,r,tag,v);
	pushup(p);
}

int query(int p,int s,int t,int l,int r){
	if(s>=l&&t<=r)return tr[p].g;
	int mid=s+t>>1;
	ll ans=0;
	if(l<=mid)ans=gcd(query(p<<1,s,mid,l,r),ans);
	if(r>mid)ans=gcd(query(p<<1|1,mid+1,t,l,r),ans);
	return ans;
}

void input(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=0;i<=n;i++)prime[i]=v[i]=num[i]=0;
	cnt=0;
}

void solve(){
	input();
	getfac(n);
	if(n==1){
		for(int i=0;i<=q;i++)
			cout<<1<<"\n";
		return;
	}
	for(int i=1;i<n;i++){
		if(a[i+1]<a[i])d[i]=i;
		else d[i]=0;
	}
	n--;
	build(1,1,n);
	cout<<num[query(1,1,n,1,n)]<<"\n";
	for(int i=1;i<=q;i++){
		int p,v;cin>>p>>v;
		a[p]=v;
		if(p>1){
			if(a[p]>=a[p-1])insert(1,1,n,p-1,0);
			else insert(1,1,n,p-1,p-1);
		}
		if(p<=n){
			if(a[p]<=a[p+1])insert(1,1,n,p,0);
			else insert(1,1,n,p,p);
		}
		cout<<num[query(1,1,n,1,n)]<<"\n";
	}
}

int main(){
	int t;cin>>t;
	while(t--){
		solve();	
	}
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 9752kb

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: 9816kb

input:

1
1 1
2000000000
1 1999999999

output:

1
1

result:

ok 2 lines

Test #3:

score: -100
Wrong Answer
time: 226ms
memory: 15364kb

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:

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
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
200000
0
2...

result:

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