codeforces Kojiro and Furrari

15 篇文章 1 订阅
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
#include<bitset>
#include<stack>
using namespace std;


#pragma comment(linker, "/STACK:1024000000,1024000000")
#define inf 0x3f3f3f3f
#define eps 1e-9
#define pii pair<int,int>
#define MP make_pair
#define LL  long long
#define ULL unsigned long long 
#define N ( 1000000 + 10 )
#define M ( 200000 + 10)
#define mod  1000000007

int num[5][N];
int san[N];
int cnt;
int dp[5][N];

 int haxi(int x) {
	return lower_bound(san, san+cnt, x) - san;
}

struct node{
	int x, t;
}t[N];
int f[N];
int dis[4];
int main( ){
	int e, s, n, m;
	scanf("%d%d%d%d", &e, &s, &n, &m);
	cnt = 0;
	san[cnt++] = e;
	for(int i = 1; i <= n; ++i) { 
		scanf("%d%d", &t[i].t, &t[i].x);
		san[cnt++] = t[i].x;
		san[cnt++] = t[i].x + s;
	}
	for(int i = 1; i <= m; ++i) {
		scanf("%d", &f[i]);
		san[cnt++] = f[i];
		san[cnt++] = f[i] + s;
	}
	sort(san, san+cnt);
	cnt = unique(san, san+cnt) - san;

	for(int i = 1; i <= n; ++i) {
		int l = haxi(t[i].x), r = haxi(t[i].x+s);
		for(int j = t[i].t; j >= 1; --j)
			num[j][l] ++, num[j][r] -- ;
	}

	for(int i = 1; i <= 3; ++i) {
		for(int j = 1; j < cnt; ++j) {
			num[i][j] += num[i][j-1];
			if(num[i][j-1]) dp[i][j] = dp[i][j-1] + san[j] - san[j-1];
			else dp[i][j] = dp[i][j-1];
		}
	}

	int ed = haxi(e);
	for(int i = 1;i  <= m; ++i) {
		int st = haxi(f[i]+s);
		if(st >= ed) {
			printf("0 0\n");
			continue;
		}
		int len = san[ed] - san[st];
		int ans1, ans2;
		for(int j = 1; j <= 3; ++j)
			dis[j] = dp[j][ed] - dp[j][st];// printf("j %d dis %d\n",j, dis[j]);
		if(dis[3] >= len)
			ans1 = ans2 = 0;
		else if(dis[2] >= len) {
			ans1 = 0;
			ans2 = dis[2] - dis[3];
		}
		else if(dis[1] >= len) {
			ans1 = dis[1] - dis[2];
			ans2 = dis[1] - dis[3] - ans1;
		}
		else ans1 = ans2 = -1;
		printf("%d %d\n", ans1, ans2);
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值