ZOJ 2967 Colorful Rainbows 【Stack】
解决此题方法类似于凸包,先把所有直线按照斜率a由小到大排序
斜率相同取b较大的,扔掉b小的 (可以在遍历的时候忽视)。
于是所有直线斜率不同。 准备一个栈 (手动模拟),
栈里面存放上一次能看到的“最上面”的直线以及这条直线能看到的范围x (x值右边的部分可以被看到)。
初始时,把斜率最小的直线入栈,并记录x值为-inf。然后对第i条直线, 所做的是用第i条直线和栈顶直线求交点x,如果这个x值不大于栈顶的x值,
则把栈顶元素弹出,继续求交,否则退出。
这种判断操作直到栈为空,
或者当前栈顶的x值大于栈顶的x值。然后把第i条直线入栈,
继续,看后面的直线。最后栈中的直线数就是能看到的。
这种做法类似于凸包的方法,除去排序外,每条直线至多出入栈一次 复杂度O(n)。总复杂度是O(nlogn)。
Source Code:
//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
#include <stack>
#include <string>
#include <map>
#include <set>
#include <list>
#include <queue>
#include <vector>
#include <algorithm>
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
#define MOD 1000000007
#define pi acos(-1.0) using namespace std; typedef long long ll ;
typedef unsigned long long ull ;
typedef unsigned int uint ;
typedef unsigned char uchar ; template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;}
template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;} const double eps = 1e- ;
const int N = ;
const int M = * ;
const ll P = 10000000097ll ;
const int MAXN = ;
const double MINN = -999999999.9; int n; struct Line{
double a, b;
}line[]; struct Point{
int ID;
double x; //Crossover point
}point[]; bool cmp (Line a , Line b){
if(a.a != b.a) return a.a < b.a ;
return a.b > b.b;
} int main(){
int i, j, t, k, u, v, numCase = ;
cin >> t;
while (t--){
int sum = ;
cin >> n;
for (i = ; i < n; ++i) {
cin >> line[i].a >> line[i].b;
}
sort (line , line + n, cmp); point[sum].ID = ;
point[sum].x = MINN; for (i = ; i < n; ++i) {
if (Abs (line[i].a - line[point[sum].ID].a) < eps) continue; //Equal slope will be ignored
for (;;) {
if (sum < ) {
++sum;
point[sum].ID = i;
point[sum].x = MINN;
break;
}
double x = (line[point[sum].ID].b - line[i].b) / (line[i].a - line[point[sum].ID].a);
if (point[sum].x + eps > x) {
--sum;
} else {
++sum;
point[sum].ID = i;
point[sum].x = x;
break;
}
}
}
printf("%d\n", + sum);
} return ;
}
以下是另一种 O(n lg n) 的算法 @Sake
对于直线l1: y = a1x +b1 和直线l2: y = a2x + b2,假设 a2 > a1,同时已知l1和前面面
一一个斜率更小小的交点横坐标为x1,则l2和l1的交点横坐标为x2,如果x2 < x1,那么l2可以覆盖
l1的可⻅见段。这样对于l2处理栈中的栈顶直线,若可以覆盖,栈顶弹出,循环直到栈中只有一一条直线或者不能继续覆盖,最后将这条直线压入入栈。对于只有1条或者2条直线的情况,特殊处理即可。
效率为O(n lg n)。
当然这题,可以按题⺫目目描述模拟暴力力O(n^2)过。
/*
Author:
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
sakeven
<cstdio>
<cstdlib>
<cassert>
<iostream>
<algorithm>
<queue>
<stack>
<cmath>
<cstring>
using namespace std;
struct node{
double a,b;
}lines[];
struct point{
int index;
double x;
point(){}
point(int index, double x):index(index), x(x){}
};
bool cmp(const node &A, const node &B){
return A.a < B.a || (A.a == B.a && A.b < B.b);
}
int main(){
int t, n;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = ; i < n; i ++) {
scanf("%lf%lf", &lines[i].a , &lines[i].b);
}
sort(lines, lines+n, cmp);
int k = ;
for (int i = ; i < n-; i ++) {
if (lines[i].a == lines[i+].a) {
continue;
}
lines[k++] = lines[i];
}
lines[k++] = lines[n-];
if (k <= ) {
printf("%d\n", k);
continue;
}point p;
stack<point>st;
st.push(point(, ));
st.push(point(, (lines[].b - lines[].b)/(lines[].a - lines[].a)));
for (int i = ; i < k; i ++) {
double x();
while (st.size() > ) {
p = st.top();
x = (lines[p.index].b - lines[i].b)/(lines[i].a - lines[p.index].a);
if (x <= p.x) {
st.pop();
if (st.size() == ) {
x = (lines[].b - lines[i].b)/(lines[i].a - lines[].a);
break;
}
} else {
break;
}
}
st.push(point(i, x));
}
printf("%lu\n", st.size());
}
return ;
}
ZOJ 2967 Colorful Rainbows 【Stack】的更多相关文章
- ZOJ 2967 Colorful Rainbows
暴力. 先删掉一些边,平行的线只保留$b$最大的.然后暴力,每次放入第$i$条边,和还没有被完全覆盖的边都算一遍,更新一下. #pragma comment(linker, "/STACK: ...
- hdu 1237 简单计算器 (表达式求值)【stack】
<题目链接> 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符, ...
- ZOJ 3959 Problem Preparation 【水】
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3959 AC代码 #include <cstdio> ...
- ZOJ 3958 Cooking Competition 【水】
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3958 AC代码 #include <cstdio> ...
- ZOJ - 4020 Traffic Light 【BFS】
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4020 题意 给出一张地图 以及起点和终点 求是否能从起点走到终点 ...
- ZOJ - 3930 Dice Notation 【模拟】
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3930 题意 给出一串字符串 如果是 '+' '-' '*' '/ ...
- ZOJ - 3866 Cylinder Candy 【数学】
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3866 思路 积分 参考博客 https://blog.csdn. ...
- ZOJ - 3948 Marjar Cola 【循环】
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3948 题意 用 x 个 瓶身 可以 换 一瓶饮料 用 y 个 瓶 ...
- CF 286(div 2) B Mr. Kitayuta's Colorful Graph【传递闭包】
解题思路:给出n个点,m条边(即题目中所说的两点之间相连的颜色) 询问任意两点之间由多少种不同的颜色连接 最开始想的时候可以用传递闭包或者并查集来做,可是并查集现在还不会做,就说下用传递闭包来做的这种 ...
随机推荐
- Python开发环境Spyder安装方法
Spyder(Scientific PYthon Development EnviRonment)是一个强大的交互式 Python 语言开发环境,提供高级的代码编辑.交互测试.调试等特性,支持包括 W ...
- Myeclipse安装Activiti
1.将压缩包内activiti文件夹放入Myeclipse\dropins文件夹内并修改activiti文件夹内Link文件指向自己的目录重启Myeclipse(这时打开bpmn文件仍会报错).2.将 ...
- Spring Boot使用Druid和监控配置
Spring Boot默认的数据源是:org.apache.tomcat.jdbc.pool.DataSource 整体步骤: (1) -- Druid简单介绍,具体看官网: (2) ...
- 基于Visual C++2013拆解世界五百强面试题--题8-数组的排序和查找
用三种方法实现对一个数组的排序,并设计一个函数实现数的查找,要求时间越短越好,空间占用越少越好. 对数组排序的方法很多,我们选比较常用和容易的三种排序,直接插入排序,冒泡排序和快速排序. 直接插入排序 ...
- Java中String、StringBuilder以及StringBuffer
原文出处: 海子 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffe ...
- USB设备在连接PC时的reset从何而来?
近期在做烧写工具的优化工作,有一些关于USB的内容须要总结一下当中包含设备的初始化过程和枚举过程. 在枚举的过程中,设备会一直等PC端的状态,当等到reset命令时会对设备进行又一次枚举.可是这个re ...
- uva 1561 - Cycle Game(推理)
option=com_onlinejudge&Itemid=8&page=show_problem&problem=4336" style=""& ...
- JavaScript中的事件处理程序
JavaScript和HTML之间的交互是通过事件实现的.事件,就是文档或者浏览器窗口中发生的一些特定的交互瞬间.可以使用事件处理程序来预订事件,以便在事件发生的时候执行响应的代码.这种观察者模式的模 ...
- Enze Third day(c#中选择结构【if...else】)
哈喽,又到了我总结课堂知识的时间了.今天在云和学院学的是C#中的“选择结构”下的If语句.下面就来总结一下今天所学的吧. 理论:If语句是最常用的选择结构语句.它主要根据所给定的条件(常由关系表达式和 ...
- Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图
Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图 在本节中,您需要修改HelloWorldController类,从而使用视图模板文件,干净优雅的封装生成返回到客户端浏览器HTML ...