题目描述:给你n个人  并且给你m个区间 l 到 r,和x,表示这个区间剩下的人里获胜者是x,其他人出场剩x继续战斗  ,现在让你输出每人是被谁打败的(最后一个获胜者是0)
n, m (2 ≤ n ≤ 3·10^5; 1 ≤ m ≤ 3·10^5), li, ri, xi (1 ≤ li < rin; lixiri) 保证数据有效
分析: 开始想到了用并差集做,但没考虑好区间关系 导致无从下手,首先分析一个区间只有一个获胜者,那么再次查询到这个区间可以直接跳到这个区间的末尾去(此时并差集的根节点是下一个元素)
ac代码:
#include<bits/stdc++.h>
using namespace std;
int a[300001],b[300001];
int main(){
    memset(a,0,sizeof a);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) b[i]=i+1;
    while(m--){
        int x,y,z;
        cin>>x>>y>>z;
        int temp;
        for(int i=x;i<z;i=temp){
            temp=b[i];
            if(a[i]==0)a[i]=z;
            b[i]=z;
        }
        for(int i=z+1;i<=y;i=temp){
            temp=b[i];
            if(!a[i]) a[i]=z;
            b[i]=b[y];
        }
    }
    for(int i=1;i<=n;i++) {
        cout<<a[i];
        if(i!=n)cout<<' ';
        else cout<<endl;
    }
}