求助 80pts
查看原帖
求助 80pts
961972
Lele_Programmer楼主2025/2/2 19:45
#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define FRR(file) freopen(file,"r",stdin)
#define FRW(file) freopen(file,"w",stdout)
#define TIMESTAMP cerr<<fixed<<setprecision(3)<<clock()*1.0/CLOCKS_PER_SEC<<"s"<<endl;
#define _rep(i,a,b) for (int i=(a);i<=(b);++i)
#define _reps(i,a,b,c) for (int i=(a);i<=(b);c)
#define _rrep(i,a,b) for (int i=(a);i>=(b);--i)
#define _rreps(i,a,b,c) for (int i=(a);i>=(b);c)
#define _iter(i,a) for (auto i=a.begin();i!=a.end();++i)
#define _graph(i,u) for (int i=h[u];~i;i=ne[i])
#define rint register int
#define LL long long
#define i32 signed
#define i64 long long
#define i128 __int128
#define u32 unsigned
#define u64 unsigned long long
typedef pair<int,int> pii;
typedef pair<int,pii> piii;
typedef pair<double,double> pdd;

namespace IO {
    template<typename T> inline void read(T& x) {
        int s=1; char c=getchar(); x=0;
        while (!isdigit(c)) { if (c=='-') s=-1; c=getchar(); }
        while (isdigit(c)) x=x*10+(c-'0'),c=getchar();
        x*=s;
    }
    inline void readstr(string& x) {
        x.clear(); char c=getchar();
        while (isspace(c)) c=getchar();
        while (!isspace(c)) x.push_back(c),c=getchar();
    }
    inline void readstr(char* x) {
        int idx=0; char c=getchar();
        while (isspace(c)) c=getchar();
        while (!isspace(c)) x[idx++]=c,c=getchar();
        x[idx]='\0';
    }
    template<typename T> inline void write(T x) {
        if (x<0) putchar('-'),x=-x;
        if (x/10) write(x/10);
        putchar('0'+(x%10));
    }
    template<typename T> inline void writesp(T x) { write(x); putchar(' '); }
    template<typename T> inline void writeln(T x) { write(x); putchar(10); }
    inline void writestr(string& x) { _iter(it,x) putchar(*it); }
    inline void writestr(char* x) { _rep(i,0,strlen(x)) putchar(x[i]); }
    inline void writestrsp(string& x) { _iter(it,x) putchar(*it); putchar(' '); }
    inline void writestrsp(char* x) { _rep(i,0,strlen(x)) putchar(x[i]); putchar(' '); }
    inline void writestrln(string& x) { _iter(it,x) putchar(*it); putchar(10); }
    inline void writestrln(char* x) { _rep(i,0,strlen(x)) putchar(x[i]); putchar(10); }
};

using namespace IO;

const int N=500005;
const int inf=1e9;

int n;
int a[N],k[N];
vector<int> L[N];

struct Seg {
    int l,r;
    int min;
} tr[2][N<<2]; // 0: left, 1: right

void pushup(Seg* tr,int u) {
    tr[u].min=min(tr[u<<1].min,tr[u<<1|1].min);
}

void build(Seg* tr,int u,int l,int r) {
    tr[u]={l,r,l?inf:0};
    if (l==r) return;
    int mid=l+r>>1;
    build(tr,u<<1,l,mid); build(tr,u<<1|1,mid+1,r);
    pushup(tr,u);
}

void modify(Seg* tr,int u,int p,int k) {
    if (tr[u].l==p && tr[u].r==p) tr[u].min=k;
    else {
        int mid=tr[u].l+tr[u].r>>1;
        if (p<=mid) modify(tr,u<<1,p,k);
        else modify(tr,u<<1|1,p,k);
        pushup(tr,u);
    }
}

int query(Seg* tr,int u,int l,int r) {
    if (tr[u].l>=l && tr[u].r<=r) return tr[u].min;
    int mid=tr[u].l+tr[u].r>>1;
    int ans=inf;
    if (l<=mid) ans=min(ans,query(tr,u<<1,l,r));
    if (r>mid) ans=min(ans,query(tr,u<<1|1,l,r));
    return ans;
}

int main() {
    read(n);
    _rep(i,1,n) read(a[i]),assert(a[i]);
    _rep(i,1,n) read(k[i]);
    _rep(i,1,n) L[min(i+a[i]-1,n)].emplace_back(i);
    build(tr[0],1,0,n);
    build(tr[1],1,0,n);
    _rep(i,1,n) {
        int l=max(i-a[i]+1,1),r=i;
        // 0: left
        int lasLeft=query(tr[0],1,l-1,r-1);
        int lasRight=query(tr[1],1,l-1,r-1);
        int g=min(lasLeft,lasRight);
        g++;
        modify(tr[0],1,i,g);
        // 1: right
        g=inf;
        while (!L[i].empty()) {
            l=L[i].back(); L[i].pop_back();
            lasLeft=query(tr[0],1,l-1,l-1);
            lasRight=query(tr[1],1,l-1,r-1);
            g=min(g,min(lasLeft,lasRight));
        }
        if (g==inf) continue;
        g++;
        modify(tr[1],1,i,g);
    }
    int ansa=query(tr[0],1,n,n);
    int ansb=query(tr[1],1,n,n);
    int ans=min(ansa,ansb);
    write(ans);
    return 0;
}

WA 了第 40 个点,痛失 20pts,所以错哪了捏

2025/2/2 19:45
加载中...