The 2021 Sichuan Provincial 四川省赛 J - Ants(模拟+技巧)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The 2021 Sichuan Provincial 四川省赛 J - Ants(模拟+技巧)相关的知识,希望对你有一定的参考价值。

LINK

设棍子总长度为 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)

ArcPy批量计算Mean Center的两个实例

Vue2.0 的漫长学习ing-2-7

2018年第十届ACM四川省省赛题解(10 / 11)