POJ2828 Buy Ticket
传送门
题目大意:给一段空序列,每次向序列中某一个位置插入一个数,插入的位置后面所有数相应后移。
这个题比较令人头疼的是后移操作,我们不可能大面积后移。那怎么办呢?后面的人对前面有影响,那我们能不能通过离线方法,使得它变成没有影响的状态?
可以的。我们可以把输入离线,然后倒着插入。这样的话,这个数的pos在哪,他应该对应插入在第pos个空格的位置。注意本题序号从0开始,要加一。
这样就豁然开朗啦!!真是神奇的操作!
看一下代码。
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<cstring> #include<utility> #include<map> #define pr pair<int,int> #define mp make_pair #define fi first #define sc second #define rep(i,a,n) for(int i = a;i <= n;i++) #define per(i,n,a) for(int i = n;i >= a;i--) #define enter putchar('\n') using namespace std; typedef long long ll; const int M = 200005; const int N = 10000005;int read() {int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') op = -1;ch = getchar();}while(ch >='0' && ch <= '9'){ans *= 10;ans += ch - '0';ch = getchar();}return ans * op; }struct node {int id,val; }q[M];int n,sum[M<<2],a[M];void clear() {memset(q,0,sizeof(q));memset(sum,0,sizeof(sum)); }void build(int p,int l,int r) {if(l == r){sum[p] = 1;return;}int mid = (l+r) >> 1;build(p<<1,l,mid),build(p<<1|1,mid+1,r);sum[p] = sum[p<<1] + sum[p<<1|1]; }void modify(int p,int l,int r,int pos,int val) {if(l == r){a[l] = val,sum[p]--;return;}int mid = (l+r) >> 1;if(sum[p<<1] >= pos) modify(p<<1,l,mid,pos,val);else modify(p<<1|1,mid+1,r,pos-sum[p<<1],val);sum[p] = sum[p<<1] + sum[p<<1|1]; }int main() {while(scanf("%d",&n) != EOF){build(1,1,n);rep(i,1,n) q[i].id = read() + 1,q[i].val = read();per(i,n,1) modify(1,1,n,q[i].id,q[i].val);rep(i,1,n) printf("%d ",a[i]);enter;}return 0; }
转载于:https://www.cnblogs.com/captain1/p/9795207.html
POJ2828 Buy Ticket相关推荐
- POJ2828 Buy Tickeys 树状数组+二分 线段树留坑。。。
题意:一堆人排队买票,告诉你一堆人的序号(序号的意思是插在"当前"第几个人的后面)和姓名(姓名用编号代替). 思路:线段树 或 树状数组+二分(自己还不会线段树,所以这里继续留坑) ...
- POJ2828 Buy Tickets【线段树,逆序遍历】
刚开始看到题目,想用memmove偷懒,结果TLE,后来查了查,才发现用memmove也是O(n^2)的复杂度... #include <stdio.h> #include <str ...
- poj-2828 Buy Tickets ***
线段树 //2828 View Code /* * [这段话转的..] * 如果我们从头开始一次做的话,无论是用链表还是数组,肯定会超时(链表寻址时间长,数组移位时间长.). * 所以要用一个快速的方 ...
- 100万人同时抢1万张火车票,极限并发带来的思考
欢迎关注方志朋的博客,回复"666"获面试宝典 每到节假日期间,一二线城市返乡.外出游玩的人们几乎都面临着一个问题:抢火车票!虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场 ...
- “12306” 是如何支撑百万 QPS 的?
点击关注公众号,Java干货及时送达 12306抢票,极限并发带来的思考? 每到节假日期间,一二线城市返乡.外出游玩的人们几乎都面临着一个问题:抢火车票!虽然现在大多数情况下都能订到票,但是放票瞬间即 ...
- 12306架构到底是不是国内最牛逼的架构
12306 抢票,极限并发带来的思考 虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家都深有体会. 尤其是春节期间,大家不仅使用 12306,还会考虑"智行"和其 ...
- 人群场景的属性--Deeply Learned Attributes for Crowded Scene Understandin
Deeply Learned Attributes for Crowded Scene Understanding CVPR2015 http://www.ee.cuhk.edu.hk/~jshao/ ...
- 厉害了,12306 是如何顶住一秒百万流量的?
作者:绘你一世倾 https://juejin.im/post/5d84e21f6fb9a06ac824814 每到节假日期间,一二线城市返乡.外出游玩的人们几乎都面临着一个问题:抢火车票 12306 ...
- 【揭秘】12306是如何抗住几亿日活、百万级高并发的?
[欢迎关注微信公众号:厦门微思网络] 微思网络(官网):https://www.xmws.cn/ 每到节假日期间,一二线城市返乡.外出游玩的人们几乎都面临着一个问题:抢火车票! 虽然现在大多数情况下都 ...
最新文章
- 【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )
- 简单的openssh自动升级脚本
- 根据端口不同来切换站点_根据不同高温气体对窑炉的侵蚀,来选用相应的耐火材料...
- 去哪儿-13-city-vuex
- c语言和c 编程的区别吗,C语言和C有什么区别呀?
- oracle和mysql分组排序取第一条数据
- Bailan4142 二分法求函数的零点【二分法】
- vue string转date_进阶高级前端,这9种Vue技术你掌握了吗?
- Systrace分析app启动分析
- 橡胶柱压缩_橡胶=汽车半条命:浅谈ABAQUS橡胶大变形仿真5大注意事项
- 【NoteBook】莫瑞亚(Ash Maurya):精益创业实战(一、二部分)
- java动漫项目_狂拽酷炫diao炸天的开源动画项目:lottie-android,拿来就用!
- CTF主办方指南之对抗搅屎棍
- memcmp函数使用详解
- 学习——学习能力是最重要的能力
- 随机森林的构建过程(机器学习)
- 数据库中LIMIT和 OFFSET的理解
- Android闪退原因
- C语言 生产者消费者模型
- [免费专栏] Android安全之Android Fragment注入