This commit is contained in:
Zengtudor 2024-11-16 17:01:53 +08:00
parent 11660860e7
commit ac313d36a3
4 changed files with 6084 additions and 0 deletions

81
src/P1972/P1972.cpp Normal file
View File

@ -0,0 +1,81 @@
#include <algorithm>
#include <cstdint>
#include <iostream>
#include <istream>
using ll = int64_t;
using std::cin, std::cout;
const ll maxn = 1e6+5;
ll n, kds[maxn], m, anss[maxn], viss[maxn], bits[maxn];
struct Sch{
ll l, r, pos;
}schs[maxn];
ll lb(const ll &v){
return v&(-v);
}
void tadd(ll idx, const ll &v){
while(idx<=n){
bits[idx]+=v;
idx+=lb(idx);
}
}
ll tpsch(ll idx){
ll res{};
while(idx!=0){
res+=bits[idx];
idx-=lb(idx);
}
return res;
}
#define DB(v){cout<<#v<<": "<<(v)<<'\n';};
int main(){
std::iostream::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
cin>>n;
for(ll i{1};i<=n;i++){
cin>>kds[i];
}
cin>>m;
for(ll i{1};i<=m;i++){
cin>>schs[i].l>>schs[i].r;
schs[i].pos=i;
}
std::sort(schs+1, schs+1+m, [](const Sch &a, const Sch &b)->bool{
return a.r<b.r;
});
ll nm{1};
for(ll i{1};i<=n;i++){
if((bool)viss[kds[i]]){
tadd(viss[kds[i]], -1);
viss[kds[i]]=i;
tadd(i, 1);
}else{
viss[kds[i]]=i;
tadd(i, 1);
}
if(i==schs[nm].r){
// cout<<"{ ";
// for(ll i{1}; i<=schs[nm].r; i++){
// cout<<tpsch(i)-tpsch(i-1)<<", ";
// }
// cout<<"}\n";
// DB(schs[nm].pos)
// DB(tpsch(schs[nm].l-1));
// DB(tpsch(schs[nm].r))
anss[schs[nm].pos] = tpsch(schs[nm].r) - tpsch(schs[nm].l-1);
if(nm==m)break;
nm++;
}
}
for(ll i{1};i<=m;i++){
cout<<anss[i]<<'\n';
}
}

3003
src/P1972/P1972_1.in Normal file

File diff suppressed because one or more lines are too long

3000
src/P1972/P1972_1.out Normal file

File diff suppressed because it is too large Load Diff

View File