2020杭电多校第一场(待更新)

2020杭电多校第一场

难度真的是一言难尽……

1004.Distinct Sub-palindromes


题意:

要求构建一个长度为n的字符串,求该字符串中回文子串的数量最少有多少种情况。

首先画一下n比较小的情况,发现当n<4时无论怎样构建,其回文子串的数量都是一样的,那么情况数量就是26^n;而当n=4时,我们尝试由n=3的情况变化过来,n=3时,有aab、aaa、aba、abc,现在在这几个串后添加字母,aab、aaa、aba无论怎么添加都会导致回文子串增加,而abc变成abca后回文子串数量不变,以此类推当n>3时,可以构建为abcabca……,这样情况数就为26x25x24。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef long long ll;
ll m=998244353;
ll fpow(ll a,ll b)
{
    if(!b)
    {
        return 0;
    }
    ll ans=1;
    while(b)
    {
        if(b&1)
        {
            ans=(ans*a)%m;
        }
        a=(a*a)%m;
        b>>=1;
    }
    return ans;
}
int main()
{
    ll n;
    int t;
    cin>>t;
    while(t--)
    {
    	cin>>n;
    	if(n>3)
    	{
    		cout<<26*25*24<<endl;
		}
		else
		{
			cout<<fpow(26,n)<<endl;
		}
	}
    return 0;
}

1006.Leading Robots


题意:

给定n个机器人,每个机器人都有自己的位置p和加速度a,问当时间无限下去后,有多少机器人移动到最前面过。

看着就很像一个单调栈,但当时觉得“n^2还过不了5w吗?”,反手就是一个暴力,果断GG。

首先我们考虑什么情况下某个机器人会移动到最前面,很显然,加速度最大的肯定可以,而且还是最后移动到的,而位置最前的一定是最先的;如果一个机器人的加速度大于它前面的机器人,那么它肯定可以超过前面的,而要达到最前端,就需要每个机器人都能超过前面的机器人,这样一条链就形成了。

为了维护这么一个单调栈,我们先预处理一下数据,将机器人以加速度为主位置为辅排序,然后依次将机器人放入栈中,栈顶元素每次与待加入元素比较,如果栈顶元素不能超过待加入元素,那么很明显要踢掉,而栈顶元素超过其前面的那个机器人的时间大于待加入机器人超过栈顶的时间那么也不满足,踢掉。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
using namespace std;
struct robot
{
	long long p,a;
}ro[50005];
bool cmp(robot a,robot b)
{
	if(a.a == b.a)
	{
		return a.p<b.p;
	}
	return a.a<b.a;
}
bool check(robot a,robot b,robot c)
{
	return (b.p-a.p)*(b.a-c.a)>=(c.p-b.p)*(a.a-b.a);
}
map<pair<long long,long long>,int> mp;
int stack[50005];
int top;
int n;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		mp.erase(mp.begin(),mp.end());
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			scanf("%d %d",&ro[i].p,&ro[i].a);
			mp[make_pair(ro[i].p,ro[i].a)]++;
		}
		sort(ro+1,ro+n+1,cmp);
		top=0;
		for(int i=1;i<=n;i++)
		{
			while(top)
			{
				if(ro[stack[top]].p<=ro[i].p)
				{
					top--;
				}
				else if(top>1 && check(ro[stack[top-1]],ro[stack[top]],ro[i]))
				{
					top--;
				}
				else
				{
					break;
				}
			}
			stack[++top]=i;
		}
		int ans=top;
		for(int i=1;i<=top;i++)
		{
			if(mp[make_pair(ro[stack[i]].p,ro[stack[i]].a)]>1)
			{
				ans--;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

博客地址


猜你喜欢

转载自www.cnblogs.com/Heizesi/p/13377897.html