hdu 4288 Coder(线段树+离散化,lower_bound&&upper_bound的运用)
来源:互联网 发布:网络贷款不还会坐牢吗 编辑:程序博客网 时间:2024/05/14 23:40
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4288
解题思路:
题目大意:
n次操作(n<=10^5),三种类型:
1.add x 向集合中添加元素x。
2.del x 从集合中删除元素x。
3.sum 询问集合中元素从小到大排列时的下标i % 5 == 3的数之和。
题目保证每个元素唯一。且元素大小不超过10^9。
算法思想:
不知道该怎么说了,按题目意思来就行了,不过,用线段树做时,要事先离散化。。。
AC代码(线段树+离散化):
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 100010;struct node{ ll mod[5];}tree[maxn<<2];int num[maxn<<2],tab[maxn],a[maxn];char op[maxn][10];void build(int id,int l,int r){ num[id] = 0; for(int i = 0; i < 5; i++) tree[id].mod[i] = 0; if(l == r) return; int mid = (l+r)>>1; build(id<<1,l,mid); build(id<<1|1,mid+1,r);}void pushup(int id){ num[id] = num[id<<1]+num[id<<1|1]; for(int i = 0; i < 5; i++) tree[id].mod[i] = tree[id<<1].mod[i]; int lx = num[id<<1]; for(int i = 0; i < 5; i++) tree[id].mod[(i+lx)%5] += tree[id<<1|1].mod[i];}void update(int id,int l,int r,int p,int val){ if(l == r){ num[id] = val; tree[id].mod[1] = val*tab[l]; return; } int mid = (l+r)>>1; if(p <= mid) update(id<<1,l,mid,p,val); else update(id<<1|1,mid+1,r,p,val); pushup(id);}int bin(int l,int r,int key){ while(l <= r){ int mid = (l+r)>>1; if(tab[mid] == key) return mid; else if(tab[mid] > key) r = mid-1; else l = mid+1; }}int main(){ int n,cnt; while(~scanf("%d",&n)){ cnt = 0; for(int i = 0; i < n; i++){ scanf("%s",op[i]); if(op[i][0] != 's'){ scanf("%d",&a[i]); if(op[i][0] == 'a') tab[++cnt] = a[i]; } } sort(tab+1,tab+cnt+1); int k = 1; for(int i = 2; i <= cnt; i++) if(tab[i] != tab[k]) tab[++k] = tab[i]; build(1,1,k); for(int i = 0; i < n; i++){ if(op[i][0] == 'a'){ int pos = bin(1,k,a[i]); update(1,1,k,pos,1); } else if(op[i][0] == 'd'){ int pos = bin(1,k,a[i]); update(1,1,k,pos,0); } else printf("%lld\n",tree[1].mod[3]); } } return 0;}
AC代码(lower_bound&&upper_bound的运用):
#include <iostream>#include <cstdio>#include <vector>#include <algorithm>using namespace std;typedef long long ll;vector<int> v;vector<int>::iterator it;int main(){ int n,x; while(~scanf("%d",&n)){ v.clear(); char op[10]; while(n--){ scanf("%s",op); if(op[0] == 'a'){ scanf("%d",&x); it = upper_bound(v.begin(),v.end(),x); v.insert(it,x); } else if(op[0] == 'd'){ scanf("%d",&x); it = lower_bound(v.begin(),v.end(),x); v.erase(it); } else{ ll sum = 0; for(int i = 2; i < v.size(); i += 5) sum += v[i]; printf("%lld\n",sum); } } } return 0;}
0 0
- hdu 4288 Coder(线段树+离散化,lower_bound&&upper_bound的运用)
- hdu 4288(lower_bound&&upper_bound的运用)
- HDU 4288 Coder(模拟) 附:upper_bound与lower_bound的比较
- HDU 4288 Coder(vector + upper_bound, lower_bound)
- HDU 4288 Coder 离散化+线段树
- HDU 4828 Coder(线段树 + 离散化)
- HDU 4288 Coder 【线段树+离线处理+离散化】
- hdu4288 Coder(线段树+离散化)
- 二分lower_bound()与upper_bound()的运用
- HDU4288-Coder(线段树+离线+离散化)
- hdu 4288 Coder (线段树)
- hdu 4288 Coder(线段树)
- hdu 4288 Coder (线段树)
- HDU 4288 Coder (线段树)
- HDU 4288 Coder(线段树)
- hdu 4288 线段树+离散化
- HDU 4288 Coder(线段树+离线处理)
- hdu 4288(线段树) Coder
- Android系统自带样式(android:theme)
- MySQL学习----MySQL 连接和联合----15MySQL 交叉连接、内连接和外连接
- 1037. 在霍格沃茨找零钱(20)
- touch指令解读
- javascript面试题之浮点数精度问题
- hdu 4288 Coder(线段树+离散化,lower_bound&&upper_bound的运用)
- Android界面美化 -- 使用自定义Toast布局替代原生布局
- 开播第一篇先给这个经典案例
- MySQL学习----MySQL 连接和联合----16MySQL 自连接和联合
- log4j使用教程
- SVN安装---本机安装(1)
- Android组件——ContentProvider
- iOS开发脚踏实地学习day04-超级猜图
- Permutation Sequence