HDU 4288 Coder(vector + upper_bound, lower_bound)

题目链接:HDU 4288 Coder


【题目大意】


给你一个空set ,有三种操作,

add x  set中加入一个元素x  (题目保证set中之前没有x)

del x    删除元素 x  (题目保证set中一定有x)

sum  (set 中元素 为 a1 a2 a3...... an    求所有下标为i , 且  i%5==3 的 元素的和)

你要确保输入的元素在set中是有序的。


乍一看直接用set做了, 然而数据规模有 1e5,超时。


比赛的时候偶然听到有人说用vector , 才来了灵感,用lower_bound找到元素的位置再进行插入删除操作。当然网上说直接用数组暴力,线段树做也可以。


【源代码】

#include <iostream>
#include <sstream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <set>
using namespace std;
vector<int> a;
int main(){
	int n, v, pos;
	long long ans; //注意要用longlong
	 char cmd[10];
	while(scanf("%d", &n) != EOF){
		a.clear();
		while(n--){
			scanf("%s", cmd);
			if(!strcmp(cmd, "add")){
				scanf("%d", &v);
				if(a.empty())
					a.push_back(v);
				else{
					a.insert(upper_bound(a.begin(),a.end(),v),v); //找到元素应该插入的位置。
				}
			}
			else if(!strcmp(cmd, "del")){
				scanf("%d", &v);
				a.erase(lower_bound(a.begin(),a.end(),v)); //找到需要删除元素所在的位置
			}
			else{
				ans = 0;
				if(a.size() == 0){
					printf("0\n");
				}
				else{
					for(unsigned i = 0; 5*i+2 < a.size(); i++){
						ans += a[5*i+2];
					}
					printf("%lld\n",ans);
				}
				
			}
		}
	}
	return 0;
}


posted @ 2015-09-04 19:00  编程菌  阅读(235)  评论(0编辑  收藏  举报