2020 China Collegiate Qinhuangdao Site E. Exam Results(尺取)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020 China Collegiate Qinhuangdao Site E. Exam Results(尺取)相关的知识,希望对你有一定的参考价值。
考虑固定最高分 x x x,那么所有人的分数需要小于 x x x
其中合格的人的分数在区间 [ x ∗ p % , x ] [x*p\\%,x] [x∗p%,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