第一次熬夜打比赛:D
A. Hall of Fame
思路比较明显,只用关注最左边的R
和最右边的L
的位置
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
char ch[N];
int main() {
int T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cinbool flagl=false,flagr=false;
int l,r;
for(int i=1;i<=n;i++)
{
>>ch[i];
cinif(!flagr&&ch[i]=='R')
=i,flagr=true;
r}
for(int i=n;i>=1;i--)
{
if(!flagl&&ch[i]=='L')
{
=i,flagl=true;
lbreak;
}
}
if(!flagl||!flagr)
{
<<-1<<'\n';
cout}
else
{
if(l+1<r)
<<-1<<'\n';
coutelse if(l<r)
<<l<<'\n';
coutelse
<<0<<'\n';
cout}
}
return 0;
}
B. MKnez's ConstructiveForces Task
一道数学题
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cinif(n==1||n==3)
<<"NO"<<'\n';
coutelse
{
<<"YES"<<'\n';
coutif(n%2==0)
{
for(int i=1;i<=n;i++)
{
if(i%2==0)
<<1<<" ";
coutelse
<<-1<<" ";
cout}
}
else
{
for(int i=1;i<=n;i++)
{
if(i%2==0)
<<(n-1)/2<<" ";
coutelse
<<(3-n)/2<<" ";
cout}
}
<<'\n';
cout}
}
return 0;
}
C. Least Prefix Sum
要保证m项的前缀和最小,只需在m前总体是降的,在m后总体是增的,可以想到用从m开始的前缀和刻画。
将新的前缀和与0作比较,如果与预习不符就将经过的一个最优值取反,可以用优先队列保存最优值。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int a[N];
int main() {
int T;
>>T;
cinwhile(T--)
{
int n,m;
>>n>>m;
cinfor(int i=1;i<=n;i++)
>>a[i];
cinint ans=0;
<int> s1,s2;
priority_queue=0;
ll sumfor(int i=m;i>1;i--)
{
+=a[i];
sumif(a[i]>0)
.push(a[i]);
s1while(sum>0)
{
-=2*s1.top();
sum.pop();
s1++;
ans}
}
=0;
sumfor(int i=m+1;i<=n;i++)
{
+=a[i];
sumif(a[i]<0)
.push(-a[i]);
s2while(sum<0)
{
+=2*s2.top();
sum.pop();
s2++;
ans}
}
<<ans<<'\n';
cout}
return 0;
}