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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:阔力梯的树(2020 CCPC Wannafly Winter Camp Day2 Div.1&2 )dsu on tree
下一篇:记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月17日 14时17分01秒