社区讨论

普及组签到题求条

P10220[省选联考 2024] 迷宫守卫参与者 19已保存回复 22

讨论操作

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

当前回复
22 条
当前快照
1 份
快照标识符
@m1h2d0gb
此快照首次捕获于
2024/09/25 07:24
去年
此快照最后确认于
2025/11/05 00:09
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
#define ll long long
#define re register
#define for_(i,a,b) for(int i=(a);i<=(b);i++)
#define _for(i,a,b) for(int i=(a);i>=(b);i--)
#define lc(q) ((q)<<1)
#define rc(q) ((q)<<1|1)
#define mid(l,r) (((l)+(r))>>1)

using namespace std;

namespace IO {
    inline int read() {
        char ch = getchar();
        int s = 0, f = 1;
        while (ch < '0' || ch > '9') {
            if (ch == '-') f = -1;
            ch = getchar();
        }
        while (ch >= '0' && ch <= '9') {
            s = s * 10 + ch - '0';
            ch = getchar();
        }
        return s * f;
    }

    inline void write(int x) {
        if (x < 0) {
            putchar('-');
            x = -x;
        }
        if (x > 9) write(x / 10);
        putchar(x % 10 + '0');
    }

    inline void writeln(int x) {
        write(x);
        putchar('\n');
    }
}

using namespace IO;

const int N=(1<<17)+5;
const int INF=LLONG_MAX;

int a[N],rev[N],f[N],q[N],cnt,n,m,i,j,k,w,t;

inline int check(int N,int K){
    if(N<<1>=n){
        if(a[N<<1]<K) 
            f[N] = INF;
        else {
            if(a[(N<<1)+1]<K) 
                f[N] = a[N];
            else 
                f[N] = 0;
        }
    } 
    else {
        check(N<<1,K);
        check((N<<1)+1,K);
    }
    int ans = f[N<<1]+min(a[N],f[(N<<1)+1]);
    f[N]=min(INF,ans);
    return f[N];
}

inline void dfs(int N){
    int L=1,R=n,M;
    while(L<R){
        M=L+R+1>>1;
        if(check(N,M)<=w)
            L=M;
        else 
            R=M-1;
    }
    check(N,L);
    L=rev[L];w-=f[N];
    q[++cnt]=a[L];
    q[++cnt]=a[L^1];
    for(int I=L>>1;I!=N;I>>=1){
        if(I&1)
            w+=f[I^1];
        else if(f[I^1]<=a[I>>1])
            w+=f[I^1];
        else if(w>=f[I^1]-a[I>>1])
            w+=a[I>>1];
        dfs(I^1);
    }
}

signed main(){
    t=read();
    while(t--){
        m=read(),w=read();
        n=1<<m;cnt=0;
        for_(i,1,2*n-1)
            a[i]=read();
        for_(i,n,2*n-1)
            rev[a[i]]=i;
        dfs(1);
        for_(i,1,n)
            writeln(q[i]);
    }
}
0pts,要么 RE 要么 TLE 了

回复

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

正在加载回复...