这题开始的思路就是模拟:就像数组中插点一样,每一个想买票的人都想往前插队!
但是这样的话肯定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. uva 11174 Stand in a Line

    // uva 11174 Stand in a Line // // 题目大意: // // 村子有n个村民,有多少种方法,使村民排成一条线 // 使得没有人站在他父亲的前面. // // 解题思路: ...

  2. 在c#中使用bitblt显示图片

    使用bitblt比DrawImage有更好的性能 using AForge.Video.DirectShow; using System; using System.Collections.Gener ...

  3. 转 powerdesigner12.5在64位JDK下连接mysql数据库问题

    前因:由于项目在研发的过程中,数据库字段需要不停的增加和修改,导致最初设计的数据库原型无法使用,后来就想到用powerdesinger来反转数据库表结构. 环境:win7 64位系统,本机装有64位j ...

  4. 读取Excel文件

    绝对路径String filepath= "E:\\a.xls"; public static String getExcelData(File file,String lang, ...

  5. 用canvas制作酷炫射击游戏--part2

    今天这一部分主要讲游戏的实现原理与游戏循环的代码实现. 先说原理,大家都看过动画吧.在我看来,游戏就是玩家能人为控制动画剧情发展方向的动画.所以,我们的游戏引擎其实说白了就是个动画引擎再加上鼠标事件. ...

  6. [poi2007] biu

    题意:给定一个图,点n<=105,边m<=106,现在求它的补图有多少个联通分量.. 思路:很容易想到并查集,但是补图边太多了.. 于是只能优化掉一些多余的边.. 具体做法是用队列优化.. ...

  7. 解剖SQLSERVER 第三篇 数据类型的实现(译)

    解剖SQLSERVER 第三篇  数据类型的实现(译) http://improve.dk/implementing-data-types-in-orcamdf/ 实现对SQLSERVER数据类型的解 ...

  8. 基于资源的权限系统-API设计

    概述 权限系统需要和别的系统集成,因此,良好的API是易用性的保证. 这里只设计一些权限相关的核心 API,关于用户,组织,导入导出之类的后续再逐步补充 API 设计 围绕权限有以下 4 类 API: ...

  9. 分享一个漂亮WPF界面框架创作过程及其源码

    本文会作为一个系列,分为以下部分来介绍: (1)见识一下这个界面框架: (2)界面框架如何进行开发: (3)辅助开发支持:Demo.模板.VsPackage制作. 框架源码如下所示. 本文介绍第(1) ...

  10. seajs 源码阅读笔记

    代码概览 src目录文件列表如下: 代码以模块化的方式来组织,构建的时候会合并为一个js文件(sea.js 或 sea-debug.js),其中,intro.js和 outro.js 分别是这个js文 ...