Educational Codeforces Round 105 (Rated for Div. 2) C. 1D Sokoban
发布日期:2021-06-28 19:59:45
浏览次数:2
分类:技术文章
本文共 1098 字,大约阅读时间需要 3 分钟。
题解:
我们可以得知,人可以往左边推箱子或者往右边推。 所以我们可以把所有负数放在一起,所有正数放在一起,也就是左边一堆,右边一堆。然后开始枚举每一个special positions,假设这个点之前的所有箱子都被推到了这个点和这个点之前连续的几个点,然后查询这一段长度覆盖了几个special positions(用二分查找即可),然后再看看这个点之后,是否有箱子就在special positions上,这两个值加起来,取最大的即可。
这里我是用了multiset来水了一下二分,相同操作也可以二分来操作。
代码:
/*Keep on going Never give up*///#pragma GCC optimize(2)#include//#include //#include //#include //#include //#include //#include //#include #define int long long#define endl '\n'using namespace std;const int maxn=2e5+10;const int mo=1000;//int a[maxn],b[maxn];int last[maxn];int sol(multiset a,vector b){ int n=b.size(); last[n+1]=last[n]=0; for(int i=n-1;i>=0;i--){ if(a.count(b[i])) last[i]=last[i+1]+1; else last[i]=last[i+1]; } int res=last[0]; multiset ::iterator it=a.begin(); int len=0; for(int i=0;i >t; while(t--){ int n,m; cin>>n>>m; vector y,b; multiset x,a; for(int i=0;i >z; if(z<0) x.insert(-z); else a.insert(z); } for(int i=0;i >z; if(z<0) y.push_back(-z); else b.push_back(z); } reverse(y.begin(),y.end()); int ans=0; ans+=sol(x,y); ans+=sol(a,b); cout< <
转载地址:https://blog.csdn.net/xxxxxiao123/article/details/114306585 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月17日 14时17分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
超融合与云计算的区别是什么?
2019-04-29
SuperSocket
2019-04-29
phpstudy 切换版本后apache启动不了
2019-04-29
阿里云服务器系统盘扩容操作
2019-04-29
在windows下使用docker发布web项目
2019-04-29
Vue基础代码学习
2019-04-29
vue的模板的父子组件使用,并且实现数据传递
2019-04-29
vue父访问子组件中的数据方法,使用$refs
2019-04-29
vue中子组件访问父组件中的数据方法,使用$parent或者$root
2019-04-29
vue中的插槽使用slot
2019-04-29
前端模块化工具webpack
2019-04-29
安装vue脚手架不成功的解决方法
2019-04-29
使用visual studio 2019 开发vue项目
2019-04-29
ES6的箭头函数使用
2019-04-29
android studio 新版本打开就版本代码出现的问题解决办法
2019-04-29
android alertdialog的自定义背景设置方法
2019-04-29
简单的Toast类
2019-04-29
android studio 新建文件自动增加文件注释说明
2019-04-29
让activity充满整个屏幕
2019-04-29
alertdialog点击确定对话框不消失的方法
2019-04-29