玲珑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 ...
随机推荐
- JAVA集合详解(Collection和Map接口)
原文地址http://blog.csdn.net/lioncode/article/details/8673391 在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父 ...
- JAVA中重写equals()方法为什么要重写hashcode()方法?
object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法 ...
- 关于Socket和ServerSocket类详解
Socket类 套接字是网络连接的一个端点.套接字使得一个应用可以从网络中读取和写入数据.放在两个不同计算机上的两个应用可以通过连接发送和接受字节流.为了从你的应用发送一条信息到另一个应用,你需要知道 ...
- Oracle中的substr()函数详解案例
1)substr函数格式 (俗称:字符截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a ...
- python-静态方法staticmethod、类方法classmethod、属性方法property
Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def ...
- JS正则表达式从入门到入土(5)—— 量词
量词 很多时候,我们需要匹配一个连续出现很多次字符的字符串,比如,我们要匹配一个连续出现20次的数字的字符串,按照之前的写法: \d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d ...
- Ant Design 常用命令汇总
Ant Design React 安装 1. 安装脚手架工具# antd-init 是一个用于演示 antd 如何使用的脚手架工具,真实项目建议使用 dva-cli. $ npm install an ...
- 蓝桥杯练习——C++输出阶乘的最右边一位非零数
#include<iostream> #include<iomanip> using namespace std; #define M 10000 #define N 1000 ...
- Windows7使用无线网卡建立WiFi热点
在Windows7下设置热点需要用到命令netsh wlan,具体的设置步骤如下: 1.配置热点 以管理员身份打开命令行模式,输入命令 netsh wlan set hostednetwork mod ...
- SaltStack执行状态收集入库-第五篇
实验目标 1.salt执行的状态然后结果写入MySQL可以方便查询执行salt执行的历史记录 实现方法 1.使用salt的return功能,是minion直接写入MySQL(相对比较麻烦) 2.使用m ...