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; }