bzoj2648 SJY摆棋子

2023-11-07 20:18
文章标签 棋子 bzoj2648 sjy

本文主要是介绍bzoj2648 SJY摆棋子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description
这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是
曼哈顿距离 即(|x1-x2|+|y1-y2|)
。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的距离。同一个格子可能有多个棋子。 Input 第一行两个数 N M 以后M行,每行3个数 t x y 如果t=1 那么放下一个黑色棋子 如果t=2 那么放下一个白色棋子
Output 对于每个T=2 输出一个最小距离

kdtree,插入直接暴力。经试验替罪羊的效率不高。
UPD:是我写替罪羊的姿势不对。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define R(k) for (int k=0;k<2;k++)
const int oo=0x3f3f3f3f,lim=100000;
int D,n,m,ans,root,lson[1000010],rson[1000010],mn[1000010][2],mx[1000010][2],tot;
int rd()
{int x=0;char c=getchar();while (c<'0'||c>'9') c=getchar();while (c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x;
}
struct point
{int x[2];bool operator < (const point &pp) const{return x[D]<pp.x[D];}
}a[1000010],tem;
void up(int u,int v)
{if (!v) return;R(k){mn[u][k]=min(mn[u][k],mn[v][k]);mx[u][k]=max(mx[u][k],mx[v][k]);}
}
int build(int l,int r,int d)
{if (l>r) return 0;D=d;int mid=(l+r)/2;nth_element(a+l,a+mid,a+r+1);R(k) mn[mid][k]=mx[mid][k]=a[mid].x[k];up(mid,lson[mid]=build(l,mid-1,d^1));up(mid,rson[mid]=build(mid+1,r,d^1));return mid;
}
void ins(int u,int d)
{D=d;if (tem<a[u]){if (lson[u]) ins(lson[u],d^1);else{lson[u]=++tot;a[tot]=tem;R(k) mn[tot][k]=mx[tot][k]=tem.x[k];lson[tot]=rson[tot]=0;}up(u,lson[u]);}else{if (rson[u]) ins(rson[u],d^1);else{rson[u]=++tot;a[tot]=tem;R(k) mn[tot][k]=mx[tot][k]=tem.x[k];lson[tot]=rson[tot]=0;}up(u,rson[u]);}
}
int dis(int u)
{if (!u) return oo;int ret=0;R(k) ret+=abs(a[u].x[k]-tem.x[k]);return ret;
}
int mndis(int u)
{if (!u) return oo;int ret=0;R(k){if (tem.x[k]<mn[u][k]) ret+=mn[u][k]-tem.x[k];if (tem.x[k]>mx[u][k]) ret+=tem.x[k]-mx[u][k];}return ret;
}
void qry(int u)
{int mnl,mnr;ans=min(ans,dis(u));mnl=mndis(lson[u]);mnr=mndis(rson[u]);if (mnl<mnr){if (mnl<ans) qry(lson[u]);if (mnr<ans) qry(rson[u]);}else{if (mnr<ans) qry(rson[u]);if (mnl<ans) qry(lson[u]);}
}
int main()
{int i,opt,clo=0;n=rd();m=rd();for (i=1;i<=n;i++)R(k) a[i].x[k]=rd();root=build(1,n,0);tot=n;while (m--){opt=rd();R(k) tem.x[k]=rd();if (opt==1){ins(root,0);/*if (++clo>lim){root=build(1,tot,0);clo=0;}*/}else{ans=oo;qry(root);printf("%d\n",ans);}}
}

这篇关于bzoj2648 SJY摆棋子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366038

相关文章

【自撰写,国际象棋入门】第1课、棋盘和棋子

第1课 棋盘和棋子 一、国际象棋的棋盘 国际象棋的棋盘为一8乘8的黑、白格相间的棋盘,8条竖线的编号分别为A-H,8条横线的编号分别为1-8,在记谱时用竖线编号+横线编号的方式表示棋盘上的格子,例如a1格、h8格等.棋盘上有几条重要的大斜线(大黑斜线:a8-h1,大白斜线:a1-h8)。常见的国际象棋棋盘如下图所示: 二、国际象棋的棋子 国际象棋中共有6种棋子,分别为: 中文名称 英

【算法】MT2 棋子翻转

✨题目链接: MT2 棋子翻转 ✨题目描述  在 4x4 的棋盘上摆满了黑白棋子,黑白两色棋子的位置和数目随机,其中0代表白色,1代表黑色;左上角坐标为 (1,1) ,右下角坐标为 (4,4) 。 现在依次有一些翻转操作,要对以给定翻转坐标(x,y)(也即第x行第y列)为中心的上下左右四个棋子的颜色进行翻转。 给定两个数组 A 和 f ,分别代表 初始棋盘 和 哪些要进行翻转的位

黑白棋子的移动

Problem Description 有2n个棋子(20≥n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形:○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:○●○●○●○●○

KD_Tree 【bzoj2648 bzoj2716】SJY摆棋子 [voilet 3] 天使玩偶

题目大意: 维护一堆点,支持插入一个点和查询距离一个给定的点的曼哈顿距离最近的点。 题目分析:(KD_Tree) 据说还可以用CDQ分治做,但是因为要分四个象限讨论,很麻烦的说呀QAQ 我这种萌萌哒蒟蒻自然去学KDT啦~(>▽<)~ KD_Tree 主要应用于解决多维空间内一堆点的问题。 这道题只要正常建树并且插入就可以了。 查询的时候相当于爆搜+剪枝,每搜到一个点都写给两个儿子写一

Java程序设计:五子棋(二)——添加棋子

如何添加棋子 我们平时也在不同平台上玩过类似的棋盘游戏,一般的棋盘游戏的玩法都是在你想下的位置点一下,系统就会在你点的位置下一个棋子。五子棋的棋盘很规则,都是一个个正方形格子,点一个位置便会在那附近的格子角下一颗棋子。 那么怎么判断是哪个角呢?一般简单的定义一下就能解决。以一个格子为例,假设点在这个格子中,位置为(x,y),而这个格子的某个顶点位置已知(一般是左上角),比如左上角位置为(a,b

Windows Phone开发(3):棋子未动,先观全局

在进行WP开发之前,与其它开发技术一样,我们需要简单了解一个WP应用序的生命周期,我们不一定要深入了解,但至少要知道在应用程序生命周期内的每一阶段,我们应当做什么,不推荐哪些操作等,这也是为了让我们开发出更高性能,更优秀的应用程序打下坚实的基础。 下图是官方给出的WP应用程序执行模型图。 在上图中,我们要注意以下四个事件: 1、Launching 事件。 说白了,就是应用程

【教学类-09-04】20240102《游戏棋N*N》数字填写,制作棋子和骰子

作品展示 背景需求:        最近在清理学具材料库,找到一套1年多前的《N*N游戏棋》,把没有用完的棋盘拿出来,,给大4班孩子换花样,并把它们用掉。 程序代码在这里 【教学类-09-03】20221120《游戏棋10*10数字如何直接导入Word》(大班主题《动物花花衣》)_wond怎么插入 点子图怎么表示10×10-CSDN博客文章浏览阅读487次。【教学类-09-03

人机大战:李世石是否成为人工智能棋子

文章讲的是 人机大战:李世石是否成为人工智能棋子, 近两天站上热搜的不是撩妹技能满分的热血韩剧,也不是尔虞我诈的商界奇谈,而是一场看起来火药味十足,却找不到对手的人机大战。 对弈现场   经过三个多小时的鏖战,李世石执黑186手中盘负谷歌AlphaGo。   在本次开局阶段,双方开局就显得很特别。可能因为对手是机器人的原因,李世石开始的打法就选择了不常规的走法。在开局阶段,AlphaGo成功获得

扭转战局的棋子 安卓4.4 ART模式实测解析

1传统的Dalvik虚拟机     2013年11月1日,谷歌继续低调发布了Android 4.4和Nexus 5,Android 4.4作为最新的系统版本更换代号为KitKat,但人们发现这个版本的系统似乎只是在一些小环节进行了改动,事实上系统代号由Jellybean更换为KitKat肯定不止扁平化那么简单,如果深度试用了Android 4.4的用户一定会发现它多了一个ART模式,而A

算法:棋子移动问题

问题: 设有2n+2个排成一排的格子,最左边两个格子是空的,其后的格子一次放入A子和B子: 现规定移动规则如下:每次可将任意两个相邻的棋子移入空格,移动时两子的左右顺序不得变动,试按此规则以最少的步骤将n个A子移动到一起,n个B子移动到一起,空格的位置可任意。 实现思路 实现代码 public class SortAB{public static void main(String a