The 2021 Sichuan Provincial 四川省赛 J - Ants(模拟+技巧)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The 2021 Sichuan Provincial 四川省赛 J - Ants(模拟+技巧)相关的知识,希望对你有一定的参考价值。
设棍子总长度为 L L L
两只蚂蚁相遇,看作他们彼此穿过不改变方向(结果而已,等同于都改变方向)
那么每只蚂蚁不断向左撞击,然后向右撞击…
所以时间 2 L 2L 2L是一个循环,经过 2 L 2L 2L后所有蚂蚁撞左右分别一次且回到原位
所以前面的 min ( a / n , b / n ) \\min(a/n,b/n) min(a/n,b/n)个循环都是空循环,每次都是一样的(因为装不烂)
接下来一次,障碍物就可能被某只蚂蚁率先撞破了
可能是左可能是右,讨论起来非常麻烦,所以直接模拟
把蚂蚁分成向左的一类,向右的一类
直接考虑是向左的先走到边界还是向右的,每次移动一只蚂蚁来模拟
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
const int inf = 1e9+1;
int A,B,n,a[maxn],f[maxn];
int le[maxn],re[maxn],Le[maxn],Re[maxn];
long long solve()
{
for(int i=1;i<=n;i++)
if( f[i]==0 ) le[++le[0]] = a[i];
for(int i=n;i>=1;i--)
if( f[i]==1 ) re[++re[0]] = a[i];
long long ans = 0;
while( le[0]+re[0] )
{
int zuo = 1, you = 1, temp = 0;
while( zuo<=le[0] || you<=re[0] )
{
if( zuo<=le[0] && ( you>re[0] || le[zuo]<=inf-re[you] ) )//优先左边
{
A--;
if( A>=0 ) Le[++Le[0]] = le[zuo];
temp = le[zuo]; zuo++;
}
else if( you<=re[0] && ( zuo>le[0] || le[zuo]>inf-re[you] ) )
{
B--;
if( B>=0 ) Re[++Re[0]] = re[you];
temp = inf-re[you]; you++;
}
}
ans += temp; le[0] = re[0] = 0;
for(int i=1;i<=Le[0];i++) re[++re[0]] = temp-Le[i];
for(int i=1;i<=Re[0];i++) le[++le[0]] = inf-( temp-(inf-Re[i]) );
Le[0] = Re[0] = 0;
}
return ans;
}
int main()
{
cin >> n >> A >> B;
for(int i=1;i<=n;i++) scanf("%d",&a[i] );
for(int i=1;i<=n;i++) scanf("%d",&f[i] );
sort( a+1,a+1+n );
int mi = min( A/n,B/n );
long long ans = 1ll*mi*2*inf;
A -= mi*n, B -= mi*n;
cout << ans+solve();
}
以上是关于The 2021 Sichuan Provincial 四川省赛 J - Ants(模拟+技巧)的主要内容,如果未能解决你的问题,请参考以下文章
The 2021 Sichuan Provincial 四川省赛 J - Ants(模拟+技巧)
The 2021 Sichuan Provincial 四川省赛 F.Direction Setting(最小费用流)
The 2021 Sichuan Provincial 四川省赛 E.Don‘t Really Like How The Story Ends(贪心dfs)