Huge Matrix 扫描

来源:互联网 发布:姚明nba前几场比赛数据 编辑:程序博客网 时间:2024/06/05 16:03

题目大意

一个n*m的矩阵, 往上面填数字, 每行给出三个数字l, r, a, 代表这行中[l, r]区间中填数字a, 剩下的位置都是0
1<=n,m<=1e5
1<=k<=10
1<=a<=k
求每一列中不同数字的个数最多是多少

思路

这题tags 是Sweep Line (Iteration), 仔细想想还真像扫描线…
我们记录每一列每个数字出现的次数
把每一行分成三个区间, [1,l), [l, r+1), [r+1, m); 这三个区间的数字分别是0, a, 0
所以对于区间[l, r), 数字为c, 我们在l位置标记数字c+1, 表示之后的位置数字c出现次数+1, 在r位置标记数字c-1, 表示r之后的位置数字c出现次数-1
把所有区间都标记上去后, 从头到尾扫一遍, 得出每一列出现的数字个数, 求最大值就好了

代码

#include <bits/stdc++.h>using namespace std;const int MAXN = 1E5+100;int n, m, k, l, r, a, add[MAXN][20];int main(){    scanf("%d%d", &n, &m);    for(int i=1; i<=n; ++i)    {        scanf("%d%d%d", &l, &r, &a);        ++add[1][0];        --add[l][0];        ++add[l][a];        --add[r+1][a];        ++add[r+1][0];    }    int ans = 0;    for(int i=1; i<=m; ++i)    {        int tans = 0;        for(int j=0; j<=10; ++j)         {            add[i][j] += add[i-1][j];            if(add[i][j]) ++tans;        }        ans = max(tans, ans);    }    cout << ans <<endl;    return 0;}
原创粉丝点击