求一部分和的线段树,因为是对5取余,所以给定一段区间a-b,假设其位置会有变化,最多会有5种和,那么就可以保留这五种和,在用lz进行延迟标记时,保存位置变化了多少也就知道了该从当前和转到哪一个和。

当时把lz标记那么部分写成覆盖了,应该是+=,WA了两次。

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define N 100010
#define LL __int64
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
map<int,int>f;
LL s[N<<][];
int lz[N<<],fg[N<<],a[N];
struct node
{
int x;
char sr[];
}p[N];
void up(int w)
{
int i;
for(i = ; i < ; i++)
s[w][i] = s[w<<][i]+s[w<<|][i];
fg[w] = fg[w<<]+fg[w<<|];
}
void down(int w,int m)
{
int i;
if(lz[w])
{
lz[w<<] += lz[w];
lz[w<<|] += lz[w];
LL x[],y[];
for(i = ;i < ; i++)
{
x[i] = s[w<<][i];
y[i] = s[w<<|][i];
}
for(i = ; i < ; i++)
{
s[w<<][(i+lz[w]%+)%] = x[i];
s[w<<|][(i+lz[w]%+)%] = y[i];
}
lz[w] = ;
}
}
void build(int l,int r,int w)
{
if(l==r)
{
for(int i = ;i < ; i++)
{
s[w][i] = ;
}
fg[w] = ;
return ;
}
int m = (l+r)>>;
build(l,m,w<<);
build(m+,r,w<<|);
up(w);
}
void update(int a,int b,int d,int l,int r,int w)
{
if(a<=l&&b>=r)
{
int i;
LL x[];
for(i = ; i < ; i++)
{
x[i] = s[w][i];
}
for(i = ; i < ; i++)
s[w][(i+d+)%] = x[i];
lz[w] += d;
return ;
}
down(w,r-l+);
int m = (l+r)>>;
if(a<=m) update(a,b,d,l,m,w<<);
if(b>m) update(a,b,d,m+,r,w<<|);
up(w);
}
void add(int p,int d,int po,int flag,int l,int r,int w)
{
if(l==r)
{
int i;
if(flag)
{
for(i = ; i < ; i++)
if((po+)%==i)
{
s[w][i] = d;
//if(d==4) cout<<i<<endl;
}
else s[w][i] = ;
fg[w] = ;
}
else
{
for(i = ; i< ; i++)
s[w][i] = ;
fg[w] = ;
}
return ;
}
down(w,r-l+);
int m = (l+r)>>;
if(p<=m) add(p,d,po,flag,l,m,w<<);
else add(p,d,po,flag,m+,r,w<<|);
up(w);
}
int query(int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r)
return fg[w];
int m = (l+r)>>;
int res = ;
down(w,r-l+);
if(a<=m)
res+=query(a,b,l,m,w<<);
if(b>m)
res+=query(a,b,m+,r,w<<|);
return res;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
memset(lz,,sizeof(lz));
f.clear();
int g = ;
for(i = ; i <= n ;i++)
{
scanf("%s",p[i].sr);
if(p[i].sr[]=='s') continue;
scanf("%d",&p[i].x);
a[++g] = p[i].x;
}
sort(a+,a+g+);
int o = ;
f[a[]] = ;
for(i = ; i <= g; i++)
if(a[i]!=a[i-])
f[a[i]] = ++o;
build(,o,);
for(i = ; i <= n ;i++)
{
if(p[i].sr[]=='a')
{
int k = query(,f[p[i].x],,o,);
add(f[p[i].x],p[i].x,k,,,o,);
if(f[p[i].x]<o)
update(f[p[i].x]+,o,,,o,);
}
else if(p[i].sr[]=='d')
{
//int k = query(1,f[p[i].x],1,o,1);
add(f[p[i].x],p[i].x,,,,o,);
if(f[p[i].x]<o)
update(f[p[i].x]+,o,-,,o,); }else
printf("%I64d\n",s[][]);
}
}
return ;
}

