20240730

赛时得分

题目 A B C D E F G H 总分 排名 比例
满分 1200 1400 1700 1600 1900 2000 2400 2500 14700 175 100%
得分 1200 0 1700 320 0 0 - 482 3702 122 70.3%

A.“和平与你同在”(1200/1200)

依题意模拟即可,空位去一周总和的 \(\text{max}\) 值,有人的座位一圈加和再除以 \(2\)(因为握手是双向的),求总和即可。


C. Mirko 和 Slavko 的积木(1700/1700)

考虑二分答案,二分查找出中心柱的高度,根据依次为 \(1\) 的柱子高度递减&递增规律可得到其他所有柱子的高度,二分的答案是花费最少的点。

二分的时候右边小就递归右边,左边小就递归左边。

ll check(ll x)
{
    ll ans=0,mid=n/2+1;
    for(int i=1;i<=n;i++)
    {
        ans+=abs(abs(i-mid)+x-s[i]);
        ans+=abs(abs(i-mid)+x-m[i]);
    }
    return ans;
}
ll binary(ll l,ll r)
{
    if(l>=r) return l;
    ll mid=(l+r)>>1;
    if(check(mid)<check(mid+1)) return binary(l,mid);
    else return binary(mid+1,r);
}

D. 操作(1120/1600)

\(\text{20%}\) 得分做法,对于操作一直接加一,对于操作二递归模拟即可。

\(\text{70%}\) 得分做法,对于倒着计算操作二,累计操作一的次数,然后直接加上次数即可。

#include<bits/stdc++.h>
#define Std_Maker lhm
#define ll long long
using namespace std;
const int N=1e5+1,mod=1e9+7;
ll n,m,a[N],op[N],l[N],r[N],tms[N];
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0); 
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>op[i]>>l[i]>>r[i];
		tms[i]=1;
	}
	for(int i=m;i>=1;i--)
	{
		if(op[i]==2)
		{
			for(int j=l[i];j<=r[i];j++) tms[j]+=tms[i]%mod;
		}
		else
		{
			for(int j=l[i];j<=r[i];j++) a[j]+=tms[i]%mod;
		}
	}
	for(int i=1;i<=n;i++) cout<<a[i]%mod<<" ";
	return 0;
} 

E. 字符串交换(608/1900)

赛时读错题了。

\(\text{32%}\) 得分做法,直接依题意模拟,对于每个字符串开一个 \(maxn\) 存储每一次交换后的相同数量最大值,最后输出即可。


H. 前缀后缀(482/2500)

\(\text{19%}\) 得分做法,开三个字符串,第一个是读入的(ababbabababbaab),接着从 \(1\)\(\dfrac{n}{2}\) 枚举长度 \(l\),每次从头和尾取出相应长度的前后缀,按后缀-前缀的顺序拼成第二个串(例如取六个:abbaabababba);然后继续枚举长度,从第二串的首尾一个一个拿字符组成第三个串,第 \(i\) 次组成的串长度是 \(2\times i\),(例如取四次:aabbbbaa),每次判断这个串是否回文(性质),若回文则满足条件,记录一下此时的长度 \(l\),最后输出即可。

TLE 的部分盲猜一手 \(\dfrac{n}{2}\),还可以获得 \(\text{19%}\) 中的 \(\text{5%}\)

#include<bits/stdc++.h>
#define Std_Maker lhm
#define ll long long
using namespace std;
const int N=3e5+1;
ll n,maxn,ins;
string s,a,b;
bool ok=0;
bool check(string s)
{
    stack<char> p;
    for(int i=0;i<s.length();i++) p.push(s[i]);
    string b="";
    while(!p.empty())
    {
        b+=p.top();
        p.pop();
    }
    if(s==b) return 1;
    else return 0;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>a;
    if(n>5000)
    {
        cout<<n/2;
        return 0;
    }
    if(n%2==0) ins=n/2;
    else ins=n/2-1;
    for(ll i=1;i<=ins;i++)
    {
        b="",s="",ok=0;
        for(int j=n-i;j<n;j++) b+=a[j];
        for(int j=0;j<i;j++) b+=a[j];
        for(int j=0;j<i;j++)
        {
            s+=b[j],s+=b[i*2-j-1];
            if(check(s)==1)
            {
                ok=1;
                break;
            }
        }
        if(ok==1) maxn=max(i,maxn);
    }
    cout<<maxn;
    return 0;
}
posted @ 2024-07-30 15:13  Lithium_Chestnut  阅读(13)  评论(0)    收藏  举报