Coder(线段树)
求一部分和的线段树,因为是对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(线段树)的更多相关文章
- HDU4288:Coder(线段树单点更新版 && 暴力版)
Problem Description In mathematics and computer science, an algorithm describes a set of procedures ...
- hdu4428(Coder)线段树
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU4288 Coder(线段树)
注意添加到集合中的数是升序的,先将数据读入,再离散化. sum[rt][i]表示此节点的区域位置对5取模为i的数的和,删除一个数则右边的数循环左移一位,添加一个数则右边数循环右移一位,相当于循环左移4 ...
- HDU 4288 Coder(线段树)
题意: 给定三种操作 1. add x 向序列中添加x,添加之后序列还保持有序 2. del x 删除序列中值为x的元素 3. sum 求下边模5等于3的元素和 思路: 直接暴力也可以过,就是看暴 ...
- hdu 4288 Coder (线段树+离线)
题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出. digest sum求 ...
- HDU 4288 Coder (线段树)
Coder 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4288 题意:有三种类型的操作,(1)."add x",表示往集合里加入�数 ...
- 线段树(多棵) HDOJ 4288 Coder
题目传送门 题意:集合,add x, del x, 求和 分析:首先,暴力可以过这题.用上线段树能大大降低时间的消耗,具体就是类似开了5棵线段树,每个节点都有5个空间,表示该区间的id%5后的和,区间 ...
- HDU 4288 Coder 【线段树+离线处理+离散化】
题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...
- HDU 4288 Coder ( 离散化 + 离线 + 线段树 )
这题跟ZOJ 3606的解题思路很相似. 题意:有3中操作:1.向集合中增加一个数x(1≤x≤1e9):2.从集合中删去一个数x(保证这个数存在):3.查询集合中所有位置满足i%5==3的数a[i]的 ...
随机推荐
- 【Spring MVC】 - @ModelAttribute使用
@ModelAttribute一个具有如下三个作用: ①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑 定流程,而且自动暴露为模型数据用于视图页面 ...
- Log4j输出格式控制--log4j的PatternLayout参数含义
参数 说明 例子 %c 列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 log4j配置文件参数举例 输出显示媒介 假设当前logger名字 ...
- XML与TreeView
1.treeview代码书写 private void Form1_Load(object sender, EventArgs e) { //代码为TreeView添加子项 treeView1.Con ...
- codeforces 665C C. Simple Strings(乱搞)
题目链接: C. Simple Strings time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- CentOS6.3安装 Oracle 11g R2
1.设置系统1.1.包需求 11g很人性化了,增加了检查的机制,还有就是不象10g那样在64位下要安装很多的32位包,只需要安装一个gcc-32bit-4.3就OK了.下列表必须要安装:binutil ...
- C# 获取QQ好友列表信息的实现
分析部分 当我们访问QQ空间的时候,大家可以在右侧的发现一个这样的统计信息 当点击这个链接的时候,会跳转到 这样一个URL 这个URl可以管理好友,当然也就能读取到好友 上面我们是在浏览器中的操 ...
- 转:CURL库在程序中的运用浅析
CURL库在程序中的运用浅析-nk_ysg-ChinaUnix博客 http://blog.chinaunix.net/uid-22476414-id-3286638.html 这个目录的文章转载fr ...
- Ubuntu 安装mysql和 简单命令操作
ubuntu上安装mysql非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-clie ...
- 关于try catch finally的执行顺序解释
偶然遇到了被问到finally的执行问题,忽然发现一直用的都是try catch 没有用过finally的情况,所以目前总结一下. 先抛出结论: 1.try内部正常执行try的内部逻辑,异常则执行ca ...
- 【216】◀▶ IDL 字符串操作说明 (黑底)
参考:String Processing Routines —— 字符串处理函数 参考:IDL_String Methods 01 STRING 返回字符串. 02 STRCMP 比较字符串, ...