B. Black Cells
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll lo=1e9+7,maxx=0,l,t,a[550000];
ll mod=1e9+7;
ll n,m,k,z,b[500050]={0};
ll c[100000],x,y;
int main(){
cin>>t;
while(t--){
ll sum=1,ans=1e18+7,ro=1;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
b[i]=a[i]-a[i-1];每个数之间的距离
}
if(n%2!=0){//n=2时不用修改
for(int i=0;i<n;i++){//枚举出去掉哪条边最优,从0开始方便
if(i%2!=0){
ro=max(ro,b[i]);//防止sum干扰
}
sum=ro;
for(int j=i+2;j<n;j+=2){
sum=max(sum,b[j]); //去掉一个点后
}
ans=min(sum,ans);
}
if(n==1){
ans=1;
}
cout<<ans<<endl;
}
else{ //n=2时直接求最大
for(int i=1;i<n;i+=2){
sum=max(sum,b[i]);
}
cout<<sum<<endl;
}
}
}
C. Action Figures
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,t,k,ro=0;
ll a[500050],b[500500],c[500500];
char mp[5001][5005];
char mmp[5050][5050];
void inis(){
for(int i=1;i<=400001;i++){
b[i]=b[i-1]+i;
}
}
int main(){
cin>>t;
inis();
while(t--){
cin>>n;
string s;
ll sum=b[n],ans=0;//ans即为未来,从后往前计算,sum为从1到n的和
cin>>s;
for(int i=n-1;i>=0;i--){
if(s[i]=='1'&&ans<i){//每当为1时且未来能被透支时sum减去最i,并且透支未来即ans++
sum-=(i+1);
ans++;
}
else if(s[i]=='0'){//当为0时恢复ans即ans--但ans>0
if(ans>0){
ans--;
}
}
else{ //如果未来不能被透支且为1,恢复即ans--;
ans--;
}
}
cout<<sum<<endl;
}
}