题目描述:给你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 < ri ≤ n; li ≤ xi ≤ ri) 保证数据有效
分析: 开始想到了用并差集做,但没考虑好区间关系 导致无从下手,首先分析一个区间只有一个获胜者,那么再次查询到这个区间可以直接跳到这个区间的末尾去(此时并差集的根节点是下一个元素)
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; } }