hdu 4288 Coder
线段树好题,和 15 年的广东省省赛 C 题有相似之处,一开始我的思路有偏差,看了别人的博客后感觉处处技巧都是精华,主要是区间合并的技巧一时很难想到,先附上代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define root int rt, int l, int r
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define makemid int mid = l + r >> 1
typedef long long LL;
const int N = ; int cnt[N << ];
LL sum[N << ][]; void build(root) {
cnt[rt] = ;
for(int i = ; i < ; ++i)
sum[rt][i] = ;
if(l == r) return ;
makemid;
build(lson);
build(rson);
} inline int mymod(int x, int mod) {
if(x < ) return (x % mod + mod) % mod;
return x % mod;
} inline void pushup(int rt) {
for(int i = ; i < ; ++i)
sum[rt][i] = sum[rt << ][i] + sum[rt << | ][mymod(i - cnt[rt << ], )];
} bool flag;
int pos, val; void update(root) {
flag ? ++cnt[rt] : --cnt[rt];
if(l == r) {
sum[rt][] = flag ? val: ;
return ;
}
makemid;
if(pos <= mid) update(lson);
else update(rson);
pushup(rt);
} int find(int *c, int low, int up, int x) {
int mid;
while(low <= up) {
mid = low + up >> ;
if(x == c[mid]) return mid;
else if(x < c[mid]) up = mid - ;
else low = mid + ;
}
return low;
} char op[N][];
int c[N], digit[N]; int main() {
int n,k;
while(~scanf("%d",&n)) {
k = ;
for(int i = ; i < n; ++i) {
scanf("%s",op[i]);
if(op[i][] != 's') {
scanf("%d", c + i);
digit[k++] = c[i];
}
}
sort(digit, digit + k);
int len = unique(digit, digit + k) - digit; if(len) build(,,len); for(int i = ; i < n; ++i) {
if(op[i][] == 's') printf("%I64d\n",sum[][]);
else {
flag = op[i][] == 'a';
pos = find(digit, , len - , c[i]) + ;
val = c[i];
update(,,len);
}
}
}
return ;
}
做 100 道水题,不如做一道难题来得更有意义。
hdu 4288 Coder的更多相关文章
- HDU 4288 Coder (线段树)
Coder 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4288 题意:有三种类型的操作,(1)."add x",表示往集合里加入�数 ...
- HDU 4288 Coder 【线段树+离线处理+离散化】
题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...
- HDU 4288 Coder(线段树)
题意: 给定三种操作 1. add x 向序列中添加x,添加之后序列还保持有序 2. del x 删除序列中值为x的元素 3. sum 求下边模5等于3的元素和 思路: 直接暴力也可以过,就是看暴 ...
- HDU 4288 Coder ( 离散化 + 离线 + 线段树 )
这题跟ZOJ 3606的解题思路很相似. 题意:有3中操作:1.向集合中增加一个数x(1≤x≤1e9):2.从集合中删去一个数x(保证这个数存在):3.查询集合中所有位置满足i%5==3的数a[i]的 ...
- hdu 4288 Coder(单点操作,查询)
题意: 三种操作: 1. add x – add the element x to the set;2. del x – remove the element x from the set;3. su ...
- hdu 4288 Coder (线段树+离线)
题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出. digest sum求 ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- 线段树(单点更新) HDOJ 4288 Coder
题目传送门 #include <cstdio> #include <cstring> #define lson l, m, rt << 1 #define rson ...
- hdu 4288 线段树+离线+离散化
http://acm.hdu.edu.cn/showproblem.php?pid=4288 開始的时候,果断TLE,做的方法是,线段树上只维护%5==3的坐标,比方1 2 3 4 5 6 7 假设 ...
随机推荐
- android基础小结
(注:此小结文档在全屏模式下观看效果最佳) 2016年3月1日,正式开始了我的android学习之路. 最最开始的,当然是学习怎样搭载环境了,然而苦逼的我在win10各种坑爹的指引下还是安装了一个星期 ...
- c# UDP
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Poj(2679),SPFA,邻接表(主流写法)
题目链接:http://poj.org/problem?id=3268 题意: 有编号为1-N的牛,它们之间存在一些单向的路径.给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求 ...
- iis 没目录文件
方法一: <system.webServer> <directoryBrowse enabled="true"/> </system.webServe ...
- anroid开发者专用vpn
http://android.vpn.ac.cn/
- JLINK仿真器与ST-LINK仿真器的安装与配置.pdf
JLINK仿真器与ST-LINK仿真器的安装与配置.pdf 工欲善其事,......stm32的开发环境搭建 观看地址 说到仿真器,首先要了解一下JTAG. JTAG协议 JTAG(Joint Te ...
- 详解CSS position属性
原文地址:http://luopq.com/2015/11/15/css-position/ position是CSS中非常重要的一个属性,通过position属性,我们可以让元素相对于其正常位置,父 ...
- DataList数据的绑定
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs& ...
- uTenux——LED驱动讲解
LED驱动讲解,对于一个嵌入式的工程师还是一个刚开是学习相关电子设计的朋友,对于LED的驱动问题应该不甚陌生.我所说的LED驱动并不是类似大功率LED照明的那个驱动,而是简单的控制器对LED的控制驱动 ...
- Android 网格布局 计算器
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&quo ...