hdu4288 Coder
Coder
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2226 Accepted Submission(s): 907
1
You are now the signle coder, and have been assigned a new task writing code, since your boss would like to replace many other employees (and you when you become redundant once your task is complete).
Your code should be able to complete a task to replace these employees who do nothing all day but eating: make the digest sum.
By saying “digest sum” we study some properties of data. For the sake of simplicity, our data is a set of integers. Your code should give response to following operations:
1. add x – add the element x to the set;
2. del x – remove the element x from the set;
3. sum – find the digest sum of the set. The digest sum should be understood by
where the set S is written as {a
1, a
2, ... , a
k} satisfying a
1 < a
2 < a
3 < ... < a
k
Can you complete this task (and be then fired)?
------------------------------------------------------------------------------
1 See http://uncyclopedia.wikia.com/wiki/Algorithm
In each test case, the first line contains one integer N ( 1 <= N <= 10
5 ), the number of operations to process.
Then following is n lines, each one containing one of three operations: “add x” or “del x” or “sum”.
You may assume that 1 <= x <= 10
9.
Please see the sample for detailed format.
For any “add x” it is guaranteed that x is not currently in the set just before this operation.
For any “del x” it is guaranteed that x must currently be in the set just before this operation.
Please process until EOF (End Of File).
add 1
add 2
add 3
add 4
add 5
sum
add 6
del 3
sum
6
add 1
add 3
add 5
add 7
add 9
sum
4
5
C++ maybe run faster than G++ in this problem.
l[num].sum[i]=l[lson].sum[i]+l[rson].sum[((i-l[lson].cnt)%5+5)%5];
处理的时候,先要离线化,再用一个二分就好了!
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define lson (num<<1)
#define rson (num<<1|1)
#define N 100050
using namespace std;
struct node {
int cnt;
__int64 sum[5];
}l[N*20];
char str[N][10];int p[N],q[N],pq[N],no[N],ans;
bool cmp(int a,int b){return p[a]<p[b];}
bool cmp1(int a,int b){return a<b;}
int find(int goal)
{
int s,e,mid;
s=0,e=ans;
while(s<=e)
{
mid=(s+e)>>1;
if(no[mid]==goal)
return mid;
else if(no[mid]>goal)
e=mid;
else if(no[mid]<goal)
s=mid;
}
}
void build(int num,int s,int e)
{
l[num].cnt=0;
for(int i=0;i<5;i++)
l[num].sum[i]=0;
if(s>=e)
return;
int mid=(s+e)>>1;
build(lson,s,mid);
build(rson,mid+1,e);
}
int update(int num,int s,int e,int pos,int color,int k)
{
if(s>=e)
{
l[num].cnt=color;
l[num].sum[0]=color*k;
return 1;
}
int mid=(s+e)>>1;
if(pos<=mid)
update(lson,s,mid,pos,color,k);
else if(pos>mid)
update(rson,mid+1,e,pos,color,k);
l[num].cnt=l[lson].cnt+l[rson].cnt;
for(int i=0;i<5;i++)
{
l[num].sum[i]=l[lson].sum[i]+l[rson].sum[((i-l[lson].cnt)%5+5)%5];
}
}
int main ()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
for(ans=0,i=0;i<n;i++)
{
scanf("%s",&str[i]);
if(str[i][0]=='a')
{
scanf("%d",&p[i]);
no[ans]=p[i];
q[ans++]=i;
}
else if(str[i][0]=='d')
{
scanf("%d",&p[i]);
}
}
sort(q,q+ans,cmp);
sort(no,no+ans,cmp1);
build(1,1,ans);
for(i=0;i<ans;i++)
pq[q[i]]=i;
for(i=0;i<n;i++)
{
if(str[i][0]=='a')
{
update(1,1,ans,pq[i]+1,1,p[i]);
}
else if(str[i][0]=='d')
{
int pos=find(p[i]);
update(1,1,ans,pos+1,0,p[i]);
}
else if(str[i][0]=='s')
{
printf("%I64d\n",l[1].sum[2]);
}
}
}
return 0;
}
hdu4288 Coder的更多相关文章
- HDU4288 Coder(线段树)
注意添加到集合中的数是升序的,先将数据读入,再离散化. sum[rt][i]表示此节点的区域位置对5取模为i的数的和,删除一个数则右边的数循环左移一位,添加一个数则右边数循环右移一位,相当于循环左移4 ...
- hdu4288 Coder(段树+分离)
主题链接: huangjing 题意: 题目中给了三个操作 1:add x 就是把x插进去 2:delete x 就是把x删除 3:sum 就是求下标%5=3的元素的和. 另一个条件是插入和删除最后 ...
- hdu4288 Coder 2012成都网络赛 A题
题意:往集合里面添加删除数,集合中的数是按从小到大排列的,询问下标模5等于3的数的和. 记得当时这题不会做, 现在想简单多了,只要维护五个值和左右子树的size大小就行了. #define maxn ...
- hdu4288 Coder(线段树单点更新)
题意:支持增删,查操作,最后的序列式递增的. 做法:主要是如何维护mod5的sum值,这里左儿子可以不用管,关键是右儿子的处理,可以假设右儿子有t个节点,左儿子有cnt个节点, 则令(t+cnt)MO ...
- 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)
转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...
- HDU4288:Coder(线段树单点更新版 && 暴力版)
Problem Description In mathematics and computer science, an algorithm describes a set of procedures ...
- 面向组合子设计Coder
面向组合子 面向组合子(Combanitor-Oriented),是最近帮我打开新世界大门的一种pattern.缘起haskell,又见monad与ParseC,终于ajoo前辈的几篇文章. 自去年9 ...
- Top Coder算法题目浏览器
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/top-code-offline-browser/ 关于 左耳朵耗子 ...
- 高效coder,筹备开源框架toutou.escort.js
背景:JavaScript在工作中运用的非常广泛,作为一门弱类型语言,在使用JavaScript的时候,很多事情需要coder manual的去完成,这无疑增加了coder的工作量. 扩展:在这样的背 ...
随机推荐
- 离线使用nuget
先新建一个项目,将所有想保存下来或者要升级的package先安装或升级. 然后在项目中将packages文件夹全部拷贝出来,专门放到一个目录备用,以后的项目就可以根据此packages文件夹来离线使用 ...
- Cacti完全使用手册 ( 让你快速个性化使用Cacti )
I.总览 Cacti 和Nagios的监控体系可以说是使用广泛而且支持丰富的国内外的运维人员都需要掌握的一套监 ...
- [问题解决]LaTex 进行中文文档操作
第一步,在\documentclass后输入 \usepackage{fontspec, xunicode, xltxtra} \usepackage{xeCJK}%中文字体 \setCJKmainf ...
- 重新关联bat文件的打开方式为系统默认方式
为什么“BAT”扩展名的默认打开方式:显示出来的居然是“%1”这么一个怪异的东东,具体在什么位置的? c:\windowssystem32\command.com修复bat关联,打开command.c ...
- Android仿微信界面--使用Fragment实现(慕课网笔记)
1 效果图 这里我们没有实现滑动切换view的功能 2 具体实现: 2.1 布局文件:top.xml, bottom.xml,tab01.xml,tab02.xml,tab03.xml,tab04. ...
- 传智播客C/C++学员荣膺微软&Cocos 2d-x黑客松最佳创新奖
6月30日,历时32小时的微软开放技术Cocos 2d-x 编程黑客松在北京望京微软大厦成功落下帷幕,这是微软开放技术首次联合Cocos 2d-x 在中国举办黑客松.此次活动共有包括传智播客C/ ...
- Hoeffding连接到机器学习
统计学场景: 一个罐子中有红球和绿球,红球比例$v$未知,数量未知,如何得到红球比例?方法---随机抽样N个球,在其中红球占比为$u$ 由hoeffding可以知道:$P(|u-v|>\epsi ...
- Android UI ActionBar功能-自定义 Action Bar 样式
ActionBar的样式官方提供了三种: Theme.Holo Theme.Holo.Light Theme.Holo.Light.DarkActionBar 但不仅仅是这三种,我们还可以自己定义Ac ...
- OC中ARC forbids explicit message send of release错误(转)
ARC forbids explicit message send of'release' 很显然,是ARC的问题. 错误原因:在创建工程的时候点选了“Use Automatic Reference ...
- Gunner II(二分,map,数字转化)
Gunner II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...