- 树状数组专题
关于我A了第三题这一块
- @ 2025-8-24 20:44:13
提一嘴,我递交的代码是copy的向梦洋的(当时我觉得我的代码和他的没什么区别,就检验一下他是不是故意发给我错误代码的),这才是我的代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,c[514514],x,y;
int t[514514],vis[514514];
int fi[514514],ans[514514];
struct jj{
int first,second,xiab;
};
jj p[514514];
bool cmp(jj a,jj b){
int ra=a.first,rb=b.first;
int la=a.second,lb=b.second;
if(ra!=rb) return ra>rb;
return la>lb;
}
int lowbit(int x){
return x & -x;
}
void add(int x,int k){
for(int i = x; i <= n; i += lowbit(i))
t[i] +=k;
}
long long sum(int l){
long long sum = 0;
for(int i = l; i; i -= lowbit(i))
sum += t[i];
return sum;
}
int mp[514514]={0};
signed main(){
cin>>n>>m;
//return 0;
for(int i=1;i<=n;i++)cin>>c[i];
for(int i=1;i<=n;i++){
int y=c[i];
if(vis[y]) fi[i]=vis[y];
vis[y]=i;
}
for(int i=1;i<=m;i++){
cin>>x>>y;
p[i]={y,x,i};
}
sort(p+1,p+m+1,cmp);
for(int i=1;i<=n;i++) {
if(vis[c[i]]==i)
add(i,1);
}
y=n;
for(int i=1;i<=m;i++){
int y2=p[i].first,x2=p[i].second;
while(y>y2){
if(fi[y]>0)add(fi[y],1);
y--;
}
int zhi=0;
if(x2-1==0)zhi=sum(y2);
else zhi=sum(y2)-sum(x2-1);
ans[p[i].xiab]=zhi;
}
for(int i=1;i<=m;i++){
cout<<ans[i]<<endl;
}
}
感谢向梦洋让我A了第三道题!!!
3 条评论
-
彭诗皓 LV 3 @ 2025-8-25 15:07:11煎饼答案里面去!你看你的头!答案~~~答案!! 九敏…… 九敏……
-
@ 2025-8-25 8:54:01......
-
@ 2025-8-24 22:56:29(I v I).
👍 3
- 1