質問A:ちょうど長いネクタイ-----------------------------思考

题目描述
Just Odd Inventions、Ltd.について聞いたことがありますか?この会社は、「奇妙な発明」で知られています。この問題をJOI、Ltd.と呼びます。
JOI、Ltd.は、最新の製品「Just Long Neckties」を発明しました。ネクタイにはN + 1種類あり、1からN + 1の番号が付けられています。i番目のネクタイ(1≤i≤N + 1)の長さはAiです。
会社は従業員を集めて試着パーティーを開いた。N人の従業員がパーティーに参加し、j番目の従業員(1≤j≤N)は、最初は長さBjのネクタイを着用しています。
試着会は以下の手順で開催されます。

  1. 株式会社ジョイのCEOはパーティーでは使わないネクタイを選びます。
  2. 次に、各従業員は残りのネクタイの1つを選択して試着します。2人の従業員が同じネクタイを選ぶことはありません。
  3. 最後に、各従業員は最初に着用したネクタイを脱ぎ、選択したネクタイを着用します。
    最初に長さbのネクタイを着用している従業員が長さaのネクタイを試着すると、(s)max {a − b、0}の奇妙さを感じます。試着パーティーの奇妙さは、従業員の間の最大の奇妙さとして定義されます。
    また、JOI、Ltd.のCEOがk番目のネクタイを選択した場合、Ckを試着パーティーの最小の奇妙さとして定義します。
    パーティーで使用されるネクタイと各従業員が最初に着用するネクタイの長さを考慮して、C1、C2、の値を計算するプログラムを作成します。、CN + 1.
    输入
    力標準入力から次のデータを読み取ります。与えられた値はすべて整数です。
    N
    A1。AN + 1
    B1。BN
    制約
    •1≤N≤200,000。
    •1≤Ai≤1,000,000,000(1≤i≤N + 1)。
    •1≤Bj≤1,000,000,000(1≤j≤N)。

输出力
1行を標準出力に書き込みます。出力にはC1、C2、の値が含まれているはずです。、CN + 1、スペースで区切られています。
样例输入コピー
【样例1】

3
4 3 7 6
2 6 4
【样例2】
5
4 7 9 10 11 12
3 5 7 9 11
样例输出コピー
【样例1】

2 2 1 1
【样例2】
4 4 3 2 2 2
ティップ
样例1解释

ここでは、試着当事者の一例である:
•JOIの最高経営責任者(CEO)、(株)は、第四ネクタイを選択します。このネクタイはパーティーでは使用されません。
•従業員1は1番目のネクタイを選択し、従業員2は2番目のネクタイを選択し、従業員3は3番目のネクタイを選択します。
•各従業員は、選択したネクタイを試します。
この場合、各従業員の奇妙さは2、0、3の順になります。したがって、パーティーの奇数は3です。
従業員が異なるネクタイを選択すると、奇数を1に減らすことができます。例の1つは次のとおりです。
•JOI、Ltd.のCEOが4番目のネクタイを選択します。このネクタイはパーティーでは使用されません。
•従業員1は2番目のネクタイを選択し、従業員2は3番目のネクタイを選択し、従業員3は1番目のネクタイを選択します。
•各従業員は、選択したネクタイを試します。
この場合、各従業員の奇妙さは1、1、0の順になります。したがって、パーティーの奇数は1です。
これは、JOI、Ltd.のCEOが4番目のネクタイを選択した場合に考えられる最小の奇数なので、C4 = 1です。

分析:
最初にソートしてから、接頭辞の最大値と接尾辞の最大値を維持し、次に
iを順に列挙します

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1000;
int c[N],b[N];
int lb[N];
int la[N],ra[N];
int n;
struct node
{
	int x,pos;
}a[N];
bool cmp(const node &a,const node &b)
{
	return a.x<b.x;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n+1;i++)
	{
		scanf("%d",&a[i].x);
		a[i].pos=i;
	}
	sort(a+1,a+1+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&b[i]);
	}
	sort(b+1,b+1+n);
	for(int i=1;i<=n;i++)
	{
		la[i]=max(la[i-1],a[i].x-b[i]);

	}
	for(int i=n+1;i>1;i--)
	{
		ra[i]=max(ra[i+1],a[i].x-b[i-1]);
	}

	for(int i=1;i<=n+1;i++)
	{
		c[a[i].pos]=max(la[i-1],ra[i+1]);
	} 
	for(int i=1;i<=n+1;i++)
	{
		cout<<c[i]<<" ";
	}
	cout<<endl;
}
公開された元の記事572件 賞賛された14件 ビュー10,000件以上

おすすめ

転載: blog.csdn.net/qq_43690454/article/details/105271226
おすすめ