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找到元素的位置再进行插入删除操作。当然网上说直接用数组暴力,线段树做也可以。
【源代码】
【题目大意】
给你一个空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; }
相关文章推荐
- 配额的软限制和硬限制 http://blog.chinaunix.net/uid-23177306-id-2531124.html
- eclipse中tomcat正常启动后,浏览器就访问不了tomcat首页——问题解决
- HDOJ 4359 Easy Tree DP? DP
- usaco Cow Pedigrees
- 附加数据库没有日志文件ldf怎么办
- HDU 5242 Game
- linux 关闭警告音 or 错误提示音 提示 嘟嘟 or 滴滴
- vmware下启动Centos虚拟机报错虚拟无法打开磁盘
- IP地址处理模块IPy之多网络计算
- C++Primer学习笔记之变量和基本类型
- python__函数
- HDU 5241 Friends
- vijos1034 家族 (并查集处理集合)
- hihocoder1158质数相关,最大独立集
- HDU1059-Dividing-DP(多重背包)
- mysql引擎
- Android一些设计原则杂项
- Linux 硬限制和软限制 http://www.cppblog.com/API/archive/2012/03/19/168289.html
- hdu3549(又是最大流模板题)
- 剑指offer:重建二叉树