不知道为什么在map里面一边找一边删东西答案就会错呢?想不明白呀
upd:是我对迭代器的理解不正确,当关联容器中某个元素已经被删除以后,那么指向它的迭代器就已经失效了,不可以再使用,否则会引起程序未定义的行为。
AC代码
#include<bits/stdc++.h>
#define rep(i,l,r) for(register int i=(l);i<=(r);i++)
using namespace std;
inline int read(){
register int sign=0,v=0; register char c;
while(!isdigit(c=getchar())) if(c=='-') break;
if(c=='-') sign=1; else v=c-48;
while(isdigit(c=getchar())) v=v*10+c-48;
if(sign==0) return v; else return -v;
}
void myout(long long a){
if(a<0) putchar('-'),a=-a;
if(a>=10) myout(a/10);
putchar('0'+a%10);
}
int n,opt,l,r,x;
map<int,long long> mp;
map<int,long long>::iterator st,ed;
int main(){
n=read();
rep(i,1,n){
opt=read();
if(opt==1){
x=read();
mp[x]+=x;
}else{
register long long ans=0;
l=read(); r=read();
st=mp.lower_bound(l); ed=st;
while(ed!=mp.end()&&(ed->first)<=r){
ans+=ed->second;
ed++;
}
mp.erase(st,ed);
myout(ans); putchar('\n');
}
}
return 0;
}
WA代码:
#include<bits/stdc++.h>
#define rep(i,l,r) for(register int i=(l);i<=(r);i++)
using namespace std;
inline int read(){
register int sign=0,v=0; register char c;
while(!isdigit(c=getchar())) if(c=='-') break;
if(c=='-') sign=1; else v=c-48;
while(isdigit(c=getchar())) v=v*10+c-48;
if(sign==0) return v; else return -v;
}
void myout(long long a){
if(a<0) putchar('-'),a=-a;
if(a>=10) myout(a/10);
putchar('0'+a%10);
}
int n,opt,l,r,x;
map<int,long long> mp;
map<int,long long>::iterator st,ed;
int main(){
n=read();
rep(i,1,n){
opt=read();
if(opt==1){
x=read();
mp[x]+=x;
}else{
register long long ans=0;
l=read(); r=read();
st=mp.lower_bound(l); ed=st;
while(ed!=mp.end()&&(ed->first)<=r){
ans+=ed->second;
mp.erase(ed->first);
ed++;//为什么一边找一边删就会出错??
}
// mp.erase(st,ed);
myout(ans); putchar('\n');
}
}
return 0;
}