玲珑oj 1117 线段树+离线+离散化,laz大法
Time Limit:1s Memory Limit:256MByte
Submissions:438Solved:68
486到了异世界,看到了一群可爱的妹子比如蕾姆啊,艾米莉亚啊,拉姆啊,白鲸啊,怠惰啊等等!
有一天膜女告诉486说她的能力可能不能再用了,因为膜女在思考一个数据结构题,没心情管486了。
486说我来帮你做,膜女说你很棒棒哦!
给一个集合,最开始为空(不是数学上的集合)
五个操作:
1、插入x
2、把小于x的数变成x
3、把大于x的数变成x
4、求集合中第x小数
5、求集合中小于x的数个数
后面有m行,每行格式为opt x,opt表示是什么操作,x表示操作的值
1 1
1 3
4 1
2 33
4 1
33
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define LL long long
#define MAX 100005
map<int,int>M1;
int N,x[MAX]={},P[MAX];
struct Ask
{
int opt,x;
}a[MAX];
struct SegTree
{
#define M ((L+R)>>1)
#define lc (id<<1)
#define rc (id<<1|1)
int sum[MAX<<],laz[MAX<<];//laz[i]表示全部变为i
void init()
{
memset(sum,,sizeof(sum));
memset(laz,-,sizeof(laz));
}
void pushup(int L,int R,int id)
{
sum[id]=sum[lc]+sum[rc];
}
void pushdown(int L,int R,int id)
{
if(laz[id]!=-){
sum[lc]=sum[rc]=;
laz[lc]=laz[rc]=;
laz[id]=-;
}
}
void irt(int L,int R,int id,int x,int v)
{
if(L==R){
sum[id]+=v;
return;
}
pushdown(L,R,id);
if(x<=M) irt(L,M,lc,x,v);
else irt(M+,R,rc,x,v);
pushup(L,R,id);
}
int change(int L,int R,int id,int l,int r)
{
if(L>=l&&R<=r){
int res=sum[id];
sum[id]=;
laz[id]=;
return res;
}
pushdown(L,R,id);
int res=;
if(l<=M) res+=change(L,M,lc,l,r);
if(r>M) res+=change(M+,R,rc,l,r);
pushup(L,R,id);
return res;
}
int ask1(int L,int R,int id,int x)
{
if(L==R) return P[L];
pushdown(L,R,id);
if(sum[lc]>=x){
return ask1(L,M,lc,x);
}
else{
return ask1(M+,R,rc,x-sum[lc]);
}
}
int ask2(int L,int R,int id,int x)
{
if(L==R) return sum[id];
pushdown(L,R,id);
if(x<=M) return ask2(L,M,lc,x);
else if (x>M) return sum[lc]+ask2(M+,R,rc,x);
} }seg;
int main()
{
//freopen("in.txt","r",stdin);
int n,m,i,j,k;
scanf("%d",&n); N=;
for(i=;i<=n;++i)
{
scanf("%d%d",&a[i].opt,&a[i].x);
x[i]=a[i].x;
}
sort(x+,x+n+);
for(i=;i<=n;++i)
{
if(x[i]==x[i-]) continue;
M1[x[i]]=++N;
P[N]=x[i];
}
N++;
seg.init();
for(i=;i<=n;++i)
{
int x1=M1[a[i].x];
if(a[i].opt==){
seg.irt(,N,,x1,);
}
else if(a[i].opt==){
seg.irt(,N,,x1,seg.change(,N,,,x1-));
}
else if(a[i].opt==){
seg.irt(,N,,x1,seg.change(,N,,x1+,N));
}
else if(a[i].opt==){
printf("%d\n",seg.ask1(,N,,a[i].x));
}
else if(a[i].opt==){
printf("%d\n",seg.ask2(,N,,x1-));
}
}
return ;
}
玲珑oj 1117 线段树+离线+离散化,laz大法的更多相关文章
- hdu 4288 线段树+离线+离散化
http://acm.hdu.edu.cn/showproblem.php?pid=4288 開始的时候,果断TLE,做的方法是,线段树上只维护%5==3的坐标,比方1 2 3 4 5 6 7 假设 ...
- ACM/ICPC 之 数据结构-线段树+区间离散化(POJ2528)
这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题. 线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点 ...
- hdu1542 Atlantis (线段树+扫描线+离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 线段树+离线 hdu5654 xiaoxin and his watermelon candy
传送门:点击打开链接 题意:一个三元组假设满足j=i+1,k=j+1,ai<=aj<=ak,那么就好的.如今告诉你序列.然后Q次询问.每次询问一个区间[l,r],问区间里有多少个三元组满足 ...
- 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)
前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...
- 值域线段树 (玲珑OJ 1117)
点击打开题目链接 题目意思很简单: 1.插入x 2.把小于x的数变成x 3.把大于x的数变成x 4.求集合中第x小数 5.求集合中小于x的数个数 思路: 线段树,节点是值的分数,你可以离散,也可以不离 ...
- HDU 4288 Coder 【线段树+离线处理+离散化】
题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...
- 【BZOJ-4653】区间 线段树 + 排序 + 离散化
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 107 Solved: 70[Submit][Status][Di ...
- 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化
4636: 蒟蒻的数列 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 247 Solved: 113[Submit][Status][Discuss ...
随机推荐
- Python编程题总结
1 数学篇 1.1 斐波那契数列 def fib(n): if n in (0, 1): return n fib_n1, fib_n2 = 0, 1 for i in range(2, n + 1) ...
- PHP Web木马扫描器
<?php header('content-type:text/html;charset=gbk'); set_time_limit(0);//防止超时 /** * * php目录扫描监控 ...
- 杭电1019Least Common Multiple
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1019 题目: Problem Description The least common multiple ...
- enumerateObjectsUsingBlock 、for 、for(... in ...) 的区别 & 性能测试
for VS for(... in ...) for 的应用范围广基本可以NSArray.NSArray以及C语言的数组等,而for(... in ...)仅限于NSArray.NSArray等 fo ...
- 【转】js获取当前日期时间“yyyy-MM-dd HH:MM:SS”
获取当前的日期时间 格式“yyyy-MM-dd HH:MM:SS” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function getNowFormatD ...
- c++第三十一天
p159~p164:switch语句1.例程:统计文本中五个元音字母出现的次数.(利用输入输出重定向测试) $ a <input.txt>output.txt #include <i ...
- 【Thinking in Java, 4e】初始化与清理
[用构造器确保初始化] [方法重载] 涉及基本类型的重载 1.如果传入的数据类型小于方法中声明的形式参数类型:实际数据类型会被提升. 2.如果传入的数据类型大于方法中声明的形式参数类型:编译器报错,应 ...
- Python面试题目之(针对dict或者set数据类型)边遍历 边修改 报错dictionary changed size during iteration
# result 是一个字典, 把里面属性值是None的属性删除 for key in result: if not result[key]: del result[key] continue 但是报 ...
- 关于Log4Net的使用和配置
1. 添加log4net.dll引用 2.在添加引用的那层的 AssemblyInfo.cs 注册 : [assembly: log4net.Config.XmlConfigura ...
- linux及安全第三周总结——20135227黄晓妍
总结部分: Linux内核源代码: Arch 支持不同cpu的源代码:主要关注x86 Init 内核启动的相关代码:主要关注main.c,整个Linux内核启动代码start_kernel函数 K ...