POJ 2828 Buy Tickets(多校连萌,线段树模拟插入)
2016-03-29 16:09
417 查看
题目地址:http://poj.org/problem?id=2828
题意:给一个队列,第一个数是插在哪个位置上,第二个数这个人的标号,问最后的队列是什么样
思路:用线段树倒着插入即可
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn = 200010;
int pos[maxn],value[maxn],sum[maxn<<2],ans[maxn<<2];
void pushup(int rt)
{
sum[rt] = sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt)
{
sum[rt] = r - l + 1;
if(l == r) return;
int m = (l + r)>>1;
build(lson);
build(rson);
}
void updata(int pos,int value,int l,int r,int rt)
{
if(l == r)
{
ans[rt] = value;
sum[rt]--;
return;
}
int m = (l + r)>>1;
if(pos <= sum[rt<<1]) updata(pos,value,lson);
else updata(pos-sum[rt<<1],value,rson);
pushup(rt);
}
void shuchu(int l,int r,int rt)
{
if(l == r)
{
if(l == 1)
printf("%d",ans[rt]);
else
printf(" %d",ans[rt]);
return;
}
int m = (l + r)>>1;
shuchu(lson);
shuchu(rson);
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
for(int i=0; i<n; i++)
scanf("%d%d",&pos[i],&value[i]);
build(1,n,1);
for(int i=n-1; i>=0; i--)
updata(pos[i]+1,value[i],1,n,1);
shuchu(1,n,1);
printf("\n");
}
return 0;
}
题意:给一个队列,第一个数是插在哪个位置上,第二个数这个人的标号,问最后的队列是什么样
思路:用线段树倒着插入即可
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn = 200010;
int pos[maxn],value[maxn],sum[maxn<<2],ans[maxn<<2];
void pushup(int rt)
{
sum[rt] = sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt)
{
sum[rt] = r - l + 1;
if(l == r) return;
int m = (l + r)>>1;
build(lson);
build(rson);
}
void updata(int pos,int value,int l,int r,int rt)
{
if(l == r)
{
ans[rt] = value;
sum[rt]--;
return;
}
int m = (l + r)>>1;
if(pos <= sum[rt<<1]) updata(pos,value,lson);
else updata(pos-sum[rt<<1],value,rson);
pushup(rt);
}
void shuchu(int l,int r,int rt)
{
if(l == r)
{
if(l == 1)
printf("%d",ans[rt]);
else
printf(" %d",ans[rt]);
return;
}
int m = (l + r)>>1;
shuchu(lson);
shuchu(rson);
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
for(int i=0; i<n; i++)
scanf("%d%d",&pos[i],&value[i]);
build(1,n,1);
for(int i=n-1; i>=0; i--)
updata(pos[i]+1,value[i],1,n,1);
shuchu(1,n,1);
printf("\n");
}
return 0;
}
相关文章推荐
- 清空NSMutableArray所有内容
- Mac系统清理 使用CleanMyMac最简便
- Swift中In-Out类型的参数
- 相机或相册选择图片
- Linux 防火墙 iptables基本操作
- Java学习笔记-eclipse配置
- 什么是 Web API
- junit批量测试
- PHP的Yii框架中View视图的使用进阶
- bzoj 2820 莫比乌斯反演
- interactivePopGestureRecognizer 完美使用
- 判断后边的点是否在前边的区域呢i
- 反射对应泛型参数的调用
- tomcat 部署项目,不加项目名 直接访问
- Java编程提高性能时需注意的地方
- cleanmymac定时清理与垃圾监测
- 【OpenCV】OpenCV输入处理(鼠标事件_键盘事件_滑块事件)
- poj-1837 Balance【dp】
- 修復jquery的tablesorter对加了千分位的数字无法正确排序的bug
- 人工智能3:通过搜索进行问题求解