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的工作量. 扩展:在这样的背 ...
随机推荐
- 关于python命令在editor里编写与在interpreter里的编写的不同之处
关于python命令在editor里编写与在interpreter里的编写的不同之处 其实用这个标题,我心里还是有点胆怯的.作为一个python入门的小白,不,编程入门的小白,我还不太确定我对edit ...
- 动态加载Layout 与 论Activity、 Window、View的关系
1)动态加载Layout的代码是 getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null)); ...
- eclipse android sdk javadoc
sdk 的函数不提示帮助信息 查了下是现在adt版本没有doc文件夹,拷贝了早期的版本docs过来 其他具体操作如下:http://blog.csdn.net/lyh7736362/article/d ...
- OS X 键盘快捷键
了解有关常见 OS X 键盘快捷键的信息.键盘快捷键是通过按下键盘上的组合键来调用 OS X 功能的一种方式. 若要使用键盘快捷键或按键组合,您可以同时按修饰键和字符键.例如,同时按下 Command ...
- Qt5.3.0 for android windows平台下搭建及demo(虫子的博客)
----我的生活,我的点点滴滴!! 部门领导突然心血来潮,想在android平台上做应用,但是我们大多产品属于嵌入式(本吊只负责写写应用,苦比的被强行顶过来搞这,由于这还得领导吵了一架,架虽然吵完了, ...
- overload的一点思考
仅参数类型不同的重载方法,使用过程的一个困惑: 有没有必要使用instanceof方法? package overload.special; public class OverLoadTest { p ...
- poj3006
Dirichlet's Theorem on ...
- Reward(拓扑结构+邻接表+队列)
Reward Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submis ...
- Apache经常使用配置
Apache採用IBM HTTPServer,内核为Apache/2.0.47 Server version: IBM_HTTP_Server/6.1.0.13 Apache/2.0.47 查 ...
- iOS开发中视图相关的小笔记:push、modal、popover、replace、custom
在storyboard中,segue有几种不同的类型,在iphone和ipad的开发中,segue的类型是不同的. 在iphone中,segue有:push,modal,和custom三种不同的类型, ...