前缀和差分WA22,不知道是思路假了,还是写挂了,悬关
查看原帖
前缀和差分WA22,不知道是思路假了,还是写挂了,悬关
575363
revolutionary_oier楼主2024/3/23 13:57
//Yxz is cute
#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn=2e5+10;
int n,m,m1,l,cnt;
int a[maxn],s[maxn],pre[maxn];
struct node{
    int x,pos;
}ans[maxn<<6];
inline void ipt(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    sort(a+1,a+n+1);
    m1=m;
}   
inline void init(){
    for(int i=1;i<n;i++){
        int u=a[i],v=a[i+1];
        int p=(v-u-1)/2,q=(v-u-1)%2;
        s[1]+=2;
        if(p+1<=2e5)s[p+1]-=2;
        if(p+1<=2e5)s[p+1]+=q;
        if(p+2<=2e5)s[p+2]-=q;
    }
    s[1]+=2;
    for(int i=1;i<=2e5;i++)pre[i]=pre[i-1]+s[i];
}
inline void solve1(){
    int ans=0;
    for(int i=1;i<=2e5;i++){
        if(m>pre[i]){
            m-=pre[i];
            ans+=pre[i]*i;
        }
        else {
            ans+=m*i;
            l=i;
            break;
        }
    }
    printf("%lld\n",ans);
    // printf("l = %lld\n",l);
}
inline bool cmp(node nx,node ny){return nx.x<ny.x;}
inline void solve2(){
    for(int i=1;i<n;i++){
        int u=a[i],v=a[i+1],mx=u;
        for(int j=u+1;j<=u+l&&j<v;j++){
            ans[++cnt].pos=j;
            ans[cnt].x=j-u;
            mx=j;
        }    
        // printf("mx = %lld\n",mx);
        for(int j=v-1;j>u&&j>=v-l&&j>mx;j--){
            ans[++cnt].pos=j;
            ans[cnt].x=v-j;
        }
    }
    for(int i=1;i<=l;i++){
        ans[++cnt].x=i;
        ans[cnt].pos=a[1]-i;
        ans[++cnt].x=i;
        ans[cnt].pos=a[n]+i;
    }
    sort(ans+1,ans+cnt+1,cmp);
}
inline void output(){
    for(int i=1;i<=m1;i++)printf("%lld ",ans[i].pos);
    printf("\n");
}
signed main(){
    // freopen("tree.in","r",stdin);
    // freopen("tree.out","w",stdout);
    ipt();
    init();
    solve1();
    solve2();
    output();
    return 0;
}
2024/3/23 13:57
加载中...