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;
}

浙公网安备 33010602011771号