Coder HDU - 4288

题意:你有n次操作,每次可以往集合里插入元素,删除元素,然后如果是求和操作的话,是求升序排序的情况下,pos%5==3的位置的数之和。

思路:因为要开权值线段树数很大,所以先把操作离线把要用到的数都离散化了,然后线段树维护的是区间数的个数num和区间位置%5==i的位置的数之和sum[i],我们最后查询的时候要的是根节点的sum[3],这题的关键就是这个pushup里的更新sum【i】值。

for(int i=0;i<=4;i++)sum[rt][i]=sum[ls][i]+sum[rs][((i-num[ls])%5+5)%5];

因为求根节点的sum[3]的时候说不定用的是右儿子的sum[0,1,2,3,4]里的哪个,所有对节点都要维护sum[0~4],然后sum[rt][i]要直接加上左儿子的sum[ls][i]是毋庸置疑的,关键是要找到rs节点对应区间里的数放到rt节点区间里时位置%5==i的位置的数之和是多少假设这个位置是pos,那么有(ls.num+pos)%5==i,我们要的就是满足条件的pos位置的数之和,然后有

同余式相加:若a≡b(mod m),c≡d(mod m),则a+c≡b+d(mod m); 减法也成立
同余式相乘:若a≡b(mod m),c≡d(mod m),则ac≡bd(mod m)。

所有可以得到pos同余(i-ls.num) 在mod5情况下,那么就有pos%5==(i-ls.num)%5,所以要的就是右儿子的sum[(i-ls.num)%5]。由于pos%5==(i-ls.num)%5这个是数学上相等,到了c++里面可以就不一定相等了因为数学里(-20)%11==2,但是c++里(-20)%11==-9,所以写代码的时候还要考虑(i-ls.num)%5为负数的情况,那么((i-ls.num)%5+5)%5就可以避免负数的情况了,所以应该是加sum[((i-num[ls])%5+5)%5]。

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ls rt<<1
#define rs (rt<<1)+1
#define ll __int64
#define fuck(x) cout<<#x<<"     "<<x<<endl;
const int maxn=1e5+20;
int d[4][2]={1,0,-1,0,0,1,0,-1};
int num[maxn<<2],n,vcnt;
ll sum[maxn<<2][5],lsh[maxn];
struct node
{char op[10];ll val;
}q[maxn];
inline int getid(ll x)
{return lower_bound(lsh+1,lsh+vcnt+1,x)-lsh;
}
void pushup(int rt)
{num[rt]=num[ls]+num[rs];for(int i=0;i<=4;i++)sum[rt][i]=sum[ls][i]+sum[rs][((i-num[ls])%5+5)%5];
}
void update(int rt,int L,int R,int pos,int val)
{if(L==R){if(val==1){num[rt]=1;sum[rt][1]=1LL*lsh[pos];}else{num[rt]=0;sum[rt][1]=0LL;}return ;}int mid=(L+R)>>1;if(pos<=mid)update(ls,L,mid,pos,val);elseupdate(rs,mid+1,R,pos,val);pushup(rt);
}
int main()
{while(scanf("%d",&n)!=EOF){vcnt=0;memset(num,0,sizeof(num));memset(sum,0,sizeof(sum));for(int i=1;i<=n;i++){scanf("%s",q[i].op);if(q[i].op[0]=='a'||q[i].op[0]=='d')scanf("%I64d",&(q[i].val)),lsh[++vcnt]=q[i].val;}sort(lsh+1,lsh+vcnt+1);vcnt=unique(lsh+1,lsh+vcnt+1)-lsh-1;for(int i=1;i<=n;i++)if(q[i].op[0]=='a')update(1,1,vcnt,getid(q[i].val),1);elseif(q[i].op[0]=='d')update(1,1,vcnt,getid(q[i].val),0);elseprintf("%I64d\n",sum[1][3]);}return 0;
}

