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)树状数组 总结:树状数组是一个查 ...
随机推荐
- player.swf播放flv方式
<embed src="../images/player.swf" allowFullScreen="true" quality="high&q ...
- DFS security warning and use group policy to set up internet security zones
Opening a file from a DFS domain share shows a security warning while openning from the server share ...
- js实现xml转化成字符串
xml字符串转xml dom经常遇到在js里面需要解析xml的问题,然而有时候,后台返回的不是dom 而是string 字符串,需要将字符串转换成dom对象,然后才可以进行节点值解析和读取functi ...
- 在WPF的WebBrowser控件中屏蔽脚本错误的提示
在WPF中使用WebBrowser控件显示网页时,经常会报脚本错误的提示,如何屏蔽掉这些错误提示呢.方法是定义如下方法: public void SuppressScriptErrors(WebBro ...
- css长度值与颜色值
颜色值 在网页中的颜色设置是非常重要的,有字体颜色,背景颜色,边框颜色等,设置颜色的方法也有很多种: 1.英文命令颜色 p{color:red;} 2.rgb颜色 p{color:rgb(133,45 ...
- slot游戏中的数学概念
最近研究slot 算法,看了大量的英文资料,因为母语中文,一直使用中文的英文小白来说,好心塞,悔不当初没学好英文. 下文是从众多的英文中摘录的唯一能够看明白的概念.先给自己留着,到时候深入研究可以看 ...
- PyCharm 3.0 发布,提供免费开源版本
PyCharm 发布最新的 3.0 版本,该版本新特性详见: http://www.jetbrains.com/pycharm/whatsnew/index.html 该版本最主要的是提供了免费开源的 ...
- PostgreSQL基础整理(二)
存储过程 实现功能:针对工资表30岁以下,工资提升10% 30至40提升20% 40以上提升30% + 奖金(入参)返回平均薪酬 创建表: DROP TABLE emps; CREATE TABLE ...
- 用Python编写博客导出工具
用Python编写博客导出工具 罗朝辉 (http://kesalin.github.io/) CC 许可,转载请注明出处 写在前面的话 我在 github 上用 octopress 搭建了个人博 ...
- 《OOC》笔记(4)——自动化地将C#代码转化为C代码(结构版)
<OOC>笔记(4)——自动化地将C#代码转化为C代码(结构版) 我在<C表达面向对象语言的机制——C#版>中已经说明了从C#到C的转换方法.这次看<OOC>也是想 ...