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的工作量. 扩展:在这样的背 ...
随机推荐
- [Oracle]ocilib绑定数组实现批量写入
#include "ocilib.h" #define INSERT_SQL_00 MT("INSERT INTO C_PICRECORD_00 (ID, DEV_ID) ...
- django随笔说明
最近学习了vamei的快速Python教程,想着语法学了不用就要忘记,总要拿点东西来练练手,然后又开始学习Django,也算是顺势而为吧. 现在学Django,是跟着教程djangobook学的,内容 ...
- 有结果集的mysqli函数获取行数和列数
<?php $mysqli=new mysqli("localhost", "root", "123456", "xsphp ...
- c语言 文件写入和读取
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 10 struct studen ...
- Swift笔记01
变量使用var 来声明,常量是所有let ,变量名没什么限制 中文表情都可以 ,一般还是使用英文. var str = "luoshuai " //swift语句后面不需要; l ...
- 给flash文件加超链接[兼容主流浏览器]
<div style="position: relative;"> <a style="width: 640px; height: 90px; posi ...
- Oracle导出空表处理方法
exp或是expdp命令在导出数据的时候会把表记录数为0的表过滤掉,无法导出.通过如下方法可以导出记录数0的表. 1.先查询一下哪些表是空的: select table_name from use ...
- Egret的若干局限
Egret是个好东西,整套workflow用下来,特别顺手,对于移动端游戏的开发来说,选择Egret无疑是个不二的选择. 当然,小学语文课上老师就教过一种写作手法,欲扬先抑,笔者今天倒过来,来说说Eg ...
- Mac/ios 模拟器 测试模拟慢网速
原文:http://www.heyuan110.com/2015/06/16/Mac%E6%B5%8B%E8%AF%95%E6%A8%A1%E6%8B%9F%E6%85%A2%E7%BD%91%E9% ...
- 使用instantclient_11_2 和PL/SQL Developer工具包连接oracle 11g远程数据库
本文转自CSDN博客,http://blog.csdn.net/helifengwell/archive/2010/08/18/5820434.aspx 1,先到Oracle站点下载Instant C ...