题解:P15263 [USACO26JAN2] Circle of Cows P
swordofsky · · 题解
提示:本题可以选择相信评测机(小常数
找一找性质。
线段表示匹配。
乍一看蓝线匹配没有浅绿线匹配更优。然而事实真的如此吗?
蓝贡献:
绿贡献:
所以交叉的两条线永远更优。我们选点应该选
断环为链。选取两个端点,双指针贪心看看以这两个端点的距离
过程:当
最后把答案当下标,最短距离
:::info[code]
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2005;
ll n,c,a[N],dp[N];
ll sol(ll x,ll y,bool &f){//解决距离,顺便判断哪个距离更近
ll l=y-x,r=c-l;
f=(l<r);
return min(l,r);
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>c;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i+n]=a[i]+c;
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){//开始双指针
bool f;
ll l=i+1,r=j+1,dis=sol(a[i],a[j],f),ans=1;
while(l<j&&r<i+n){//计算答案
while(l<j&&r<i+n&&sol(a[l],a[r],f)<dis){
if(f) r++;
else l++;
}
if(l==j||r==i+n) break;
ans++;
l++;
r++;
}
dp[ans]=max(dp[ans],dis);
}
}
for(int i=n/2;i>=1;i--){
dp[i]=max(dp[i],dp[i+1]);
}
for(int i=1;i<=n/2;i++){
cout<<dp[i]<<' ';
}
return 0;
}
:::