code#5 P2 棋子
棋子
时间限制: 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;
}
}
code#5 P2 棋子的更多相关文章
- 2021.5.23 noip模拟2(排序|划艇|放棋子)
今天比昨天更惨,惨炸了 看到T1不会,跳!!! T2不会,再跳!!!! T3不会,后面没题了:::: 无奈无奈,重新看T1,然鹅时间已经过去了一个小时 然而我一想不出题来就抱着水瓶子喝水,然后跑厕所, ...
- [Exception JavaWeb 1] - Cause: com.microsoft.sqlserver.jdbc.SQLServerException: '@P2' 附近有语法错误。
严重: Servlet.service() for servlet [springMVC] in context with path [/ExceptionManageSystem] threw ex ...
- C# Distinct方法的使用笔记
引自:http://blog.csdn.net/shaopengfei/article/details/36426763 从C# 3.0开始提供了Distinct方法,这对于集合的使用有了更为丰富的方 ...
- JS-Promise笔记
转自:http://www.runoob.com/w3cnote/javascript-promise-object.html ECMAscript 6 原生提供了 Promise 对象. Promi ...
- [LeetCode] 196. Delete Duplicate Emails_Easy tag: SQL
Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique ...
- Python 類和對象 Class vs Object
類別定義 class 類別名: 例如: >>> class Point:... x = 0.0... y = 0.0 1. 宣告 >>> p1 = ...
- HackerRank Week of Code 26
好像这次week of code不是很难= = A int main(){ int n; int m; cin >> n >> m; cout<<(n+)/*)/) ...
- 【BZOJ-2668】交换棋子 最小费用最大流
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1055 Solved: 388[Submit][Status ...
- some code of c
// // main.c // LineList // // Created by Rubert on 16/9/11. // Copyright © 2016年 Study. All rights ...
随机推荐
- toLocaleTimeString()方法在IE和谷歌浏览器上 根据本地时间格式,把 Date 对象的时间部分(不含日期)转换为“时间字符串”存在区别
这两天修改一个bug,发现一个问题: toLocaleTimeString()方法在IE和谷歌浏览器上 根据本地时间格式,把 Date 对象的时间部分(不含日期)转换为“时间字符串”存在区别.方法原 ...
- mac ASP.NET5
不写1行代码,在Mac上体验ASP.NET 5的最简单方法 昨天微软发布了ASP.NET 5 beta2(详见ASP.NET 5 Beta2 发布),对ASP.NET 5的好奇心又被激发了. 今天 ...
- 如此繁荣的移动webapp开发市场:总结当下的一些移动web开发套件
写在前面: 因为移动市场的盛行带动了移动社交.移动购物.手游.智能化硬件等多个新兴领域.智能终端硬件水平越来越高,运行其上的web浏览器能力也越来越强,加上HTML5\JS\CSS的蓬勃发展,Web已 ...
- ThreadState属性
这个属性代表了线程运行时状态,在不同的情况下有不同的值,我们有时候可以通过对该值的判断来设计程序流程. ThreadState 属性的取值如下: Aborted:线程已停止: AbortRequest ...
- Mysql常用函数汇总-经典实用
以下是对mysql中的常用函数进行了汇总介绍.需要的朋友可以过来参考下. 一.数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x ...
- Linux NFS 详解
目录: 1.了解NFS服务 2.NFS主要文件 3.NFS安装 4.NFS配置 5.NFS客户端配置 6.固定NFS端口 7.Windows挂 ...
- strncpy()函数【转】
C/C++中的strncpy()函数功能为将第source串的前n个字符拷贝到destination串,原型为: char * strncpy ( char * destination, const ...
- 沉淀再出发:jvm的本质
沉淀再出发:jvm的本质 一.前言 关于jvm,使用的地方实在是太多了,从字面意思上我们都能明白这也是一个虚拟机,那么其他的虚拟机都会用来运行别的操作系统的,而jvm却是实现了可以在不用的操作系统之上 ...
- ZT Android4.2关于bluetooth在HAL层的分析(1)
我的电子杂烩饭 http://blog.sina.com.cn/wuchuchu2012 [订阅][手机订阅] 首页 博文目录 图片 关于我 正文 字体大小:大 中 小 Android4.2关于blu ...
- 020.2.2 runtime类
基本不用,简单看一下就行了 1.属于单例的一个实例,可以通过getRuntime()获取对象Runtime r = Runtime.getRuntime();r.exec("winmine. ...