棋子

 

时间限制: 1.0 秒

空间限制: 512 MB

相关文件: 题目目录

题目描述

棋盘从左到右被分割成 n(n≤1000) 个格子,从左到右编号为1,2,...,n。棋盘上有 m(m≤n) 个棋子,编号为 1,2,...,m ,编号为i的棋子刚开始摆放在编号为 pi 的格子上,一个格子最多摆放一个棋子。每次操作小R可以选择一个棋子,将它移动到它右边第一个空着的格子中,如果它右边没有空着的格子了,那么这就是一个非法操作,执行一次非法操作不会对棋盘有任何改变。小R依次做了k次操作,如果一次操作是合法的,你需要输出这颗棋子移动到的格子的编号,如果是非法的,你需要输出"error!"。

输入格式

从标准输入读入数据。

第一行三个整数 n、m、k ,表示格子数、棋子数和操作数。

第二行 m 个正整数,第 i 个正整数表示 pi ,即第 i 个棋子的初始位置。

第三行 k 个正整数,第 i 个正整数表示 xi ,即第 i 次操作选定的棋子的编号。

输出格式

输出到标准输出。

输出 k 行,第i行表示第i次操作的结果。对于合法操作,输出棋子移动到的位置,对于非法操作,输出一行"error!"。

思路:

1000x10000暴力都能做,然而我看成了10000x10000

写了个超级麻烦的线段树

线段树怎么做呢?

首先,开一颗线段树

每个节点维护他的子树里面的0的个数

我们同时开一个映射数组

ys[i]表示当前编号为i的数在ys[i]这个位置

然后查询ys[i]~n这些位置的第一个0的位置

输出即可

如果一个没有

那就是不合法

合法的话更新线段树和映射数组即可

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<queue>
#include<cstdlib>
#include<algorithm>
#define rs 1024
#define rii register int i
#define rij register int j
using namespace std;
struct tree{
int cnt,val,wz;
}x[];
int n,m,k,ys[];
void mem(int l,int r,int bh)
{
x[bh].cnt=(r-l+);
if(l==r)
{
x[bh].wz=l;
return;
}
int mid=(l+r)/;
mem(l,mid,bh*);
mem(mid+,r,bh*+);
}
void add(int wz,int nl,int nr,int val,int bh)
{
if(nl==wz&&nr==wz)
{
if(val==)
{
x[bh].cnt=;
}
else
{
x[bh].cnt=;
}
return;
}
int mid=(nl+nr)/;
if(wz<=mid)
{
add(wz,nl,mid,val,bh*);
}
else
{
add(wz,mid+,nr,val,bh*+);
}
x[bh].cnt=x[bh*].cnt+x[bh*+].cnt;
}
int query(int l,int r,int nl,int nr,int bh)
{
if(l<nl)
{
l=nl;
}
if(r>nr)
{
r=nr;
}
if(l==nl&&nr==nl)
{
return x[bh].wz;
}
int re=;
int mid=(nl+nr)/;
if(l<=mid)
{
if(x[bh*].cnt!=)
{
re=query(l,r,nl,mid,bh*);
}
}
if(r>mid&&re==)
{
if(x[bh*+].cnt!=)
{
re=query(l,r,mid+,nr,bh*+);
}
}
return re;
}
int main()
{
// freopen("1.in","r",stdin);
scanf("%d%d%d",&n,&m,&k);
mem(,rs,);
for(rii=;i<=m;i++)
{
int val;
scanf("%d",&val);
ys[i]=val;
add(val,,rs,i,);
}
for(rii=;i<=k;i++)
{
int bh;
scanf("%d",&bh);
int wz=ys[bh];
if(wz+>n)
{
puts("error!");
continue;
}
int ltt=query(wz+,n,,rs,);
if(ltt==)
{
puts("error!");
continue;
}
else
{
printf("%d\n",ltt);
}
add(ltt,,rs,bh,);
add(wz,,rs,,);
ys[bh]=ltt;
}
}

最新文章

  1. jquery动画,基础以及我发现的新大陆
  2. 原生JS:Number对象详解
  3. lock与C#多线程
  4. 一些正则验证-JS
  5. 减小Delphi XE5编译出来的程序体积
  6. 创建与删除SQL约束或字段约束
  7. string.Format 里面包含 javascript方法参数的时候 单引号变成双引号的问题解决方法
  8. Socket 死连接详解
  9. java 全角半角转换函数
  10. net开发过程中Bin目录net开发过程中Bin目录下面几种文件
  11. JavaScript中DOM
  12. UOJ#394. 【NOI2018】冒泡排序
  13. 20165237 2017-2018-2 《Java程序设计》第4周学习总结
  14. 过滤函数 filter
  15. Redis 存储数组
  16. SQL Server--疑难杂症之坑爹的Windows故障转移群集
  17. 洛谷 P5206: bzoj 5475: LOJ 2983: [WC2019] 数树
  18. JS 在 IE9 中出现奇怪的错误(参数是必选项 argument not optional)
  19. ubuntu下mongodb启动脚本
  20. eclipse中英文版转换(前提:有中文包)

热门文章

  1. How To Install Cacti On Ubuntu 14
  2. 【转】pscp实现远程文件(夹)传输
  3. linux安装redis+RedisDesktopManager
  4. Spring Cloud中,Eureka常见问题总结
  5. linux系统服务器可能被攻击的几种攻击方式
  6. MySQL案例05:CPU负载优化
  7. 关于cocostudio动态添加控件触摸响应无效的学习
  8. December 06th 2016 Week 50th Tuesday
  9. Eclipse和JDK的安装配置
  10. PostgreSQL 连接的问题