1117 - RE:从零开始的异世界生活

Time Limit:1s Memory Limit:256MByte

Submissions:438Solved:68

DESCRIPTION

486到了异世界,看到了一群可爱的妹子比如蕾姆啊,艾米莉亚啊,拉姆啊,白鲸啊,怠惰啊等等!
有一天膜女告诉486说她的能力可能不能再用了,因为膜女在思考一个数据结构题,没心情管486了。
486说我来帮你做,膜女说你很棒棒哦!

给一个集合,最开始为空(不是数学上的集合)
五个操作:

1、插入x
2、把小于x的数变成x
3、把大于x的数变成x
4、求集合中第x小数
5、求集合中小于x的数个数

INPUT
第一行一个数m
后面有m行,每行格式为opt x,opt表示是什么操作,x表示操作的值

OUTPUT
对于每个4,5操作,输出一个值表示答案

SAMPLE INPUT
5
1 1
1 3
4 1
2 33
4 1

SAMPLE OUTPUT
1
33

HINT
m <= 100000 , x <= 1000000000

SOLUTION
这个题目是暑假前玲珑的一次我参加的比赛,很遗憾当时还很弱不会ST直接放弃了,现在又回来看见,当时看别人博客题解是什么值域线段树,好吧我也不会,
copy一个代码跑了960+ms险过感觉怎么这么慢捏,再次看题目感觉就是普通线段树就可做。
虽然n<1e9,但m最大10w,最多也就10w个不同的x,我想到用map离散化处理一下,为了方便询问我是从2开始的,由于要对所有的x离散化,所以必须先离散化结束才能应对所有的询问,这里采用了离线的作法,先保存询问值,预处理完在依次模拟询问的过程。
没有很奇葩的询问,单点更新,区间修改和二分查找,注意细节的话就好了。
 #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大法的更多相关文章

  1. hdu 4288 线段树+离线+离散化

    http://acm.hdu.edu.cn/showproblem.php?pid=4288 開始的时候,果断TLE,做的方法是,线段树上只维护%5==3的坐标,比方1 2 3 4 5 6 7  假设 ...

  2. ACM/ICPC 之 数据结构-线段树+区间离散化(POJ2528)

    这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题. 线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点 ...

  3. hdu1542 Atlantis (线段树+扫描线+离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. 线段树+离线 hdu5654 xiaoxin and his watermelon candy

    传送门:点击打开链接 题意:一个三元组假设满足j=i+1,k=j+1,ai<=aj<=ak,那么就好的.如今告诉你序列.然后Q次询问.每次询问一个区间[l,r],问区间里有多少个三元组满足 ...

  5. 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)

    前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...

  6. 值域线段树 (玲珑OJ 1117)

    点击打开题目链接 题目意思很简单: 1.插入x 2.把小于x的数变成x 3.把大于x的数变成x 4.求集合中第x小数 5.求集合中小于x的数个数 思路: 线段树,节点是值的分数,你可以离散,也可以不离 ...

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

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

  8. 【BZOJ-4653】区间 线段树 + 排序 + 离散化

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 107  Solved: 70[Submit][Status][Di ...

  9. 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化

    4636: 蒟蒻的数列 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 247  Solved: 113[Submit][Status][Discuss ...

随机推荐

  1. 长网址 短网址(http://www.zhihu.com/question/19852154?rf=21975802)

    短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...

  2. [Windows Powershell]-学习笔记(5)

    Powershell自动化变量 Powershell 自动化变量 是那些一旦打开Powershell就会自动加载的变量,或者说是运行是变量. 这些变量一般存放的内容包括 用户信息:例如用户的根目录$h ...

  3. Spring自动装配Bean的五种方式

    在Spring中,支持 5 自动装配模式. no – 缺省情况下,自动配置是通过“ref”属性手动设定,在项目中最常用byName – 根据属性名称自动装配.如果一个bean的名称和其他bean属性的 ...

  4. Maven的plugins、pluginManagement和dependencies、dependencyManagement

    plugins和dependencies下边配的都是真实使用的. pluginManagement和dependencyManagement下边配的都只是做声明的,一般配置在顶级pom中. 参考链接: ...

  5. 什么是Socket?简单点,通俗易懂的?

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装 ...

  6. PHP开发之apache mac上配置

    我使用的Mac OS X版本是10.8.2,Mac自带了Apache环境. 启动Apache 设置虚拟主机 启动Apache 打开“终端(terminal)”,输入 sudo apachectl -v ...

  7. C#中 哪些是值类型 哪些是引用类型

    DateTime属于 结构类型,所以是  值类型 在 C#中 简单类型,结构类型,枚举类型是值类型:其余的:接口,类,字符串,数组,委托都是引用类型

  8. 一幅图秒懂LoadAverage(转载)

    转自:http://www.habadog.com/2015/02/27/what-is-load-average/ 一幅图秒懂LoadAverage(负载)   一.什么是Load Average? ...

  9. MySQL的索引是什么?怎么优化?

    索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的.My ...

  10. 20145312 实验二《 Java面向对象程序设计》

    20145312 实验二< Java面向对象程序设计> 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解 ...