目次
コードフォース 7/16 Div.2
A. ヴィカとその仲間たち
トピック
ヴィカと彼女の友達はショッピングモールに買い物に行きました。ショッピングモールは、一辺の長さが nn と mm である部屋の長方形のグリッドとして表すことができます。各部屋の座標は (a,b)(a,b) です。ここで、1≤a≤n,1≤b≤m1≤a≤n,1≤b≤m です。したがって、|a−c|+|b−d|=1|a−c|+|b−d|=1 の場合、座標 (c,d)(c,d) を持つホールを隣接ホールと呼びます。
空虚なファッションの話にうんざりしたヴィカは、誰にも気づかれないようにこっそり立ち去ることにした。しかし、彼女はまだどのお店にも行く機会がないので、ショッピングモールから出たくありません。しばらくして、彼女の友人たちはヴィカの失踪に気づき、彼女を探し始めました。
現在、Vika は座標 (x,y)(x,y) の部屋にいます。彼女の kk の友達は座標 (x1,y1)(x1,y1), (x2,y2)(x2,y2) の部屋にいます。 , ... ,(xk,yk),(xk,yk)。座標は一致する可能性があります。女の子全員が隣の部屋に移動しなければならないことに注意してください。
毎分、最初にヴィカは自分が選んだ隣の部屋の 1 つに移動し、次に各友人も (ヴィカの選択を見て) 隣接する部屋の 1 つを選択して移動します。
最後の瞬間に(つまり、すべての女の子が隣の部屋に移動した後)、少なくとも1人の友人がヴィカと同じ部屋にいる場合、彼女は捕らえられ、他の友人全員が呼び出されます。
教えてください、ヴィカは迷惑な友達から永遠に逃げることができるのでしょうか、それともしばらく時間が経っても空虚なファッショントークを聞き続けなければならないのでしょうか?
入力
各テストは複数のテスト ケースで構成されます。最初の行には、テスト ケースの数を表す単一の整数 tt (1≤t≤1001≤t≤100) が含まれています。テストケースについては以下で説明します。
各テスト ケースの最初の行には、3 つの整数 nn、mm、kk (1≤n,m,k≤1001≤n,m,k≤100) が含まれており、これはモールのサイズと Vika の友人の数です。
各テスト ケースの 2 行目には、整数 xx と yy (1≤x≤n1≤x≤n、1≤y≤m1≤y≤m) のペアが含まれています。これは、Vika がいる部屋の座標です。
各テスト ケースの次の kk 行には、整数 xixi と yiyi (1≤xi≤n1≤xi≤n、1≤yi≤m1≤yi≤m) のペアが含まれます。これは、ii 番目の部屋の座標です。友人は。
出力
各テスト ケースについて、Vika が友達から永久に逃げられる場合は「YES」を出力し、そうでない場合は「NO」を出力します。
各文字は大文字でも小文字でも出力できます。たとえば、文字列「yEs」、「yes」、「Yes」、「YES」は肯定的な回答として受け入れられます。
例
入力
6
2 2 1
1 1
1 2
2 2 2
1 1
2 2
2 2
1 2 1
1 1
1 2
5 5 4
3 3
1 1
1 5
5 1
5 5
2 2 2
1 1
2 1
1 2
3 4 1
1 2
3 3
出力
YES
NO
YES
NO
YES
YES
注記
最初のテスト ケースでは、Vika はいつでも友人がいる部屋の斜め向かいの部屋に移動できるため、友人が Vika に追いつくことはありません。
2 番目のテスト ケースでは、ヴィカがどこに行っても、最初の動きの後に友人が彼女を捕まえることができます。
3 番目のテスト ケースでは、Vika とその友人は常に別のホールにいます。
解析する
行列の指定された範囲内で、友人が vika を捕まえることができる限り、出力は NO、そうでない場合、出力は YES です。ここでは、vika とすべての友人の間のマンハッタン距離が偶数であるかどうかを判断するだけです。は偶数なので捕まえることができます。
ACコード:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m,k,x,y,a,b,flag=0;
cin>>n>>m>>k;
cin>>x>>y;
for(int i=0;i<k;i++)
{
cin>>a>>b;
if((abs(x-a)+abs(y-b))%2==0)
flag=1;
}
if(flag)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}
B. ヴィカと橋
トピック
夏には、ヴィカは田舎の家を訪れるのが好きです。快適なブランコ、自転車、川など、リラクゼーションのためのすべてが揃っています。
川には nn 枚の板で構成された木の橋があります。それはかなり古くて魅力的ではないので、ヴィカはそれをペイントすることにしました。そして小屋でちょうどkk色のペンキの缶を見つけました。
それぞれの板を kk 色のいずれかで塗装した後、ヴィカは仕事を休むためにブランコに乗ろうとしていました。しかし、家は川の向こう側にあり、塗料がまだ完全に乾いていないため、まだ橋を歩くことができないことに気づきました。
橋の外観を損なわないように、ヴィカさんは同じ色の板を踏むだけで橋の上を歩くことにしました。そうしないと、靴底の小さなペイントの層が別の色の板を台無しにしてしまいます。ヴィカにも少し塗料が残っていますが、橋の板一枚を塗り直すのに十分な量です。
今、ヴィカは最初の板の前の地面に立っています。橋を歩いて渡るために、彼女は同じ色の板をいくつか選択します (再ペイント後)。番号は 1≤i1<i2<…<im≤n1≤i1<i2<…<im≤n (板には 11 から番号が付けられています) です。左から右へ)。次に、Vika は i1−1、i2−i1−1、i3−i2−1、…、im−im−1−1、n−imi1−1、i2−i1−1、i3−i2−1、を通過する必要があります。 …,im−im−1−1,n−im プランクは、m+1m+1 ステップのそれぞれの結果として生成されます。
ヴィカは転ぶのが怖いので、あまり長い歩幅を歩きたくないのです。彼女を助けて、橋を渡るときに 1 つ (または 0 つ) の板を別の色に塗り直すことができる場合、一度に渡らなければならない板の最小最大数を教えてください。
入力
各テストは複数のテスト ケースで構成されます。最初の行には、テスト ケースの数を表す単一の整数 tt (1≤t≤1041≤t≤104) が含まれています。テストケースについては以下で説明します。
各テスト ケースの最初の行には、2 つの整数 nn と kk (1≤k≤n≤2⋅1051≤k≤n≤2⋅105)、つまり橋の板の数と異なる色の塗料の数が含まれています。
各テスト ケースの 2 行目には、nn の整数 c1,c2,c3,…,cnc1,c2,c3,…,cn (1≤ci≤k1≤ci≤k) が含まれます。これは、Vika が橋の板を塗装した色です。 。
すべてのテスト ケースの nn の合計が 2⋅1052⋅105 を超えないことが保証されます。
出力
テスト ケースごとに、単一の整数、つまり Vika が 1 つのステップでまたぐ必要がある板の最小可能最大数を出力します。
例
入力
5
5 2
1 1 2 1 1
7 3
1 2 3 3 3 2 1
6 6
1 2 3 4 5 6
8 4
1 2 3 4 2 3 1 4
3 1
1 1 1
出力
0
1
2
2
0
注記
最初のテスト ケースでは、Vika は中央の板を色 11 で再ペイントし、板をまたぐことなく橋を歩いて渡ることができます。
2 番目のテスト ケースでは、Vika は中央の板を色 22 で再ペイントし、毎回 1 つの板だけを踏んで橋を渡ります。
3 番目のテスト ケースでは、Vika は最後から 2 番目の板を 22 色で再ペイントし、番号 22 と 55 の板だけを踏んで橋を渡ります。その場合、Vika は歩くたびに 11、22、11 の板をまたがなければなりません。答えは22です。
4 番目のテスト ケースでは、Vika は橋を再塗装せずに、毎回 2 枚の板をまたいで、色 33 の板の上を歩くだけで橋を渡ることができます。
5 番目のテスト ケースでは、Vika は橋を再塗装することなく、板をまたぐことなく、単純に歩いて渡ることができます。
解析する
ブリッジ上のすべてのボードの色を考慮して、2 次元配列を使用して、各色の最大分離距離と 2 番目の最大分離距離を維持できます。最後に、ループを開いて最終境界距離を判定に追加し、反復処理します。すべてのカラー ブロックを検索します。各色の最大間隔の最小値。
ACコード:
#include<bits/stdc++.h>
using namespace std;
#define p 201010
int a[p],z[p][2],o[p];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(z,0,sizeof(z));
memset(o,0,sizeof(o));
int k,n;
cin>>k>>n;
for(int i=1;i<=k;i++)
cin>>a[i];
for(int i=1;i<=k;i++)
{
int m=i-o[a[i]];
if(m>z[a[i]][0])
{
z[a[i]][1]=z[a[i]][0];
z[a[i]][0]=m;
}
else if(m>z[a[i]][1])
z[a[i]][1]=m;
o[a[i]]=i;
}
int max1=0,minn=201100;
for(int i=1;i<=k;i++)
{
int m=k+1-o[a[i]];
if(m>z[a[i]][0])
{
z[a[i]][1]=z[a[i]][0];
z[a[i]][0]=m;
}
else if(m>z[a[i]][1])
z[a[i]][1]=m;
max1=max((z[a[i]][0]+1)/2,z[a[i]][1]);//最大距离中间可变一次颜色,与第二大距离比较
minn=min(minn,max1);
}
cout<<minn-1<<endl;
}
return 0;
}