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的工作量. 扩展:在这样的背 ...
随机推荐
- Nhibernate refers to an unmapped class nhibernate问题的解决(初学者)
最近研究Nhibernate的一些功能,在通过Nhibernate反向建数据库表时遇到了一个问题,refers to an unmapped class:xxxx 通过查阅发现是自己对应的 xxxx ...
- Android周笔记(9.8-14)(持续更新)
本笔记记录一周内的小知识点和一些心学习的Demo. 1.PopupWindow: new 一个activity_pop_window:id为popwindow的Button,id为hello123的T ...
- js数组的操作<转>
转自 http://blog.csdn.net/xcxinghai/article/details/13502583 PS(个人理解): 1) 数组项的数据类型可以是混合多样的,同时可以含string ...
- struts2笔记12-声明式异常
1.配置异常处理 <action name="save" class="com.test.actions.ProductAction" method=&q ...
- sql server 2008 索引
微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引) 我们举例来 ...
- 我的android studio
- 论山寨手机与Android联姻 【7】 MTK手机软件系统
MTK feature phone的基本功能是通话和短信,要了解MTK手机软件系统,首先需要简要回顾几个移动网络通讯的基本概念. Figure 38. GSM-GPRS Architecture Co ...
- 2014第11周四Eclipse开发问题记
今天开发中eclipse工具使用上又学到几点: 1.去除代码空行:在Find输入框中输入:^\s*\n然后替换为空即可: 2.eclipse插件的加载:对于单一个jar文件的插件,直接放在plugin ...
- iOS使用sqlite3原生语法进行增删改查以及FMDB的使用
首先要导入libsqlite3.dylib并且加入头文件#import <sqlite3.h>,在进行增删改查之前还要先把数据库搞进去. 一种方法是从外面拷贝到程序里:http://www ...
- Android SoundPool 的使用以及原理分析
好吧,我们今天来聊聊SoundPool这东西. 据说这个东西是冰激凌(Android4.0)里才引入的一个新东西.按照官方的意思大多数情况下是给游戏开发用的,比如一个游戏10关,它能在游戏开始前一次加 ...