社区讨论

申必 WA#3 Line1113 Col7 正确6输出5 求调

P14046[SDCPC 2019] BaoBao Loves Reading参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mkgz4i7u
此快照首次捕获于
2026/01/16 22:28
上个月
此快照最后确认于
2026/01/19 15:05
上个月
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int> >qr,ans;
int szsz[100005];
int vis[120005];
int n,a[120005];int K[100005],idx;
int sum;int tmp;
int now;
using pii=pair<int,int>;
bool cmp(pii a,pii b){
    if(K[a.first]==K[b.first])return a.second<b.second;
    else return K[a.first]<K[b.first];
}
void mkfk(){
    for(int i=1;i<=n;i+=tmp){
        idx++;
        for(int j=i;j<i+tmp;j++)K[j]=idx;
    }
}
void add(int x){
	if(vis[a[x]]==0)now++;
	vis[a[x]]++;
}
void del(int x){
	if(vis[a[x]]==1)now--;
	vis[a[x]]--;
}
void szadd(int x,int k){
	while(x<=n){
		szsz[x]+=k;x+=(x&-x); 
	}
}
int szask(int x){
	int tmpp=0;
	while(x){
		tmpp+=szsz[x];
		x-=(x&-x);
	}
	return tmpp;
}
int main(){
    int t;
    cin >> t;
    while(t--){
        sum=0;idx=0;
        now=0;
        cin >> n;
        for(int i=1;i<=n;i++){
            cin >> a[i];
            if(vis[a[i]]==0){
                sum++;
            }
            else {
                if(i-vis[a[i]]>=2)qr.push_back({vis[a[i]]+1,i-1});
            }
            vis[a[i]]=i;
        }
        for(int i=1;i<=n;i++)vis[i]=0;
        tmp=sqrt(n);
        mkfk();
        sort(qr.begin(),qr.end(),cmp);
        int l=1,r=0;
        for(auto tmpp:qr){
            int askl=tmpp.first,askr=tmpp.second;
            if(r<askr){
                while(r<askr){
                    r++;add(r);
                }
            }
            else {
                while(r>askr){
                    del(r);r--;
                }
            }
            if(l<askl){
                while(l<askl){
                    del(l);l++;
                }
            }
            else {
                while(l>askl){
                    l--;add(l);
                }
            }
            szadd(1,1);
			szadd(now+1,-1);
		}
        
        
        
        for(int i=1;i<=n;i++){
            K[i]=0;
            vis[i]=0;
        	int val=szask(i);val+=sum;
        	cout << val << " ";
		}
		for(int i=1;i<=n+1;i++)szsz[i]=0;
		qr.clear();
        if(t!=0)cout << endl;
    }
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...