Gym - 101158CDistribution Center

xiaoxiao2021-02-28  104

这个题超级水吧,但是想做出来还是得花不少时间,一开始想着先排序,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; }

转载请注明原文地址: https://www.6miu.com/read-51741.html

最新回复(0)