社区讨论

求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 条回复,欢迎继续交流。

正在加载回复...