码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷T21778 过年

时间:2018-02-11 00:12:58      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:个数   sort   vector   getc   amp   else   out   ras   发放   

T21778 过年

题目描述

有 n(1 \leq n \leq 10^5)n(1≤n≤10
5
) 个小朋友,过年了,要发放 m(1 \leq m \leq 10^5)m(1≤m≤10
5
) 次礼物。

每次发放,会给出三个参数 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≤10^5) ,表示给区间 [l, r][l,r] 内的小朋友都发一个礼物 k 。

所有礼物发放完成后,对于每一个小朋友,回答他接受的礼物中,出现次数最多的礼物是什么。如果有多个,输出编号最小的那个;如果不存在,输出 -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


线段树每一个节点维护一个pari,表示出现次数和出现的数是多少
每一个询问差分一下,区间结束把它减掉。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<vector>
#include<cstring>
#include<queue>
#include<bitset>
using namespace std;
const int maxn=1e5+23333;
typedef long long ll;
typedef pair<int,int> par;
inline int read(){
    int an=0,f=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch<=‘9‘&&ch>=‘0‘){an=an*10+(ch^48);ch=getchar();}
    return an*f;
}
int n,m,tot;
struct saber{
int l,r,k;
}b[maxn],c[maxn];
par operator +(par x,par y){
    return (x.first<y.first?y:x);
}
struct Tree{
int l[maxn<<2],r[maxn<<2];
par p[maxn<<2];
    inline void build(int k,int x,int y){
        l[k]=x,r[k]=y;p[k].second=x;
        if(x==y){return;}
        int mid=x+y>>1;
        build(k<<1,x,mid);
        build(k<<1|1,mid+1,y);
    }
    inline void add(int k,int x,int val){
        if(l[k]==r[k]){p[k].first+=val;return;}
        int mid=l[k]+r[k]>>1;
        if(x<=mid)add(k<<1,x,val);
        else add(k<<1|1,x,val);
        p[k]=p[k<<1]+p[k<<1|1];
    }
    inline void insert(int x){add(1,x,1);}
    inline void erase(int x){add(1,x,-1);}
    inline void query(){
        if(p[1].first)cout<<p[1].second<<"\n";
        else cout<<"-1\n";
    }
}t;
bool operator < (saber x,saber y){
    return x.l<y.l;
}
inline bool cmp(saber x,saber y){
    return x.r<y.r;
}
inline void parpare(){
    n=read();m=read();
    for(int i=1;i<=m;i++){
        b[i].l=read();b[i].r=read();b[i].k=read();
        c[i]=b[i];
    }
    sort(b,b+1+m);
    sort(c+1,c+1+m,cmp);
    t.build(1,0,1e5);
}
inline void work(){
    int j=1,k=1;
    for(int i=1;i<=n;i++){
        while(b[j].l==i&&j<=m)t.insert(b[j].k),j++;
        while(c[k].r==i-1&&k<=m)t.erase(c[k].k),k++;
        t.query();
    }
}
int main(){
    ios::sync_with_stdio(0);
    parpare();
    work();
    return 0;
}

只有一个测试点,而且还修正一次..

洛谷T21778 过年

标签:个数   sort   vector   getc   amp   else   out   ras   发放   

原文地址:https://www.cnblogs.com/ck666/p/8439979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!