社区讨论
申必 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 条回复,欢迎继续交流。
正在加载回复...