pojBuy Tickets2828线段树或者树状数组(队列中倒序插队)
这题开始的思路就是模拟:就像数组中插点一样,每一个想买票的人都想往前插队!
但是这样的话肯定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线段树或者树状数组(队列中倒序插队)的更多相关文章
- 差分+树状数组【p4868】Preprefix sum
Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前 ...
- 「模拟赛20180307」三元组 exclaim 枚举+树状数组
题目描述 给定 \(n,k\) ,求有多少个三元组 \((a,b,c)\) 满足 \(1≤a≤b≤c≤n\)且\(a + b^2 ≡ c^3\ (mod\ k)\). 输入 多组数据,第一行数据组数\ ...
- BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...
- BZOJ 3236 AHOI 2013 作业 莫队+树状数组
BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...
- 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治
LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...
- Java中的自定义数组队列
在Java中,作为所有数据结构中存储和获取速度最快的一种,数组凭借其这种简单易用的优势在各个方面都能大显神威.但是数组也有自身的局限性.数组的长度必须是固定的一旦定义之后就无法动态的更改,这就会造成这 ...
- JAVA之数组队列
package xxj.datastructure0810; import java.util.Random; public class DataStructure { /** * @param ar ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- HDU 1556 线段树或树状数组,插段求点
1.HDU 1556 Color the ball 区间更新,单点查询 2.题意:n个气球,每次给(a,b)区间的气球涂一次色,问最后每个气球各涂了几次. (1)树状数组 总结:树状数组是一个查 ...
随机推荐
- 一个好用的C#类型转换器
public static object ChangeType(object value, Type targetType) { if (targetType.IsGenericType && ...
- 关于HIVE的数据模型介绍
(1)Hive数据库 类似传统数据库的DataBase,在第三方数据库里实际是一张表.简单示例命令行 hive > create database test_database; (2)内部表 H ...
- 织梦CMS实现多条件筛选功能
用织梦实现筛选的功能,其实主要就是运用到了织梦的高级搜索功能,然后用ajax去post替换掉本来的结果就可以了. 其实筛选的话,主要有两个问题需要解决,一个是前台的筛选实现,一个是后台根据前台的点击, ...
- NSDate
NSDate : NSDate *date = [NSDate date];获取当前日期 NSDate 可以进行比较,通过earlierDate:方法获取二个日期中最早的. NSDate 通过late ...
- android wifi P2P CONNECT, INVITE和JOIN流程选择
android wifi P2P CONNECT, INVITE和JOIN流程选择
- 安装 webpack
安装 webpack看好webpack 对自动压缩和文件名自动md5更名,可解决客户端缓存问题.我的安装环境为 centos linux,root用户 1.安装Node及NPM.到NodeJS官网安装 ...
- Linux内核--网络栈实现分析(五)--传输层之UDP协议(上)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7532512 更多请看专栏, ...
- <2048>游戏问卷调查心得与体会
这是我的首次做问卷调查,刚开始感到不知所措,不知道该怎么去完成它,但是其中也充满了所谓的新鲜感,以前总是填别人做的问卷调查,但是现在是我们小组自己讨论得到的一张属于自己的问卷,可以说感受很深,一张小小 ...
- Windows 下使用git 将代码托管到开源中国-(http://git.oschina.net/)
一.准备工作 当然是准备在windows 下使用需要的环境,和工具. msysgit 下载地址:http://msysgit.github.io/ TortoiseGit 下载地址:https:// ...
- 《C#图解教程》读书笔记之二:存储、类型和变量
本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.类型初窥:掀起你的盖头来 (1)C程序是一组函数和数据类型,C++程序是一组函数和类,而C#程序是一组类型声 ...