我用的树状数组,由于这道题要开二维的,数组直接CE,所以我用了unordered_map
#include<stdio.h>
#include<unordered_map>
using namespace std;
const int szl=3e5+5;
int a[szl];
unordered_map<unsigned int,unordered_map<unsigned int,int>>bitr;//hash式无敌
int n,m;
void add(int col,int pos,int data){
for(;pos<=n;pos+=pos&-pos)bitr[pos][col]+=data;
return;
}
int ask(int col,int pos){
int sum=0;
for(;pos;pos-=pos&-pos){
sum+=bitr[pos][col];
}
return sum;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
add(a[i],i,1);
}
for(int i=1;i<=m;i++){
int op;scanf("%d",&op);
if(op==1){
int l,r,c;scanf("%d%d%d",&l,&r,&c);
printf("%d\n",ask(c,r)-ask(c,l-1));
}
else{
int x;scanf("%d",&x);
add(a[x],x,-1);
add(a[x+1],x,1);
add(a[x+1],x+1,-1);
add(a[x],x+1,1);
swap(a[x],a[x+1]);
}
}
return 0;
}
TLE 了!!! 这是提交记录
我想是不是被卡了所以换成了map
#include<stdio.h>
#include<map>
using namespace std;
const int szl=3e5+5;
int a[szl];
map<unsigned int,map<unsigned int,int>>bitr;//hash式无敌
int n,m;
void add(int col,int pos,int data){
for(;pos<=n;pos+=pos&-pos)bitr[pos][col]+=data;
return;
}
int ask(int col,int pos){
int sum=0;
for(;pos;pos-=pos&-pos){
sum+=bitr[pos][col];
}
return sum;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
add(a[i],i,1);
}
for(int i=1;i<=m;i++){
int op;scanf("%d",&op);
if(op==1){
int l,r,c;scanf("%d%d%d",&l,&r,&c);
printf("%d\n",ask(c,r)-ask(c,l-1));
}
else{
int x;scanf("%d",&x);
add(a[x],x,-1);
add(a[x+1],x,1);
add(a[x+1],x+1,-1);
add(a[x],x+1,1);
swap(a[x],a[x+1]);
}
}
return 0;
}
还是TLE 了,这是提交记录
我知道树状数组过不去,肯定会炸空间,可是为什么会TLE 呢???