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)树状数组 总结:树状数组是一个查 ...
随机推荐
- [XAF] How to define a business class at runtime or allow end-users to configure its members via the application UI?
How to define a business class at runtime or allow end-users to configure its members via the applic ...
- oracle数据库常用查询
一.数据库信息 1.数据库时间 select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') AS dbtime from dual; 2.主机OS类型 SELEC ...
- 工作当中实际运用(2)——js原生实现全选/反选
老规矩 直接上代码 代码中详细注释: function checkAll(){ var alls=document.getElementById('tab-stp').getElementsByTa ...
- C++混合编程之idlcpp教程Lua篇(6)
上一篇在这 C++混合编程之idlcpp教程Lua篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程LuaTutorial4中加入了四个文件:LuaTutorial4.cpp, Tut ...
- 使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发
概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很 ...
- 高性能网站架构设计之缓存篇(2)- Redis C#客户端
在上一篇中我简单的介绍了如何利用redis自带的客户端连接server并执行命令来操作它,但是如何在我们做的项目或产品中操作这个强大的内存数据库呢?首先我们来了解一下redis的原理吧. 官方文档上是 ...
- FtpDataStream中的隐藏问题
最近在使用FtpWebResponse.GetResponseStream方法时遇上个问题——Stream在未关闭之前就报出了ObjectDisposedException.刚开始十分困惑,因为一直用 ...
- Asp.net web form url route使用总结
asp.net web form 使用URL路由 注不是mvc中的路由 一.前台控件使用路由,通过表达式生成url地址,注意给路由参数赋值,防止使用了其他路由表达式值方式1:<asp:Hyper ...
- 创建widget
1. 定义方法 def predictAll(tickers, startdt='36', enddt = 'today', predictdays = 1): if enddt == 'today' ...
- 【推荐】【给中高级开发者】构建高性能ASP.NET应用的几点建议
本篇目录 早期阶段就要对应用进行负载测试 使用高性能类库 你的应用是CPU密集还是IO密集的 使用基于Task的异步模型,但要慎重 分发缓存和会话(session)状态 创建Web Gardens 巧 ...