2018-team7-CF29
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
好难 这场= =
菜到爆炸
A题2y20 看错了题目条件 按照题意模拟即可
B题不会做
状态压缩之后如果两行状态不等 说明他们不会被一起选
然后如果他们存在某列全为1 那么显然不合法
C题 水题 精度需要注意下 二分即可
D题
显然
mark[i] = m[i] + d[i] + 1;
其中mark[i]非严格递增且最大差1
转换为求这样的sum of d[i] 最小
那我们可以从前往后先把序列变成非严格递增(差值加进答案)
从后扫一遍若后面的值大于前面的值+1
把前面的值变成后面的值-1
差值加进答案
{{{
#!C
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int m[102020];
int dp[102020];
int main(){
int n;
ll ans=0;
cin>>n;
for(int i=1;i<=n;++i) cin>>m[i],++m[i];
for(int i=2;i<=n;++i){
if(m[i]<m[i-1]){
ans+=m[i-1]-m[i];
m[i]=m[i-1];
}
}
for(int i=n;i>=2;i--){
if(m[i]>m[i-1]+1){
ans+=m[i]-1-m[i-1];
m[i-1]=m[i]-1;
}
}
cout<<ans<<endl;
return 0;
}
}}}
好难 这场= =
菜到爆炸
A题2y20 看错了题目条件 按照题意模拟即可
B题不会做
状态压缩之后如果两行状态不等 说明他们不会被一起选
然后如果他们存在某列全为1 那么显然不合法
C题 水题 精度需要注意下 二分即可
D题
显然
mark[i] = m[i] + d[i] + 1;
其中mark[i]非严格递增且最大差1
转换为求这样的sum of d[i] 最小
那我们可以从前往后先把序列变成非严格递增(差值加进答案)
从后扫一遍若后面的值大于前面的值+1
把前面的值变成后面的值-1
差值加进答案
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int m[102020];
int dp[102020];
int main(){
int n;
ll ans=0;
cin>>n;
for(int i=1;i<=n;++i) cin>>m[i],++m[i];
for(int i=2;i<=n;++i){
if(m[i]<m[i-1]){
ans+=m[i-1]-m[i];
m[i]=m[i-1];
}
}
for(int i=n;i>=2;i--){
if(m[i]>m[i-1]+1){
ans+=m[i]-1-m[i-1];
m[i-1]=m[i]-1;
}
}
cout<<ans<<endl;
return 0;
}