您的位置:首页 > 其它

HDU 4288 Coder(vector + upper_bound, lower_bound)

2015-09-04 19:00 429 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: