upcテストの離散化+差

試験
時間制限:1秒メモリ制限:128 MB

タイトルの説明
Sは地方選抜トレーニングを実施し、n人の選手の強さは不均一でした。誰もが知っているように、タイトルが水すぎると、AKが去った後に誰かがゲームをプレイします。タイトルが難しすぎると、退廃した後にゲームをプレイします。質問をした人は、当然、あまり多くの人にゲームに出てほしくないのですが、そうでなければ、obは非常に怒ります。したがって、トピックの難易度を設定し、最小限の人々がゲームをプレイするために出かけないようにする必要があります。同時に、トピックはできるだけ難しくなります。最初の行に正の整数nを
入力
して、合計n人のプレーヤーが参加することを示します。
次のn行で、2つの負でない整数Ai、Biは、i番目のプレーヤーの許容される難易度がAi〜Biの間にあることを示します設定された質問の難易度がこの範囲を超えると、プレイヤーはゲームを離れます。

出力は
数値ansの付い線であり、設定した難易度はansであることを示します。これは、フィールドから最も少ない人を残しながらできるだけ大きくする必要があります。
サンプル入力コピー
3
1 5
95 105
5 110
サンプル出力コピー
105
プロンプト
サンプルは、
3人のプレーヤーが参加していることを説明しています。便宜上、最初のプレーヤーはXiao X、2番目のプレーヤーはXiao Q、3番目のプレーヤーはXiaoという名前です。 P
質問の難易度がKonjac Xを満たすことである場合、Qは間違いなくAKの後に退廃します。小さなPを考慮するために、難易度は5に設定する必要があります。このとき、1人がフィールドを離れます。
大きな男のシャオQに会いたい場合は、とにかく、シャオXは問題がコートを離れることが難しいと感じます。小さなPを処理するために、最大難易度は105に設定できます。このとき、1人がコートを離れます。
要約すると、質問の最大難易度は105です。
[データ範囲]
30%データの場合:n≤10
50%データの場合:n≤1000
他の20%データの場合:0≤Ai≤Bi≤100000
100%データの場合:n≤100000、0≤Ai、 Bi≤1000000000

誰もが耐えられる範囲の難易度を与えるのが目的で、この範囲を超えると、フィールドを出て、フィールドを離れる最小限の人数の中から最大の難易度を見つけます。つまり、ポイントを見つけることであり、このポイントは可能な限り何度もカバーされ、できるだけ大きくなります。このポイントの最適解はエンドポイント上にある必要があります。エンドポイント上にない各ポイントについて、エンドポイント上に1つが見つかることを証明できます。クリックして置き換えます。各プレーヤーについて、許容範囲[l、r]に1を追加します。これは、この間隔の各難易度に、最大数のエンドポイントを競い合って見つけることができるクラスメートがもう1人いることを意味します。区間加数の違いを考えることは難しくありませんが、この質問lとrの範囲は比較的大きく、離散化する必要があります。

タイトルはチームの新しい本と非常に似ており、スキャンラインでそれを取り除くことができるはずです。

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#define X first
#define Y second
using namespace std;

typedef long long LL;
typedef pair<int,int> PII;

const int N=200010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;

int n;
int a[N],cnt=0;
int idx,ans;
vector<int>v;
PII p[N];//存区间

int find(int x)
{
	return lower_bound(v.begin(),v.end(),x)-v.begin();
}

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

	scanf("%d",&n);
	
	for(int i=1;i<=n;i++)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		v.push_back(l);
		v.push_back(r);
		p[i]={l,r};
	}

	sort(v.begin(),v.end());
	v.erase(unique(v.begin(),v.end()),v.end());

	for(int i=1;i<=n;i++)
	{
		int l=p[i].X,r=p[i].Y;
		l=find(l),r=find(r);
		a[l]+=1,a[r+1]-=1;
	}
	
	n=v.size();
	for(int i=1;i<n;i++)
		a[i]+=a[i-1];
	
	idx=0,ans=a[0];
	for(int i=1;i<n;i++)
	{
		if(a[i]>=ans)
			ans=a[i],idx=i;
	}
	
	cout<<v[idx]<<endl;





	return 0;
}










元の記事を46件公開しました いいね3 訪問者3241

おすすめ

転載: blog.csdn.net/DaNIelLAk/article/details/105642605