uvalive 4851 Restaurant(扫描法)

题意:有一个M*M的网格,坐标[0...M-1,0...M-1] 网格里面有两个y坐标相同的宾馆A和B,以及n个餐厅,宾馆AB里面各有一个餐厅,编号1,2,其他餐厅编号3-n,现在你打算新开一家餐厅,需要考察一下可能的位置,一个位置p是“好位置”的条件是:当且仅当对于已有的每个餐厅q,要么p比q离A近,要么p比q离B近,即dist(p,A) < dist(q,A) 或者 dist(p,B) < dist(q,B)  问“好位置”的个数

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#define eps 1e-6
#define LL long long
using namespace std;  

const int maxn = 50000 + 50;
const int maxm = 60000 + 50;
const int INF = 0x3f3f3f3f;
int borderl[maxm], borderr[maxm], rest[maxm];
int m, n, begx, endx, level;//begx,endx记录ab的横坐标 

void init() {
	memset(rest, -1, sizeof(rest));
	cin >> m >> n;
	int tx, ty;
	cin >> tx >> ty; rest[tx] = ty; begx = tx;
	cin >> tx >> ty; rest[tx] = ty; endx = tx;
	if(begx > endx) swap(begx, endx);
	level = ty;
	for(int i = 3; i <= n; i++) {
		cin >> tx >> ty;
		if(ty < level) ty = 2*level - ty;
		if(rest[tx] != -1) rest[tx] = min(rest[tx], ty);
		else rest[tx] = ty;
	}
}

void solve() {
	int ans = 0;
	borderl[begx] = borderl[endx] = level;
	borderr[begx] = borderr[endx] = level;
	for(int i = begx + 1; i < endx; i++) {
		if(rest[i] != -1) {
			borderl[i] = min(borderl[i-1]+1, rest[i]);
		}
		else {
			borderl[i] = borderl[i-1] + 1;
		}
	}
	for(int i = endx - 1; i > begx; i--) {
		if(rest[i] != -1) {
			borderr[i] = min(borderr[i+1]+1, rest[i]);
		}
		else {
			borderr[i] = borderr[i+1] + 1;
		}
	}
	for(int i = begx + 1; i < endx; i++)
		 ans += max(0, min(min(borderl[i], borderr[i]), m)-max(max(2*level-borderl[i], 2*level-borderr[i]), -1)-1);
	cout << ans << endl;
//	for(int i = begx + 1; i < endx; i++) cout << min(borderl[i], borderr[i]) << " " << rest[i] << endl;
}

int main() {
	//freopen("input.txt", "r", stdin);
	int t; cin >> t;
	while(t--) {
		init();
		solve();
	}
}



时间: 2024-10-12 19:32:35

uvalive 4851 Restaurant(扫描法)的相关文章

uvalive 4851

题意:有n个餐馆,其中两个餐馆a,b还是宾馆(纵坐标相等),在m*m的矩阵上建餐厅p,如果位置好,对于已存在的餐厅q(包括a和b),就会有dist(p,a) < dist(q,a) || dist(p,b) < dist(q,b) (曼哈顿距离),问矩阵上有多少个好的位置. 题解:直接暴力肯定超时,可以考虑一列一列的考虑,让A横坐标更小,从A的横坐标开始,到B的横坐标内所有位置有可能是好位置,然后计算出每列上已有餐厅到A的纵坐标最小距离存到d[i],然后从左到右更新一遍(每向右移动一次,最小距

UVALive 4848 Tour Belt

F - Tour Belt Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVALive 4848 Description Korea has many tourist attractions. One of them is an archipelago (Dadohae in Korean), a cluster of small islands sca

UVALive 6467 Strahler Order 拓扑排序

这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ 以后能用CIN还是CIN吧 QAQ 贴代码了: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostre

UVALive 7077 Little Zu Chongzhi&#39;s Triangles (有序序列和三角形的关系)

这个题……我上来就给读错了,我以为最后是一个三角形,一条边可以由多个小棒组成,所以想到了状态压缩各种各样的东西,最后成功了……结果发现样例过不了,三条黑线就在我的脑袋上挂着,改正了以后我发现N非常小,想到了回溯每个棍的分组,最多分5组,结果发现超时了……最大是5^12 =  244,140,625,厉害呢…… 后来想贪心,首先想暴力出所有可能的组合,结果发现替换问题是一个难题……最后T T ,我就断片了.. 等看了别人的办法以后,我才发现我忽视了三角形的特性,和把数据排序以后的特点. 如果数据从

Gym 100299C &amp;&amp; UVaLive 6582 Magical GCD (暴力+数论)

题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点时,我们对gcd相同的只保留一个,那就是左端点最小的那个,只有这样才能保证是最大,然后删掉没用的. UVaLive上的数据有问题,比赛时怎么也交不过,后来去别的oj交就过了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&qu

UVALive 6511 Term Project

Term Project Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ID: 651164-bit integer IO format: %lld      Java class name: Main 解题:强连通分量 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1

UVALive 6508 Permutation Graphs

Permutation Graphs Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ID: 650864-bit integer IO format: %lld      Java class name: Main 解题:逆序数 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long l

UVALive 2659+HUST 1017+ZOJ 3209 (DLX

UVALive 2659 题目:16*16的数独.试了一发大白模板. /* * @author: Cwind */ //#pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <map> #include <algorithm> #include <cstdio> #include <cstring> #include

UVALive 5545 Glass Beads

Glass Beads Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ID: 554564-bit integer IO format: %lld      Java class name: Main Once upon a time there was a famous actress. As you may expect, she played mostly