社区讨论
求hack
P2507[SCOI2008] 配对参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mkrnfd32
- 此快照首次捕获于
- 2026/01/24 09:46 4 周前
- 此快照最后确认于
- 2026/01/24 17:28 4 周前
思路:先贪心,然后把目前连续的相等的位置提取出来,左右扩展一个,然后 DP 修改为合法情况。过了1235。
CPP#include<iostream>
#include<algorithm>
#include<assert.h>
#include<map>
#include<vector>
using namespace std;
#define int long long
const int N=1000500;
int a[N],b[N],n;
vector<int>v;
map<int,int>mp;
int subsolve(int l,int r){
vector<int>u;
int sum1=0;
for(int i=l;i<=r+1;i++){
u.push_back(v[i]-v[i-1]);
sum1+=u.back();
}
vector<int>f(u.size()),g(u.size());
f[0]=u[0],g[0]=0;
for(int i=1;i<u.size();i++){
f[i]=g[i-1]+u[i];
g[i]=max(f[i-1],g[i-1]);
}
//cout<<sum1<<" "<<max(f.back(),g.back())<<endl;
return 2*(sum1-max(f.back(),g.back()));
}
signed main(){
cin>>n;
n+=2;
a[1]=-1e17,b[1]=a[1]+1;
a[n]=1e17,b[n]=a[n]+1;
for(int i=2;i<=n-1;i++){
cin>>a[i]>>b[i];
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
int sum1=0,sum2=0;
for(int i=1;i<=n;i++){
v.push_back(a[i]),v.push_back(b[i]);
if(a[i]==b[i])mp[a[i]]=1;
sum1+=max(a[i]-b[i],b[i]-a[i]);
}
v.erase(unique(v.begin(),v.end()),v.end());
int l=-1;
for(int i=0;i<v.size();i++){
if(mp[v[i]]==1){
if(l==-1)l=i;
}else{
if(l!=-1){
sum2+=subsolve(l,i-1);
l=-1;
}
}
}
// cout<<sum1<<endl;
cout<<sum1+sum2-2<<endl;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...