View Code of Problem 1071

#pragma warning(disable:4786)//使命名长度不受限制
#pragma comment(linker, "/STACK:102400000,102400000")//手工开栈
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <stack>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rds(x) scanf("%s",x)
#define rdc(x) scanf("%c",&x)
#define ll long long int
#define maxn 8005
#define mod 1000000007
#define INF 0x3f3f3f3f //int 最大值
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define MT(x,i) memset(x,i,sizeof(x))
#define PI  acos(-1.0)
#define E  exp(1)
using namespace std;
int tree[maxn<<2],c[maxn<<2],cnt[maxn<<2],ans[maxn<<2];
inline void pushdown(int st){
    int temp=st<<1;
    c[temp]=c[temp+1]=c[st];
    c[st]=-1;
}
void updata(int st,int left,int right,int L,int R,int id){
    if(L<=left&&R>=right){
        c[st]=id;
        return ;
    }
    if(c[st]==id)return;
    if(c[st]!=-1)pushdown(st);
    int m=(left+right)>>1;
    int temp=st<<1;
    if(L<=m)
        updata(temp,left,m,L,R,id);
    if(R>m)
        updata(temp+1,m+1,right,L,R,id);
}
void qurey(int st,int left,int right){
    if(c[st]>=0){
        FOR(i,left,right)
            cnt[i]=c[st];
        return;
    }
    if(left!=right&&c[st]==-1){
        int m=(right+left)>>1;
        int temp=st<<1;
        qurey(temp,left,m);
        qurey(temp+1,m+1,right);
    }
}
int main(){
    int n;
    while(rd(n)!=EOF){
        MT(c,-1);
        int a,b,c;
        FOR(i,1,n){
            rd2(a,b);rd(c);
            if(a>=b)continue;
            updata(1,1,8000,a+1,b,c);
        }
        MT(cnt,-1);
        qurey(1,1,8000);
        MT(ans,0);
        int i=1;
        while(i<maxn){
            int cc=cnt[i],j=i+1;
            if(cc==-1){++i;continue;}
            while(cnt[j]!=-1&&cnt[j]==cc&&j<maxn)++j;
            ++ans[cc];
            i=j;
        }
        FOR(i,0,maxn)
            if(ans[i])
                printf("%d %d\n",i,ans[i]);
        printf("\n");
    }
    return 0;
}
/*
5
0 4 4
0 3 1
3 4 2
0 2 2
0 2 3
4
0 1 1
3 4 1
1 3 2
1 3 1
6
0 1 0
1 2 1
2 3 1
1 2 0
2 3 0
1 2 1
*/

Double click to view unformatted code.


Back to problem 1071