STL-甘核平

不知道为什么在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;
}
发布了49 篇原创文章 · 获赞 10 · 访问量 9289

猜你喜欢

转载自blog.csdn.net/TengWan_Alunl/article/details/83785990
今日推荐