Coder HDU - 4288相关推荐

  1. hdu 4288 Coder

    http://acm.hdu.edu.cn/showproblem.php?pid=4288 题意:add 就是在集合里面加上一个数x: del 就是从集合里删去一个数x: sum是求位置i%5==3 ...

  2. hdu 4288 Coder (成都赛区 线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=4288 题意: 给出一个有序集合,3种操作.插入一个数,删除一个数,都保证序列有序.以及求和 其中求和是将下标%5 ...

  3. HDU 4288 Coder [线段树]

    维护一个可以插入删除的有序序列,每次询问序列中位置mod5=3的数的和. CodeForces原题,因为时限给的太宽,数据太水,STL可以暴力过. 用线段树和平衡树都可以做这题,线段树需要先离散化,然 ...

  4. 2012成都网络赛赛后【缺CHJ】

    A Coder (HDU 4288,与Codeforces 85D相同) 应该用线段树写,我是块状链表水过了 #include<map>#include<cstdio>#inc ...

  5. 数据结构---线段树

    线段树 转载请注明出处,谢谢!http://blog.csdn.net/metalseed/article/details/8039326  持续更新中···   一:线段树基本概念 1:概述 线段树 ...

  6. 线段树详解 (原理,实现与应用)

    线段树详解 By 岩之痕 目录: 一:综述 二:原理 三:递归实现 四:非递归原理 五:非递归实现 六:线段树解题模型 七:扫描线 八:可持久化 (主席树) 九:练习题 一:综述 假设有编号从1到n的 ...

  7. 【转载】线段树题目2

    1.hdu1166 敌兵布阵 更新节点,区间求和. 2.hdu1754 I Hate It 更新节点,区间最值. . 3.hdu1698 Just a Hook 成段更新,总区间求和. . 4.hdu ...

  8. HDU 4883 Best Coder Round 2 TIANKENG’s restaurant 解读

    有一组数据是在客人到达和出发时间,问:多少把椅子的能力,以满足所有客人的需求,可以有一个地方坐下要求. 有些人甚至开始考虑暴力法,这些数据是少,其实这个问题很多数据, 暴力需求O(n*n)的时间效率, ...

  9. HDU题目分类大全【大集合】

    基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.  1032.1037.1040.1048.1056.105 ...

最新文章

  1. android服务重启间隔,android – 崩溃的服务在很长一段时间后重新启动
  2. 基于AES加解密的图像加解密算法
  3. Druid详细配置信息
  4. 高斯噪声和椒盐噪声python
  5. 通过python实现linux切换用户_Python操作远程服务器切换到root用户
  6. 【转】基于easyui开发Web版Activiti流程定制器详解(一)——目录结构
  7. java 标记_java – 标记注释与标记接口
  8. TreeMap1.8源码
  9. WINDOWS2008网络负载平衡群集(NLB)完全攻略
  10. Watchman 的安装
  11. 数据集下载地址(转)以下内容转自https://baijiahao.baidu.com/s?id=1615853849218131902wfr=spiderfor=pc
  12. 诺基亚10.22变革影响的分析(转)
  13. 红米3 MoKee 7.1.2_r36 自编译版/去魔趣中心、宙斯盾/息屏禁止刷新UI 2018年5月5日更新...
  14. 高德地图缩放级别对应的比例尺
  15. Android Studio实现记单词App,背完四六级一次过~
  16. 软件工程-团队作业2
  17. 日本行,一些随笔和照片
  18. Android加固调研
  19. Web端实现邮件发送
  20. Interval数据类型

热门文章

  1. 正负号 substr java_实战LeetCode 系列(一) (题目+解析)
  2. TASK 5 ARP Cache Poisoning
  3. 【Datawhale组队学习】机器学习数学基础 - 一元函数微分学【Task 03】
  4. 安卓系统监控任务管理器App推荐
  5. mysql useing查询_mysql explain语法详解--优化你的查询
  6. 库卡机器人会卡顿吗_看完你就知道德国库卡机器人到底有多牛!
  7. 一怒之下做了个基于微信公众平台结合百度地图的查公交应用!轻量!方便!快捷!
  8. bilibili学习
  9. python flask上传文件_Python之利用Flask上传文件、Flask_RESTful
  10. 高通android充电常用问题,高通平台android9.0充电电量,充电指示灯以及充电图标读取分析...