2020 China Collegiate Qinhuangdao Site E. Exam Results(尺取)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020 China Collegiate Qinhuangdao Site E. Exam Results(尺取)相关的知识,希望对你有一定的参考价值。

LINK

考虑固定最高分 x x x,那么所有人的分数需要小于 x x x

其中合格的人的分数在区间 [ x ∗ p % , x ] [x*p\\%,x] [xp%,x]之间

很明显这是一段区间,随着 x x x的递增左端点也递增,所以可以尺取

把每个人的两个分数丢进结构体内,维护这个分数的值和属于哪个人

按照分数排序

那么首先我们需要找到一个最小的 r r r满足 [ 1 , r ] [1,r] [1,r]里所有人的分数都出现过一次

这个时候才可以拿 r r r位置的分数座位最高分

那合法的人有哪些呢??尺取得到是 [ l , r ] [l,r] [l,r]这段区间,维护一下就好了

固定左端点尺取的

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 4e6+10;
int n,t,P,casenum,top;
typedef pair<int,int>p;
p a[maxn];
int ans,res,chu,vis[maxn],isok[maxn];
void add(int x)
{
	if( isok[x]==0 )	chu++,isok[x] = 1;
	if( vis[x]==0 )	res++;
	vis[x]++;
}
void del(int x)
{
	if( vis[x]==1 )	res--;
	vis[x]--;
}
signed main()
{
	cin >> t;
	while( t-- )
	{
		chu = top = ans = res = 0;
		cin >> n >> P;
		for(int i=1;i<=n;i++)
		{
			int l,r; scanf("%lld%lld",&l,&r);
			a[++top] = p(l,i);	a[++top] = p(r,i);
		}
		sort( a+1,a+1+top );
		for(int l=1,r=1;l<=top;l++)//固定左端点 
		{
			while( r<=l || chu<n )	add( a[r].second ),r++;
			while( r<=top && 1ll*100*a[l].first>=1ll*a[r].first*P )	add(a[r].second),r++;
			if( 1ll*100*a[l].first>=1ll*a[r-1].first*P )	ans = max( ans,res );
			del(a[l].second); 
		}
		cout << "Case #" << ++casenum << ": " << ans << endl;
		for(int i=1;i<=n;i++)	vis[i] = isok[i] = 0;
	}
}

固定 r r r为右端点

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 4e6+10;
int n,t,P,casenum,top;
typedef pair<int,int>p;
p a[maxn];
int ans,res,chu,vis[maxn],isok[maxn];
void add(int x)
{
	if( isok[x]==0 )	chu++,isok[x] = 1;
	if( vis[x]==0 )	res++;
	vis[x]++;
}
void del(int x)
{
	if( vis[x]==1 )	res--;
	vis[x]--;
}
signed main()
{
	cin >> t;
	while( t-- )
	{
		chu = top = ans = res = 0;
		cin >> n >> P;
		for(int i=1;i<=n;i++)
		{
			int l,r; scanf("%lld%lld",&l,&r);
			a[++top] = p(l,i);	a[++top] = p(r,i);
		}
		sort( a+1,a+1+top );
		for(int l=1,r=1;r<=top;r++)//固定左端点 
		{
			add( a[r].second );
			while( r<l || chu!=n )	r++,add( a[r].second );//chu变量是因为需要保证前面至少每个人都有分数 
			while( 1ll*100*a[l].first<1ll*a[r].first*P )	del( a[l].second ),l++;
			if( 1ll*100*a[l].first>=1ll*a[r-1].first*P )	ans = max( ans,res ); 
		}
		cout << "Case #" << ++casenum << ": " << ans << endl;
		for(int i=1;i<=n;i++)	vis[i] = isok[i] = 0;
	}
}

以上是关于2020 China Collegiate Qinhuangdao Site E. Exam Results(尺取)的主要内容,如果未能解决你的问题,请参考以下文章

2020 China Collegiate Programming Contest, Weihai Site L. Clock Master(分组背包)

2020 China Collegiate Qinhuangdao Site F. Friendly Group(思维+边双连通)

2020 China Collegiate Programming Contest - Mianyang Site J. Joy of Handcraft(线段树模板)

2020 China Collegiate Programming Contest, Weihai Site C. Rencontre(lca+树形dp)

The 2019 China Collegiate Programming Contest Harbin Site

The 2019 China Collegiate Programming Contest Harbin Site F. Fixing Banners