Gym101158C Distribution Center(思维)

Gym101158C-Distribution Center

题意

n条传送带,m个机械臂。给出m个机械臂的坐标,问每个库存能接收多少种货物

思路

稍作思考可以得到这样的结论,实际上相邻的传送带一定可以传送,至少可以有两种货物。然后由于对称性,可以维护上下两路的最远距离。如何维护?采取如下策略:

  • 按照距传送带开始的距离进行排序,因为传送带的运行是有方向性的。
  • 向上向下维护当前最远距离。对于x距离来讲,维护的是当前上方能到达的最远距离。对于y来讲维护的是当前下方能到达的最远距离

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
int T;

const int MAXN = 2e5+10;
struct Node{
	int x;
	int y;
}p[MAXN],l[MAXN];

int n,m;

void init(){
	memset(p,0,sizeof(p));
	for(int i=0;i<MAXN;i++)	l[i].x = l[i].y = i;
}

int cmp1(Node a,Node b){
	return a.x<b.x;
}

int main() {
    init();
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++)	scanf("%d %d",&p[i].x,&p[i].y);
    sort(p+1,p+m+1,cmp1);
	for(int i=1;i<=m;i++){
		int cur = p[i].y;
		l[cur].x = l[cur+1].x = min(l[cur].x,l[cur+1].x );
		l[cur].y = l[cur+1].y = max(l[cur].y,l[cur+1].y );
	}
	for(int i=1;i<=n;i++){
		//printf("%d ",l[i].y);
		printf("%d ",l[i].y-l[i].x+1);
	}
}

posted @ 2018-09-12 21:03  caomp  阅读(198)  评论(0)    收藏  举报