ICPC 2019-2020 North-Western Russia Regional Contest 补题

这篇博客介绍了ICPC 2019-2020 North-Western Russia Regional Contest的补题,包括'A - Accurate Movement','B - Bad Treap'等题目。博主详细解析了每个问题的思路,如'A'题通过模拟解决,'B'题利用二叉搜索树和堆的性质构造答案。还提及了'E - Equidistant'和'H - High Load Database G'等题目,涉及到距离相等问题和序列分割优化。文章最后提到了'I - Ideal Pyramid',但未给出完整解答。

A - Accurate Movement

题目大意
有木块a和木块b,a的长度比b短,他俩同时放在一个轨道上,头都顶着左边,轨道长为c,现在移动a和b,在a不超出b的前提下(有可能是左超出,有可能是右超出),求他俩都到达轨道右边的最小移动步数。
ps:a就算和b一起动,那么最后的步数也应该是a动的加上b动的。

模拟可以过的,因为只要两个木块右边的点到达轨道的右边就算完成,所以就以两个木块的右端点来作为移动的标志,先挪a,每次a只能到和b相同的位置,b每次最多可以移动b-a次,要保证b左边不会在a右边的右边,画图可以感觉出来。

代码

#include <iostream>

using namespace std;
int main()
{
	int a,b,n;
	scanf("%d %d %d",&a,&b,&n);
	int c=b-a;
	int cnt=0;
	while(b<n)
    {
		if(a<n)
		{
		    a=b;
		    cnt++;
		}
		b+=c;
		cnt++;
	}
	if(a<n)
    cnt++;
	printf("%d\n",cnt);
	return 0;
}

B - Bad Treap

题目大意
给你一个数对(x,y)。x符合二叉搜索树的规则(左子小于父亲,父亲小于右子),y符合堆的规则(根大于等于子),并且y=sinx,给你一个n,你需要输出n个答案,构造出高度为n的数堆,输出x。

E - Equidistant

题目大意
选一个点,使得所有点到该点的距离相等,如果找不到,输出NO,否则输出YES,并且输出其中符合要求的一个点。

H - High Load Database G

题目大意
给你一个有n个数字的序列,q组询问,每组有一个t,问你将这个序列最少分成多少段才能使每一组的和都小于等于t,输出这个最小值。

想法是二分加前缀和。二分来找到每一段的长度,在用一个循环来控制区间的移动,但是,需要加记忆化,不然会T,就…很…

代码

#include <iostream>

using namespace std;
const int maxn=2e6;

int a[maxn];
int sum[maxn]={0};
int ans[maxn];
int n;

int erfen(int x)
{
    int cnt=0;
	int L=1,R=n; 
    int l=1,r=n;
	while(L<R)
    {
		cnt++;
		while(l<r)
		{
			int mid=l+r+1>>1;
			if(sum[mid]-sum[L-1]<=x)
			l=mid;
			else
			r=mid-1;
		}
		r=n;
        L=l+1;
        l++;
	}
	if(L==R) //分到最后还剩下一个数字为一个区间的处理
    cnt++;
	return cnt;
}
int main()
{
    scanf("%d",&n);
    int maxx=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        maxx=max(maxx,a[i]);
    }
    sum[1]=a[1];
    for(int i=2;i<=n;i++)
    {
        sum[i]=sum[i-1]+a[i];
    }
    int q;
    scanf("%d",&q);
    while(q--)
    {
        int t;
        scanf("%d",&t);
        if(t<maxx)
        {
            printf("Impossible\n");
        }
        else
        {
            if(ans[t]==0) //记忆化,不然会T
            {
                ans[t]=erfen(t);
            }
            printf("%d\n",ans[t]);
        }
    }
    return 0;
}

I - Ideal Pyramid

题目大意
给你n组点(x,y,h)。要求找到一个金字塔,金字塔的斜面和底面夹角是45°,并且这个金字塔要把这n组点都包含进去,让你求金字塔的中点。

未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值