QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#735016#9543. Good PartitionsCCFTL 114ms10612kbC++203.0kb2024-11-11 16:41:252024-11-11 16:41:26

Judging History

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

  • [2024-11-11 16:41:26]
  • 评测
  • 测评结果:TL
  • 用时:114ms
  • 内存:10612kb
  • [2024-11-11 16:41:25]
  • 提交

answer

#include<bits/stdc++.h>
#include<numeric>
using namespace std;
typedef long long ll;
#define pii pair<int,int>
#define fs first
#define sc second
#define pb push_back
#define epb emplace_back
#define endl
#define SZ(X) (int)((X).size())
template<typename T>T mabs(T x){return x>=0?x:-x;}
const int N=1.1e6,mod=998244353;
int a[N],n;
struct trar{
	ll tree[N];
	#define lb(i) ((i)&-(i))
	void _add(int i,ll x){
		for(;i<=n;i+=lb(i))tree[i]+=x;
	}
	ll _sum(int r){
		assert(r>0);
		ll res=0;
		for(;r>0;r^=lb(r))res+=tree[r];
		return res;
	}
	ll query(int i){
		return _sum(i);
	}
	void modify(int l,int r,ll x){
		assert(l<=r);
		ll adt=x;//-query(l);
		_add(l,adt);
		_add(r+1,-adt);
	}
}L,R;
int ss[N];
void work(){
	int q;
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)scanf("%d",a+i);
	int sq=sqrt(n+1);
	map<int,int>bl;
	auto era=[&](int x){
		//cerr<<"ERA"<<x<<"#\n";
		assert(bl[x]>0);
		if(bl[x]>1)bl[x]--;
		else if(bl[x]==1)bl.erase(x);
	};
	auto getans=[&](){
		if(bl.size()<=sq){
			if(bl.size()==0)return n;
			int res=bl.begin()->fs;
			for(auto e:bl)res=gcd(res,e.fs);
			return ss[res];
		}
		else return 1;
	};
	
	int las=1;
	for(int i=2;i<=n+1;i++){
		if(a[i]<a[i-1]){
			int l=las,r=i-1;
			L.modify(l,r,l);
			R.modify(l,r,r);
			if(r<n)bl[r-l+1]++;
			las=i;
		}
	}
	cout<<getans()<<"\n";
	
	for(int i=1;i<=n;i++)
		cerr<<'('<<L.query(i)<<','<<R.query(i)<<")";cerr<<"\n";
	for(auto e:bl)
		cerr<<'('<<e.fs<<','<<e.sc<<")";cerr<<"\n";

	
	a[0]=2e9+1;
	for(int j=1;j<=q;j++){
		int i,x;
		scanf("%d%d",&i,&x);
		set<pii>tmp;
		for(int k=max(i-1,1);k<=min(i+1,n);k++)
			tmp.insert(pii(L.query(k),R.query(k)));
		for(auto e:tmp){
			if(e.sc<n)era(e.sc-e.fs+1);
		}
		//cerr<<"$";
		
		a[i]=x;
		vector<pii>temp;
		auto update=[&](int l,int r){
			//cerr<<"up#"<<l<<" "<<r<<"\n";//
			temp.pb(pii(l,r));
		};
		int l,r;
		if(a[i-1]<=x&&x<=a[i+1]){
			l=L.query(i-1),r=R.query(i+1);
			update(l,r);
		}
		else if(a[i-1]<=x){
			l=L.query(i-1),r=i;
			update(l,r);
			if(i<n){
				l=i+1,r=R.query(i+1);
				update(l,r);
			}
		}
		else if(x<=a[i+1]){
			l=i,r=R.query(i+1);
			update(l,r);
			if(i>1){
				l=L.query(i-1),r=i-1;
				update(l,r);
			}
		}
		else{
			if(i<n){
				l=i+1,r=R.query(i+1);
				update(l,r);
			}
			if(i>1){
				l=L.query(i-1),r=i-1;
				update(l,r);
			}
			update(i,i);
		}
		for(auto e:tmp)
			L.modify(e.fs,e.sc,-e.fs),R.modify(e.fs,e.sc,-e.sc);
		
		for(int i=1;i<=n;i++)
			cerr<<'('<<L.query(i)<<",_"<<R.query(i)<<")";cerr<<"\n";
		
		
		for(auto e:temp){
			l=e.fs,r=e.sc;
			L.modify(l,r,l),R.modify(l,r,r);
			if(r<n)bl[r-l+1]++;
		}
			
		cout<<getans()<<"\n";
		
		////
		for(int i=1;i<=n;i++)
			cerr<<'('<<L.query(i)<<','<<R.query(i)<<")";cerr<<"\n";
		for(auto e:bl)
			cerr<<'('<<e.fs<<';'<<e.sc<<")";cerr<<"\n";
	}
}
int main(){
	for(int i=1;i<=2e5;i++){
		for(int j=1;j*j<=i;j++){
			if(i%j==0)ss[i]+=1+(j!=i/j);
		}
	}
	int t;
	scanf("%d",&t);
	while(t--)work();
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 106ms
memory: 10612kb

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: 114ms
memory: 10608kb

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

result: