关于 TLE
查看原帖
关于 TLE
420129
Nt_Tsumiki楼主2024/1/9 21:14

我也不知道怎么回事,直接 T 成勾了。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>

using namespace std;
int n,k,a[2000001];

inline int R() {
	int x = 0; char c = getchar(); while (!isdigit(c)) c = getchar();
	while (isdigit(c)) x = x * 10 + c - '0', c = getchar(); return x; 
}

struct Tree { int maxn,minn,maxtag,mintag; }t[8000001];

void build(int x,int l,int r) {
    t[x]={0,0,(int)1e9,0};
    if (l==r) return;
    build(x<<1,l,(l+r>>1)),build(x<<1|1,(l+r>>1)+1,r);
}

void pushdown(int x) {
    if (t[x].mintag) {
        t[x<<1].minn=max(t[x<<1].minn,t[x].mintag),t[x<<1].mintag=max(t[x<<1].mintag,t[x].mintag);
        t[x<<1].maxn=max(t[x<<1].maxn,t[x].mintag),t[x<<1].maxtag=max(t[x<<1].maxtag,t[x].mintag);
        t[x<<1|1].minn=max(t[x<<1|1].minn,t[x].mintag),t[x<<1|1].mintag=max(t[x<<1|1].mintag,t[x].mintag);
        t[x<<1|1].maxn=max(t[x<<1|1].maxn,t[x].mintag),t[x<<1|1].maxtag=max(t[x<<1|1].maxtag,t[x].mintag);
        t[x].mintag=0;
    }
    if (t[x].maxtag!=1e9) {
        t[x<<1].minn=min(t[x<<1].minn,t[x].maxtag),t[x<<1].mintag=min(t[x<<1].mintag,t[x].maxtag);
        t[x<<1].maxn=min(t[x<<1].maxn,t[x].maxtag),t[x<<1].maxtag=min(t[x<<1].maxtag,t[x].maxtag);
        t[x<<1|1].minn=min(t[x<<1|1].minn,t[x].maxtag),t[x<<1|1].mintag=min(t[x<<1|1].mintag,t[x].maxtag);
        t[x<<1|1].maxn=min(t[x<<1|1].maxn,t[x].maxtag),t[x<<1|1].maxtag=min(t[x<<1|1].maxtag,t[x].maxtag);
        t[x].maxtag=1e9;
    }
}

void updmin(int x,int l,int r,int L,int R,int k) {
    if (l==r) {
        t[x].minn=max(t[x].minn,k),t[x].mintag=max(t[x].mintag,k);
        t[x].maxn=max(t[x].maxn,k),t[x].maxtag=max(t[x].maxtag,k);
        return;
    }
    int mid=(l+r>>1); pushdown(x);
    if (L<=mid) updmin(x<<1,l,mid,L,R,k);
    if (R>mid) updmin(x<<1|1,mid+1,r,L,R,k);
    t[x].minn=min(t[x<<1].minn,t[x<<1|1].minn);
    t[x].maxn=max(t[x<<1].maxn,t[x<<1|1].maxn);
}

void updmax(int x,int l,int r,int L,int R,int k) {
    if (l==r) {
        t[x].maxn=min(t[x].maxn,k),t[x].maxtag=min(t[x].maxtag,k);
        t[x].minn=min(t[x].minn,k),t[x].mintag=min(t[x].mintag,k);
        return;
    }
    int mid=(l+r>>1); pushdown(x);
    if (L<=mid) updmax(x<<1,l,mid,L,R,k);
    if (R>mid) updmax(x<<1|1,mid+1,r,L,R,k);
    t[x].minn=min(t[x<<1].minn,t[x<<1|1].minn);
    t[x].maxn=max(t[x<<1].maxn,t[x<<1|1].maxn);
}

int ask(int x,int l,int r,int k) {
    if (l==r) return t[x].maxn;
    int mid=(l+r>>1); pushdown(x);
    if (k<=mid) return ask(x<<1,l,mid,k);
    else return ask(x<<1|1,mid+1,r,k);
}

int main() {
    n=R(),k=R();
    build(1,1,n);
    for (int i=1,t,l,r,h;i<=k;i++) {
        t=R(),l=R()+1,r=R()+1,h=R();
        if (t==1) updmin(1,1,n,l,r,h);
        else updmax(1,1,n,l,r,h);
    }
    for (int i=1;i<=n;i++) printf("%d\n",ask(1,1,n,i));
    return 0;
}
2024/1/9 21:14
加载中...