torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

Codeforces #178, A : Shaass and Oskols

概要

N 本の平行な電線の上に、何羽かの鳥が留まっている。
いずれかの鳥を撃つと、同じ電線で、撃たれた鳥より左の鳥は上の電線に、右の鳥は下の電線に移る。
行き先の電線が存在しない場合はどこかに飛び去ってしまう。

初期状態でそれぞれの電線に留まっている鳥の数と、撃つ鳥の情報が与えられる。
全て撃ち終わったあとに各電線に何羽の鳥が留まっているかを出力せよ。

解法

そのままシミュレーションをすれば解くことができます。

コード

typedef vector<int> VI;

#define REP( i, m, n ) for ( int i = (int)( m ); i < (int)( n ); ++i )
#define FOR( v, c ) for ( auto &v : c )

int main()
{
	cin.tie( 0 );
	ios::sync_with_stdio( false );

	int n;
	cin >> n;

	VI as( n );
	FOR( a, as )
	{
		cin >> a;
	}

	int m;
	cin >> m;

	REP( t, 0, m )
	{
		int wire, pos;
		cin >> wire >> pos;
		wire--;

		if ( wire )
		{
			as[ wire - 1 ] += pos - 1;
		}
		if ( wire + 1 < n )
		{
			as[ wire + 1 ] += as[ wire ] - pos;
		}
		as[ wire ] = 0;
	}

	FOR( a, as )
	{
		cout << a << endl;
	}

	return 0;
}