社区讨论

初三老年选手做不来绿题

P14024 [ICPC 2024 Nanjing R] 纸条参与者 7已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mhj9w9a3
此快照首次捕获于
2025/11/03 23:06
4 个月前
此快照最后确认于
2025/11/03 23:06
4 个月前
查看原帖
rt. 我是一名可悲的普及组选手,我调不出来绿题。求大神帮助。
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
    return s*w;
}
inline void out(int x){
    if(x==0){putchar('0');return;}
    int len=0,k1=x,c[10005];
    if(k1<0)k1=-k1,putchar('-');
    while(k1)c[len++]=k1%10+'0',k1/=10;
    while(len--)putchar(c[len]);
}
const int N=2e5+5;
int a[N],b[N];
signed main(){
    // freopen("tmp.in","r",stdin);
    // freopen("tmp.out","w",stdout);
    int t=read();
    while(t--){
        vector<pair<int,int>>ans;bool f=1;
        int n=read(),m=read(),k=read(),w=read();
        for(int i=1;i<=n;i++)a[i]=read();
        for(int i=1;i<=m;i++)b[i]=read();b[m+1]=w+1;
        sort(a+1,a+n+1),sort(b+1,b+m+1);
        for(int i=1;i<=n;i++){
            // cout<<i<<" ";
            if(!ans.empty())if(ans.back().second>=a[i])continue;
            int p=upper_bound(b+1,b+m+2,a[i])-b;
            // if(i==n){if(a[i]+k-1>w){f=0;puts("-1");break;}}
            // if(p>m){ans.push_back({a[i],a[i]+k-1});continue;}
            int l=a[i],r=a[i]+k-1;
            // cout<<l<<" "<<r<<"\n";
            if(r<b[p]){ans.push_back({l,r});continue;}
            if(i==1){f=0;puts("-1");break;}
            int pos=ans.size()-1,tmpl=b[p]-k,tmpr=b[p]-1;
            ans.push_back({tmpl,tmpr});bool flag=1;
            while(1){
                // cout<<i<<": "<<pos<<" "<<ans[pos].first<<" "<<ans[pos].second<<" ";
                // cout<<pos+1<<" "<<ans[pos+1].first<<" "<<ans[pos+1].second<<"\n";
                if(ans[pos+1].first>ans[pos].second)break;
                ans[pos]={ans[pos+1].first-k,ans[pos+1].second-1};
                if(ans[pos].first<=b[p-1]){puts("-1");flag=0;break;}pos--;
                if(pos<0){puts("-1");flag=0;break;}
            }if(!flag){f=0;break;}
        }if(f){cout<<ans.size()<<"\n";for(auto [l,r]:ans)cout<<l<<" ";puts("");}
    } 
    return 0; 
}

回复

7 条回复,欢迎继续交流。

正在加载回复...