Coder(线段树)的更多相关文章

  1. HDU4288:Coder(线段树单点更新版 && 暴力版)

    Problem Description In mathematics and computer science, an algorithm describes a set of procedures ...

  2. hdu4428(Coder)线段树

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  3. HDU4288 Coder(线段树)

    注意添加到集合中的数是升序的,先将数据读入,再离散化. sum[rt][i]表示此节点的区域位置对5取模为i的数的和,删除一个数则右边的数循环左移一位,添加一个数则右边数循环右移一位,相当于循环左移4 ...

  4. HDU 4288 Coder(线段树)

    题意: 给定三种操作 1. add x 向序列中添加x,添加之后序列还保持有序 2. del x  删除序列中值为x的元素 3. sum  求下边模5等于3的元素和 思路: 直接暴力也可以过,就是看暴 ...

  5. hdu 4288 Coder (线段树+离线)

    题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出.       digest sum求 ...

  6. HDU 4288 Coder (线段树)

    Coder 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4288 题意:有三种类型的操作,(1)."add x",表示往集合里加入�数 ...

  7. 线段树(多棵) HDOJ 4288 Coder

    题目传送门 题意:集合,add x, del x, 求和 分析:首先,暴力可以过这题.用上线段树能大大降低时间的消耗,具体就是类似开了5棵线段树,每个节点都有5个空间,表示该区间的id%5后的和,区间 ...

  8. HDU 4288 Coder 【线段树+离线处理+离散化】

    题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...

  9. HDU 4288 Coder ( 离散化 + 离线 + 线段树 )

    这题跟ZOJ 3606的解题思路很相似. 题意:有3中操作:1.向集合中增加一个数x(1≤x≤1e9):2.从集合中删去一个数x(保证这个数存在):3.查询集合中所有位置满足i%5==3的数a[i]的 ...

随机推荐

  1. socket即时聊天

    服务端 package com.luhan.text; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Gri ...

  2. 如何创建WindowsService

    创建Windows Service可分为以下几步: 1. 创建一个“Windows Service”项目 2. 设置服务的相关属性,以确定服务的名称及工作机制 属性 设置 ServiceName 服务 ...

  3. MPEG学习

    Mpeg:moving picture experts group 移动图片专家组 导入:Mpeg技术在我理解就是我们对音视频信息的一个输出标准.主要包括MPEG-1.MPEG-2.MPEG-4.MP ...

  4. 插入排序(InsertionSort)

    位置p上的元素存储于tmp(第一趟p通常取1),而(位置p之前)所有更大的元素都向右移动一个位置. 然后tmp被放在正确的位置上. 代码: public class InsertionSort { p ...

  5. Win32环境下代码注入与API钩子的实现

    本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在VS下编写和调试Win32应用程序和动态链接库 ...

  6. 利用union判断系统的大小端

    int checkCPUendian()//返回1,为小端:反之,为大端: { union { unsigned int a; unsigned char b; }c; c.a = 1; return ...

  7. jquery easyui 实战总结

    (2012-09-26 10:22:24) 转载▼ 标签: it 分类: Javascript 一.tree 1.根据node id查找对应的node,然后选择该节点:                 ...

  8. 【Data Structure & Algorithm】二叉树中和为某值的所有路径

    二叉树中和为某值的所有路径 题目:输入一个整数和一个二叉树,从树的根节点开始往下访问一直到叶节点所经过的所有节点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数22和如下二叉树: 10 ...

  9. Content Security Policy的学习理解

    以下内容转载自 http://www.cnblogs.com/alisecurity/p/5924023.html 跨域脚本攻击 XSS 是最常见.危害最大的网页安全漏洞. 为了防止它们,要采取很多编 ...

  10. python之文件的读写(1)

    真的崩溃,刚写完的笔记由于点错了,现在特么又要重新写了.  崩溃呀.......... 之前的废话就不再重复了,直接进入正题吧. 今天小R 学了一天的NP课程,但是python还是不能忘得,所以晚上又 ...