这题开始的思路就是模拟:就像数组中插点一样,每一个想买票的人都想往前插队!
但是这样的话肯定TLE, 看了别人的思路之后才恍然大悟!
正解:
将开始的正序插入,变成倒序插入,这样的话,想一想:第 i 个人想要插在 p[i]
的位置上,那么就要保证所插入的位置之前一定要有 p[i]-1个空位!因为一定会有p[j]<p[i]
(<=p[j]<=j,每个人都想往前插队)
的第j个人插在p[i]的位置的前边! 如果i<j; && p[i]==p[j], 倒序插入中,第j个人先插入, 那么第i个人在保证插入的位置之前有
p[i]-1个空位的同时,又要插入到第 j 个人的后边!


 1 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define M 200005
using namespace std; pair<int, int>per[M];
int ret[M];
int tree[M*];
int n; void buildT(int p, int ld, int rd){
if(ld==rd){
tree[p]=;
return ;
}
int mid=(ld+rd)>>;
buildT(p<<, ld, mid);
buildT(p<<|, mid+, rd);
tree[p]=tree[p<<]+tree[p<<|];
} void updateT(int p, int ld, int rd, int pos, int val){
if(ld==rd){
tree[p]=;
ret[ld]=val;
return ;
}
int mid=(ld+rd)>>;
if(tree[p<<]>pos)
updateT(p<<, ld, mid, pos, val);
else
updateT(p<<|, mid+, rd, pos-tree[p<<], val); tree[p]=tree[p<<]+tree[p<<|];
} int main(){
int i;
while(scanf("%d", &n)!=EOF){
buildT(, , n);
for(i=; i<=n; ++i)
scanf("%d%d", &per[i].first, &per[i].second);
for(i=n; i>=; --i)
updateT(, , n, per[i].first, per[i].second); printf("%d", ret[]);
for(i=; i<=n; ++i)
printf(" %d", ret[i]);
printf("\n");
}
return ;
}
 //树状数组~~不解释
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm> #define N 200005
using namespace std; int tree[N];
int pos[N], val[N];
int ret[N];
int n; int lowbit(int x){
return x&(-x);
} void buildT(){
for(int i=; i<=n; ++i){
tree[i]=;
for(int j=i-lowbit(i)+; j<=i; ++j)
tree[i]+=;
}
} void updateT(int x){
while(x<=n){
tree[x]-=;
x+=lowbit(x);
}
} int getSum(int x){
int s=;
while(x>){
s+=tree[x];
x-=lowbit(x);
}
return s;
} int main(){
while(scanf("%d", &n)!=EOF){
buildT();
for(int i=; i<=n; ++i){
scanf("%d%d", &pos[i], &val[i]);
ret[i]=-;
}
for(int i=n; i>=; --i){
int ld=, rd=n;
bool flag=false;
while(ld<=rd){
int mid=(ld+rd)>>;
int s=getSum(mid);
//如果当前的位置没有人插入并且该位置的之前的人数恰好为pos[i]
if(ret[mid]==- && s==pos[i]+){
updateT(mid);
ret[mid]=val[i];
flag=true;//已经找到不用在继续寻找了
break;
}
else if(s>=pos[i]+)
rd=mid-;
else ld=mid+;
}
if(!flag) ret[rd+]=val[i];//直到找到当前的位置没有人插入并且该位置的之前的人数恰好为pos[i]
}
printf("%d", ret[]);
for(int i=; i<=n; ++i)
printf(" %d", ret[i]);
printf("\n");
}
return ;
}

pojBuy Tickets2828线段树或者树状数组(队列中倒序插队)的更多相关文章

  1. 差分+树状数组【p4868】Preprefix sum

    Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前 ...

  2. 「模拟赛20180307」三元组 exclaim 枚举+树状数组

    题目描述 给定 \(n,k\) ,求有多少个三元组 \((a,b,c)\) 满足 \(1≤a≤b≤c≤n\)且\(a + b^2 ≡ c^3\ (mod\ k)\). 输入 多组数据,第一行数据组数\ ...

  3. BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)

    墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...

  4. BZOJ 3236 AHOI 2013 作业 莫队+树状数组

    BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出     题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...

  5. 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治

    LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...

  6. Java中的自定义数组队列

    在Java中,作为所有数据结构中存储和获取速度最快的一种,数组凭借其这种简单易用的优势在各个方面都能大显神威.但是数组也有自身的局限性.数组的长度必须是固定的一旦定义之后就无法动态的更改,这就会造成这 ...

  7. JAVA之数组队列

    package xxj.datastructure0810; import java.util.Random; public class DataStructure { /** * @param ar ...

  8. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  9. HDU 1556 线段树或树状数组,插段求点

    1.HDU 1556  Color the ball   区间更新,单点查询 2.题意:n个气球,每次给(a,b)区间的气球涂一次色,问最后每个气球各涂了几次. (1)树状数组 总结:树状数组是一个查 ...

随机推荐

  1. 最新Ubuntu10.10 更新源

    Ubuntu10.10这个版本真的很老了,官方N多年前早已不再支持更新软件源了. 目前可用的有中科大镜像更新源. 中科大Ubuntu 10.10源列表: deb http://mirrors.ustc ...

  2. windows编程:画线,简单的碰撞检测,简单的帧率锁定

    #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> #include <mmsy ...

  3. project.VERSION_NAME定义

    android { compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) buildToolsVersion pr ...

  4. js基础知识:表达式

    一.什么是表达式?我理解的"表达式":程序执行到1个"表达式"时,会返回1个值到这个"表达式"所在的位置. var a = 10 , b = ...

  5. 网页版视频网站可以用html5来实现吗?

    当然可以用html5来实现视频网站,而且html5的诞生完全符合了百度优化,百度蜘蛛对这类的网站友好度非常高,会尽量会给高的权重,但是现在很多做 这类网站的开发还是比较习惯用websocket,这个东 ...

  6. jsoup使用样式class抓取数据时空格的处理

    最近在研究用android和jsoup抓取小说数据,jsoup的使用可以参照http://www.open-open.com/jsoup/;在抓纵横中文网永生这本书的目录内容时碰到了问题, 永生的书简 ...

  7. 负载均衡的mariadb集群搭建

    集群介绍: Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件,目前只支持InnoDB引擎. 主要功能: 同步复制 真正的multi-master,即所有节点可以同 ...

  8. 使用XmlDataDocument将数据存储到XML文档

    string str = "Data Source=192.168.1.20;Initial Catalog=WebTest;User ID=sa;Password="; SqlC ...

  9. 使用WMI和性能计数器监控远程服务器权限设置

    应用场景:在web服务器中,通过.NET编码使用WMI查询远程服务器的一些硬件配置信息,使用性能计数器查询远程机器的运行时资源使用情况.在网上没有找到相关的东西,特记录与大家共享. 将web服务器和所 ...

  10. 如何实现:录制视频聊天的全过程? 【低调赠送:QQ高仿版GG 4.3 最新源码】

    前段时间做个项目,客户需要将视频对话的整个过程录制下来,这样,以后就可以随时观看.想来录制整个视频聊天的过程这样的功能应该是个比较常见的需求,比如,基于网络语音视频的1:1的英语口语辅导,如果能将辅导 ...