題目描述 有 n(1 \leq n \leq 10^5)n(1≤n≤105) 個小朋友,過年了,要發放 m(1 \leq m \leq 10^5)m(1≤m≤105) 次禮物。 每次發放,會給出三個參數 l,r,k(1 \leq l \leq r \leq n, 1 \leq k \leq 10^5 ...
題目描述
有 n(1 \leq n \leq 10^5)n(1≤n≤105) 個小朋友,過年了,要發放 m(1 \leq m \leq 10^5)m(1≤m≤105) 次禮物。
每次發放,會給出三個參數 l,r,k(1 \leq l \leq r \leq n, 1 \leq k \leq 10^5)l,r,k(1≤l≤r≤n,1≤k≤105) ,表示給區間 [l, r][l,r] 內的小朋友都發一個禮物 kk 。
所有禮物發放完成後,對於每一個小朋友,回答他接受的禮物中,出現次數最多的禮物是什麼。如果有多個,輸出編號最小的那個;如果不存在,輸出 -1−1 。
輸入輸出格式
輸入格式:
第一行兩個整數 n, mn,m ,意義如上所述。
接下來 mm 行,每行三個數 l,r,kl,r,k ,意義如上所述。
輸出格式:
一共 nn 行,每行一個數,表示答案。
輸入輸出樣例
輸入樣例#1: 複製6 3 1 5 1 2 3 2 3 4 2輸出樣例#1: 複製
1 1 2 1 1 -1
思路比較無腦,全是套路類的問題
按照小盆友的序號建權值線段樹
對於每個詢問差分一下
在樹上打標記,記錄最大值和最大值的位置
emmm以後要考慮考慮線段樹怎麼寫了,感覺用DFS序不僅記憶體小,還寫著順手
// luogu-judger-enable-o2 #include<iostream> #include<vector> #include<cstdio> using namespace std; const int MAXN=1e6+10; struct node { int l,r,ls,rs,mx,mxpos; }T[MAXN]; vector<int>v[MAXN]; int root,tot; void Build(int &k , int ll , int rr) { k=tot++; T[k].mx=0; T[k].l = ll ; T[k].r = rr; if( ll == rr ) { T[k].mxpos = ll; return ; } int mid=ll + rr >>1; Build( T[k].ls , ll , mid ); Build( T[k].rs , mid+1 , rr ); } void update(int k) { if( T[ T[k].ls ].mx >= T[ T[k].rs ].mx ) T[k].mx = T[ T[k].ls ].mx , T[k].mxpos = T[ T[k].ls ].mxpos; else T[k].mx = T[ T[k].rs ].mx , T[k].mxpos = T[ T[k].rs ].mxpos; } void Add(int k, int pos ) { if( T[k].l == T[k].r ) { T[k].mx++; return ; } int mid=T[k].l + T[k].r >>1; if(pos<=mid) Add( T[k].ls , pos ); else Add( T[k].rs , pos ); update(k); } void Delet(int k, int pos ) { if( T[k].l == T[k].r ) { T[k].mx--; return ; } int mid= T[k].l + T[k].r >>1; if(pos<=mid) Delet( T[k].ls , pos ); else Delet( T[k].rs , pos ); update(k); } int main() { #ifdef WIN32 freopen("a.in","r",stdin); #else #endif int N,M; scanf("%d%d",&N,&M); for(int i=1; i<=M ;i++ ) { int l,r,k; scanf("%d%d%d",&l,&r,&k); v[l].push_back(k); v[r+1].push_back(-k); } Build(root,1,N); for(int i=1; i<=N ;i++) { for(int j=0; j<v[i].size() ;j++ ) { // printf("*%d*",v[i][j]); if( v[i][j]>0 ) Add(root , v[i][j] ); if( v[i][j]<0 ) Delet(root , -v[i][j] ); } if( T[root].mx ) printf("%d\n",T[ root ].mxpos ); else printf("-1\n"); } return 0; }