Gym

来源:互联网 发布:马其顿 知乎 编辑:程序博客网 时间:2024/06/05 13:23

这个题超级水吧,但是想做出来还是得花不少时间,一开始想着先排序,X小的在前面,互相交换各自SET里面的东西,这样每个SET数组的size就是能得到最后的总的东西了,这样的话数据量20万输入进SET大概400亿算了算不行,后来发现既然全都挨着为何不只存最大和最小呢,要是codeforce数据不水我肯定完,谨慎使用吧·1



但是自我认为这种思想很对。。。代码就是模拟过程

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <set>using namespace std;struct node{    int x,y;} no[100010];bool cmp(node a, node b){    return a.x < b.x;}set<int> se[200010];set<int>::iterator it;int main(){    int n,m;    scanf("%d%d",&n,&m);    for(int i = 0 ; i < n ; i++)    {        se[i].insert(i);    }    for(int i =0 ; i < m ; i ++)    {        scanf("%d%d",&no[i].x, &no[i].y);    }    sort(no,no+m,cmp);    for(int i =0 ; i < m ; i++)    {        int op = no[i].y;        int mmax1 = 0,mmin1 = 2000000;        int mmax2 = 0,mmin2 = 2000000;        for(it = se[op].begin(); it != se[op].end(); it++)        {            mmax1 = max(*it,mmax1);            mmin1 = min(*it,mmin1);        }        for(it = se[op-1].begin(); it != se[op-1].end(); it++)        {            mmax2 = max(*it,mmax2);            mmin2 = min(*it,mmin2);        }        int mmax = max(mmax1,max(mmax2,max(mmin1,mmin2)));        int mmin = min(mmax1,min(mmax2,min(mmin1,mmin2)));        se[op].clear();        se[op-1].clear();        se[op].insert(mmax);        se[op].insert(mmin);        se[op-1].insert(mmax);        se[op-1].insert(mmin);    }    for(int i = 0; i < n ; i++)    {        int mmax1 = 0,mmin1 = 2000000;        for(it = se[i].begin(); it != se[i].end(); it++)        {             mmax1 = max(*it,mmax1);            mmin1 = min(*it,mmin1);        }        int siz = mmax1-mmin1+1;        if(i == 0)            printf("%d",siz);        else            printf(" %d",siz);    }    return 0;}


原创粉丝点击