扔一些代码

#include<bits/stdc++.h>
using namespace std ;

#define pii pair<int,int>

const int Max = 25500 ;
const int MAX = 1e6+50 ;

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

struct Ques {
    int l , r , lim ;
} awa[Max] , mem[Max] ;
inline bool com(Ques a,Ques b) { return a.lim > b.lim ; }

int t[MAX] ;
bool p[MAX] ;
bool tree_check(int l,int r) {
    for(int i=l;i<=r;i++)
        if(!p[i]) return true ;
    return false ;
}
void tree_fill(int l,int r) {
    for(int i=l;i<=r;i++) p[i] = true ;
}

bool check(int n) {
    memset(p,0,sizeof(p)) ;
    for(int i=1;i<=n;i++) awa[i] = mem[i] ;
    sort(awa+1,awa+n+1,com) ;
    int tl , tr , tlm , trm ; bool p = true ;
    for(int i=1;i<=n;i++) {
        int l = awa[i].l , r = awa[i].r ;
        if(p) tl = l , tr = r , tlm = l , trm = r ;
        else {
            if(r<tlm||l>trm) return false ;
            tl = min(l,tr) ; tr = max(r,tr) ;
            tlm = max(l,tlm) ; trm = min(r,trm) ;
        }
        if(i!=n&&awa[i].lim==awa[i+1].lim) p = false ; 
        else { 
            p = true ; 
            if(!tree_check(tlm,trm)) return false ; 
            tree_fill(tl,tr) ; 
        }
    }
    return true ;
}

int main()
{
    int n = read() , q = read() ; 
    for(int i=1;i<=q;i++) { 
        awa[i].l = read() ; 
        awa[i].r = read() ; 
        awa[i].lim = read() ; 
        mem[i] = awa[i] ; 
    } 

    int l = 1 , r = q , ans = 0 ;
    while(l<=r) {
        int mid = (l+r)>>1 ;
        if(!check(mid)) ans = mid , r = mid-1 ;
        else l = mid+1 ;
    }
    cout << ans << endl ;
}
posted @ 2025-07-30 10:25  midsu  阅读(18)  评论(0)    收藏  举报