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 ;
}

最新文章

  1. List集合及子类
  2. 【C语言】12-指向一维数组元素的指针
  3. android webview web里面的数据透传到java以及java的数据透传到web
  4. oracle11g 远程登录数据库
  5. asp.net mvc4使用百度ueditor编辑器
  6. 11th day
  7. Android 开发中使用 SQLite 数据库
  8. jQuery plugin
  9. 3.class文件基本结构
  10. SaberRD之瞬态分析
  11. 洛谷P5108 仰望半月的夜空(后缀数组)
  12. UnicodeDecodeError:utf-8codeccantdecodebyte0xb9inposition0:invalidstartbyte
  13. WPF仿网易云音乐系列(二、歌单创建窗口+登录设置模块)
  14. hdu 1010(DFS) 骨头的诱惑
  15. 2013长春网赛1010 hdu 4768 Flyer
  16. js各种小知识
  17. 最简单的视音频播放演示样例3:Direct3D播放YUV,RGB(通过Surface)
  18. Selenium geckodriver异常
  19. adb shell top 命令
  20. 常见的接口与类 -- Comparator

热门文章

  1. 通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小
  2. 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)
  3. class-dump安装与使用
  4. PKU 1204 Word Puzzles(AC自动机)
  5. PKU 1035 Spell checker(Vector+String应用)
  6. pyinstaller 打包生成的exe文件,在其他电脑上报错
  7. IoC控制反转与DI依赖输入
  8. javaScript对象与JSON.stringfly(obj)
  9. C#生成PDF2019
  10. yum的使用