51Nod 1530 稳定方块

瓦西亚和皮台亚摆放了m个方块。方块被编号为0到m-1(每个号码出现恰好一次)。现在建立一个座标系OX表示地面,OY的方向是竖直向上的。每一方块的左下角有一个座标而且是整点座标。
摆放好的方块一定要是稳定的。稳定的含意是每一个不在地面上的方块在他的下面至少有一个方块与他相接触。可以是共边,也可以是共点的。也就是说如果方块座标为(x,y),要么y=0,或者存在一个方块的座标为(x-1,y-1)或者 (x,y-1) 或者 (x+1,y-1)。
现在瓦西亚和皮台亚要轮流把这些方块一个个拆下来。按照拆下来的顺序从左到右摆成一行,那么方块上面的编号就会组成一个m进制的数字。
拆的过程中,要始终保持剩下的方块稳定。瓦西亚想要最终的数字尽可能大,而皮台亚想要尽可能小,瓦西亚先开始拆。
请帮助计算一下最终形成的数字是多少,结果比较大,输出对 109+9 取余后的结果。

解题报告:
用时:1h10min,1WA1TLE
一开始认为就是开优先队列跑拓扑排序,后来发现度不为0也可以入队,所以只拿了60,然后我想到了正确贪心:
对于瓦西亚的从后往前枚举,直到出现第一个能消除的,皮台亚的同理.
然后打了这个贪心的暴力验证一下,发现是对的,考虑优化:
我们把所有可以消除的点丢入优先队列中,然后每次取出编号最小的,我们需要维护一个\(res[i]\),表示\(i\)最下面还有几个没有消除的点,然后我们检查一个点不合法我们就判断其上面的点是否\(res[i]<=1\),注意每消除一个点就要去更新上面点的\(res\)值,并且如果\(res[i]<=1\)时还要check他上方的点的下方的三个点是否会不合法,这样一个点最多入队三次,均摊复杂度\(O(nlogn)\)

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <cstdio>
#include <vector>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=1e5+5,inf=1e9+5,mod=1e9+9;
int n;bool vis[N];
struct node{int x,y,id;bool operator <(const node &pp)const{if(y!=pp.y)return y<pp.y;return x<pp.x;}
}a[N];
struct comp{bool operator ()(int &i,int &j)const{return i>j;}
};
priority_queue<int>q;
priority_queue<int,vector<int>,comp>qm;
vector<int>s[N];
int b[N],m=0,num=0,head[N],to[N*3],nxt[N*3],du[N],re[N];
void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
bool check(int x){if(vis[x])return false;for(int i=head[x];i;i=nxt[i]){if(!vis[to[i]] && du[to[i]]<=1)return false;}return true;
}
bool ca[N];
void solve(){bool t=0;int x;for(int i=1;i<=n;i++){if(!t){while(!q.empty()){if(!ca[q.top()])q.pop();else break;}x=q.top();q.pop();}else{while(!qm.empty()){if(!ca[qm.top()])qm.pop();else break;}x=qm.top();qm.pop();}vis[x]=true;ca[x]=false;for(int k=0,sz=s[x].size(),u;k<sz;k++){u=s[x][k];if(check(u))ca[u]=true,qm.push(u);q.push(u);}for(int j=head[x];j;j=nxt[j]){du[to[j]]--;for(int k=0,sz=s[to[j]].size(),u;k<sz;k++){u=s[to[j]][k];if(!check(u))ca[u]=false;else{ca[u]=true;qm.push(u);q.push(u);}}}re[i]=x-1;t^=1;}ll ans=0,mul=1;for(int i=n;i>=1;i--){ans+=mul*re[i];ans%=mod;mul*=n;mul%=mod;}printf("%lld\n",ans);
}
void work()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&a[i].x,&a[i].y);a[i].id=i;}sort(a+1,a+n+1);for(int i=1;i<=n;i++)b[++m]=a[i].y;int sta;for(int i=1;i<=n;i++){sta=lower_bound(b+1,b+m+1,a[i].y-1)-b;for(int j=sta;j<i;j++){if(a[j].y!=a[i].y-1)break;if(abs(a[j].x-a[i].x)<=1){link(a[j].id,a[i].id);du[a[i].id]++;s[a[i].id].push_back(a[j].id);}}}for(int i=1;i<=n;i++){if(check(i))q.push(i),qm.push(i),ca[i]=true;}solve();
}int main()
{work();return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/7524081.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言、嵌入式中几个非常实用的宏技巧

宏打印函数 在我们的嵌入式开发中&#xff0c;使用printf打印一些信息是一种常用的调试手段。但是&#xff0c;在打印的信息量比较多的时候&#xff0c;就比较难知道哪些信息在哪个函数里进行打印。特别是对于异常情况的打印&#xff0c;我们需要快速定位到异常情况的位置。这时…

canvas 多次画图效果_canvas练习之终极的奔跑小人

这次做一个终极的练习&#xff0c;先看一下最后的效果。一个不停奔跑的小人&#xff0c;点击鼠标后会让他跑到目的地&#xff0c;并且呈现不同的角度。下面来看一下如何一步步来实现它的。准备网上下载了一张图片&#xff0c;其中包含了小人面向不同角度奔跑的各个分解动作。新…

loadrunner11安装,提示少了Microsoft Visual c++2005 sp1运行时组件解决办法

解决方法&#xff1a;1、进入loadrunner-11\Additional Components\IDE Add-Ins\MS Visual Studio .NET2、安装&#xff1a;LRVS2005IDEAddInSetup.exe3、再安装loadrunner破解方法&#xff1a;1、把loadrunner相关程序全部退出&#xff1b;2、把lm70.dll、mlr5lprg.dll放到安装…

C语言的爱你永不悔

#前言今天是520节&#xff0c;昨天晚上睡觉的时候&#xff0c;我家地瓜一直说520,520&#xff0c;我不知道要干啥&#xff0c;我就说&#xff0c;要睡就睡&#xff0c;不睡就起来。今天我看了朋友圈&#xff0c;我才知道原来520就是「我爱你」的意思。今天在朋友圈看到的一个小…

服务网关zuul之二:过滤器--请求过滤执行过程(源码分析)

Zuul的核心是一系列的过滤器&#xff0c;这些过滤器可以完成以下功能&#xff1a; 身份认证与安全&#xff1a;识别每个资源的验证要求&#xff0c;并拒绝那些与要求不符的请求。审查与监控&#xff1a;在边缘位置追踪有意义的数据和统计结果&#xff0c;从而带来精确的生成视图…

l4 l7 代理_什么是四层(L4 proxy)和七层负载均衡(L7 proxy)?区别是什么? 翻译自Nginx官网...

阅读前的小说明&#xff1a;由于工作需要&#xff0c;本人正在研究微服务架构。而微服务的服务网格( Service Mesh )架构中&#xff0c;需要选择一种 proxy 作为每个微服务之间通讯的代理。因此为了定夺微服务中常用的两种代理&#xff0c;即&#xff1a; Nginx 和 Envoy 如何选…

Linux 下的0 1 2特殊文件描述符~

最近在做项目的时候遇到的几个知识点&#xff0c;我觉得非常有意思&#xff0c;以前学Linux的时候也有接触到管道方面的&#xff0c;但是在应用中却基本没有遇到过。还有Linux下的几个特殊的文件描述符&#xff0c;用这几个文件描述符可以做很多事情&#xff0c;能做什么事情决…

攻防比赛_2020年度泉州市大学生网络安全攻防比赛在黎明职业大学圆满落幕

10月16日下午&#xff0c;作为2020年国家网络安全宣传周泉州市系列活动之一&#xff0c;“泉州市大学生网络安全攻防比赛”在黎明职业大学智慧教学中心成功举办并圆满落幕。此次比赛由泉州市互联网信息办公室、泉州市教育局主办&#xff0c;黎明职业大学和泉州市网络与信息安全…

17-9--18:了解Linux的命令格式,今天复习的已知命令和新命令

熟悉的命令&#xff1a; cp -r 需要复制的文件夹 复制文件夹到指定文件夹 复制文件夹到文件夹、复制文件到文件夹 cat 需要复制的文件 > > 复制到指定文件 复…

gitlab 如何关闭force push

把不允许force push的分支设置成保护分支&#xff0c;Push的时候就会提示不能force psuh。

camera中文版软件 ip_ip camera网络摄像机

IP Camera Viewer是一个方便可靠能够通过IP地址监控多台摄像头的软件。 需要的朋友们赶紧下载试试吧&#xff01;你可以在几分钟之内设置一个免费的IP摄像监控系统&#xff0c; 保持在家里&#xff0c;办公室&#xff0c;停车场或任何地方&#xff0c;你都可以监控。同时查看多…

Ubuntu16.04通过GPT挂载硬盘

一般而言&#xff0c;服务器上挂载的硬盘都是比较大的&#xff0c;传统的对硬盘进行分区需要在终端敲sudo fdisk进行操作&#xff0c;但是&#xff0c; 当挂载的硬盘的容量大于2T的时候&#xff0c;是无法通过sudo fdisk进行挂载的&#xff0c;这个时候必须要进行GPT进行挂载&a…

Mplayer后台播放没有声音

昨天的文章&#xff0c;我觉得虽然不是很复杂&#xff0c;但是我自认为很多人应该是不懂的&#xff0c;不过好像阅读量不是很好&#xff0c;今天转发我师弟的一篇文章&#xff0c;我觉得这个也是大家没有注意到的。Linux 下的0 1 2特殊文件描述符~一、平台Ubuntu16.04(64位)二、…

python输出程序运行时间_叨叨 Python 性能优化工具

虽然Python是一个”慢慢的“语言&#xff0c;但是不代表我们对性能没有任何的追求&#xff0c;在程序运行过程中&#xff0c;如果发现程序运行时间太长或者内存占用过大&#xff0c;免不了需要对程序的执行过程进行一些监测&#xff0c;找到有问题的地方&#xff0c;进行优化。…

链接学习之obj文件探索

Windows的gcc环境&#xff0c;往官网http://sourceforge.net/project/showfiles.php?group_id2435 下载MinGW&#xff0c;安装&#xff0c;安装完毕后按照包 配置环境变量 a.在PATH的值中加入"C:\Program Files\MinGWStudio\MinGW\bin"。这是寻找gcc编译器的路径。…

跳槽并不能解决问题

周末了&#xff0c;聊点和离职相关的事情&#xff0c;上周应该有不下5个人跟我谈到跳槽离职的事&#xff0c;每个人的情况都有点不同&#xff0c;每个人我都认真给了回复&#xff0c;总结一下&#xff0c;希望大家对自己的职场有比较明确的规划&#xff0c;跳槽肯定是为了涨薪水…

http 请求默认时间_JMeter接口测试之HTTP请求默认值

不管是在UI级别的自动化测试还是在接口级别的自动化测试中&#xff0c;对公共数据数据的分离都是一种趋势&#xff0c;或者某种程度来说&#xff0c;这是自动化测试中必须要掌握的一种能力&#xff0c;是基本技能。这些公共数据就包含了测试地址&#xff0c;以及登录的账号密码…

【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP

【BZOJ1880】[Sdoi2009]Elaxia的路线 Description 最近&#xff0c;Elaxia和w**的关系特别好&#xff0c;他们很想整天在一起&#xff0c;但是大学的学习太紧张了&#xff0c;他们 必须合理地安排两个人在一起的时间。Elaxia和w**每天都要奔波于宿舍和实验室之间&#xff0c;他…

有意思的select~

前言最近在写一个小程序&#xff0c;也就是简单的系统调用&#xff0c;但是神奇的是&#xff0c;我用的这个系统调用刚好就阻塞了。如果你也写过应用程序&#xff0c;肯定也会遇到过这样的问题。后来&#xff0c;发现了select这个好东西&#xff0c;可以用来监听文件描述。sele…

cesium 页面截图_Cesium开发入门篇 | 02开发环境搭建及第一个示例

开发环境准备利用Cesium API进行二次开发属于Web前端开发范畴&#xff0c;目前比较火的Web三剑客包括React、Vue、AngularJS&#xff0c;每个js库的详细介绍可转至官网查看&#xff0c;在此不做详细介绍。本次开发环境是基于Vue搭建的&#xff0c;需要安装(部署)的软件主要包括…