UVa1359/LA3491 Hills

题目链接

         本题是2005年ICPC亚洲区域赛杭州欧赛区的H题

题意

        平面上有 n(n≤500)条线段,其中每条线段的端点都不会在其他线段上。你的任务是数一数有多少个“没有被其他线段切到”的三角形(即小山)。如下图所示,虽然有两个三角形,但其中一个被切到了,所以答案是1。

分析

        将每条线段作为两条有向线段做预处理:依次与其他线段求交点(用分数保存叉乘比值)同时保存逆时针夹角的余弦值,最后对多线段交于同一点时保留余弦值最小的那一段。

        预处理后,遍历并计数:依次遍历有向线段的每一最小分段,当恰好时三条不同线段的最小分段形成环时计数+1。答案是计数结果除以3。

AC代码

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;#define N 504
int x[N], y[N], vx[N], vy[N], c[2][N], n; double l[N];
struct frac {int p, q;bool operator== (const frac& rhs) const {return p*(long long)rhs.q - q*(long long)rhs.p == 0;}
};struct je {frac f, e; double t; int i;bool operator< (const frac& r) const {return f.p*(long long)r.q - f.q*(long long)r.p < 0;}bool operator< (const je& rhs) const {return f.p*(long long)rhs.f.q - f.q*(long long)rhs.f.p < 0;}
} a[2][N][N];void merge(je (&a)[N], int &c) {sort(a, a+c);int k = 0;for (int j=1; j<c; ++j) {if (a[k] < a[j]) a[++k] = a[j];else if (a[j].t < a[k].t) a[k].e = a[j].e, a[k].t = a[j].t, a[k].i = a[j].i;}c = ++k;
}int solve() {cin >> n;for (int i=0; i<n; ++i) {cin >> x[i] >> y[i] >> vx[i] >> vy[i];c[0][i] = c[1][i] = 0; vx[i] -= x[i]; vy[i] -= y[i];l[i] = sqrt(vx[i]*vx[i] + vy[i]*vy[i]);}for (int i=0; i<n; ++i) {for (int j=i+1; j<n; ++j) {int ux = x[i] - x[j], uy = y[i] - y[j];int p1 = vx[j]*uy - ux*vy[j], p2 = vx[i]*uy - ux*vy[i], q0 = vx[i]*vy[j] - vx[j]*vy[i], q = q0;if (q < 0) p1 = -p1, p2 = -p2, q = -q;if (p1 < 0 || p1 > q || p2 < 0 || p2 > q) continue;double t = (vx[i]*vx[j] + vy[i]*vy[j]) / l[i] / l[j];je &ef = a[0][i][c[0][i]++], &eb = a[1][i][c[1][i]++], &ff = a[0][j][c[0][j]++], &fb = a[1][j][c[1][j]++];ef.f.q = eb.f.q = ff.f.q = fb.f.q = q; ef.f.p = p1; eb.f.p = q-p1; ff.f.p = p2; fb.f.p = q-p2;if (q0 > 0) {ef.e = ff.f; eb.e = fb.f; ef.t = eb.t = t; ef.i = j; eb.i = j+n;ff.e = eb.f; fb.e = ef.f; ff.t = fb.t = -t; ff.i = i+n; fb.i = i;} else {ef.e = fb.f; eb.e = ff.f; ef.t = eb.t = -t; ef.i = j+n; eb.i = j;ff.e = ef.f; fb.e = eb.f; ff.t = fb.t = t; ff.i = i; fb.i = i+n;}}merge(a[0][i], c[0][i]); merge(a[1][i], c[1][i]);}int s = 0;for (int i=0; i<n; ++i) for (int j=0; j<2; ++j) for (int k=1; k<c[j][i]; ++k) {je &e = a[j][i][k]; int r = e.i < n ? 0 : 1, m = e.i < n ? e.i : e.i-n, t = c[r][m];je (&p)[N] = a[r][m]; int x = lower_bound(p, p+t, e.e) - p + 1;if (x == t) continue;je &b = p[x]; r = b.i < n ? 0 : 1; m = b.i < n ? b.i : b.i-n; t = c[r][m];je (&u)[N] = a[r][m]; x = lower_bound(u, u+t, b.e) - u + 1;if (x < t && u[x].i == j*n+i && u[x].e == a[j][i][k-1].f) ++s;}return s / 3;
}int main() {int t; cin >> t;for (int kase=1; kase<=t; ++kase) {cout << "Case " << kase << ':' << endl << solve() << endl;if (kase < t) cout << endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/259385.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VTK Python PyQt 监听键盘 控制 Actor 移动 变色

KeyPressInteractorStyle 在vtk 中有时我们需要监听 键盘或鼠标做一些事&#xff1b; 1. 创建 Actor&#xff1b; Sphere vtk.vtkSphereSource() Sphere.SetRadius(10)mapper vtk.vtkPolyDataMapper() mapper.SetInputConnection(Sphere.GetOutputPort()) actor vtk.vtkAc…

winprop二次开发

winprop二次开发 前言工具1——整合多个天线结果用途代码实现 工具2——wallman辅助工具需求代码实现功能实现参数输入实验 前言 工作需求&#xff0c;对该软件进行简单地二次开发&#xff0c;都是一些挺简单的代码&#xff0c;单纯是为了上传之后将其从本地删除 工具1——整…

嵌入式day24

开课复工啦~ 冲冲冲&#xff01; 文件IO&#xff1a; read函数和write函数&#xff1a; &#x1f4da; write 接口有三个参数&#xff1a; fd&#xff1a;文件描述符buf&#xff1a;要写入的缓冲区的起始地址&#xff08;如果是字符串&#xff0c;那么就是字符串的起始地址&…

算法学习系列(三十五):贪心(杂)

目录 引言一、合并果子&#xff08;Huffman树&#xff09;二、排队打水&#xff08;排序不等式&#xff09;三、货仓选址&#xff08;绝对值不等式&#xff09;四、耍杂技的牛&#xff08;推公式&#xff09; 引言 上一篇文章也说过了这个贪心问题没有一个规范的套路和模板&am…

第三十三回 镇三山大闹青州道 霹雳火夜走瓦砾场-python分割字符串

黄信和刘知寨押解宋江和花荣向青州走&#xff0c;碰到了燕顺等三人来劫囚车&#xff0c;黄信逃走了&#xff0c;刘知寨被抓住&#xff0c;被花荣一刀杀了。 黄信把情况报给青州知府&#xff0c;派来了青州兵马秦统制&#xff0c;人称霹雳火的秦明。秦明与花荣打&#xff0c;花…

UnityShader——06UnityShader介绍

UnityShader介绍 UnityShader的基础ShaderLab UnityShader属性块介绍 Properties {//和public变量一样会显示在Unity的inspector面板上//_MainTex为变量名&#xff0c;在属性里的变量一般会加下划线&#xff0c;来区分参数变量和临时变量//Texture为变量命名//2D为类型&…

如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口

在Qt框架中&#xff0c;要实现一个无标题栏、半透明、置顶&#xff08;悬浮&#xff09;的窗口&#xff0c;需要一些特定的设置和技巧。废话不多说&#xff0c;下面我将以DrawClient软件为例&#xff0c;介绍一下实现这种效果的四个要点。 要点一&#xff1a;移除标题栏&#…

SG5032EAN规格书

SG5032EAN 晶体振荡器结合了相位锁定环&#xff08;PLL&#xff09;技术和AT切割晶体单元&#xff0c;提供了73.5 MHz至700 MHz的广泛频率范围&#xff0c;以满足高速数字应用的需求。高性能的LV-PECL输出&#xff0c;2.5V和3.3V电源电压&#xff0c;可灵活适配不同设计的电源需…

vue3 之 商城项目—封装SKU组件

认识SKU组件 SKU组件的作用 产出当前用户选择的商品规格&#xff0c;为加入购物车操作提供数据信息&#xff0c;在选择的过程中&#xff0c;组件的选中状态要进行更新&#xff0c;组件还要提示用户当前规格是否禁用&#xff0c;每次选择都要产出对应的sku数据 SKU组件的使用 …

物奇平台DRC动态范围控制修改方法

物奇平台DRC动态范围控制修改 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 音频 DRC 是指动态范围控制(Dyna

suse15 sp3-sp5离线安装中安装FIO

没有网络的情况下&#xff0c;离线安装相对比较困难一点&#xff0c;所有需要提前下载相应的RPM安装包 FIO 安装包链接如下&#xff1a; Install package benchmark / fio 正常安装的时候&#xff0c;会出现问题 如下&#xff1a; google下 https://opensuse.pkgs.org/15.5/…

Spring Boot 笔记 024 登录页面

1.1 登录接口 //导入request.js请求工具 import request from /utils/request.js//提供调用注册接口的函数 export const userRegisterService (registerData)>{//借助于UrlSearchParams完成传递const params new URLSearchParams()for(let key in registerData){params.a…

IOS破解软件安装教程

对于很多iOS用户而言&#xff0c;获取软件的途径显得较为单一&#xff0c;必须通过App Store进行下载安装。 这样的限制&#xff0c;时常让人羡慕安卓系统那些自由下载各类版本软件的便捷。 心中不禁生出疑问&#xff1a;难道iOS世界里&#xff0c;就不存在所谓的“破解版”软件…

vue-自定义创建项目(六)

为什么要自定义创建项目&#xff1f; 因为VueCli默认创建的项目不能够满足我们的要求&#xff0c;比如默认的项目中没有帮我们集成路由&#xff0c;vuex&#xff0c;eslink等功能。 默认项目 自定义创建项目 流程&#xff1a; 创建项目命令&#xff1a;vue create custom_dem…

【嵌入式学习】IO网络接口day02.18

1.使用fgets统计给定文件的行数 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("./test1.txt","r"))NULL){perror("错误信息");return -1…

C语言从零实现贪吃蛇小游戏

制作不易&#xff0c;点赞关注一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一. 技术要点二、WIN32API介绍三、贪吃蛇游戏设计与分析 1.游戏开始前的初始化 2.游戏运行的逻辑 总结 前言 当我们掌握链表这样的数据结构之后&#xff0c;我们就可以用它来…

Go语言每日一练——链表篇(八)

传送门 牛客面试笔试必刷101题 ----------------两个链表的第一个公共结点 题目以及解析 题目 解题代码及解析 解析 这一道题使用的还是双指针算法&#xff0c;我们先求出两个链表的长度差n&#xff0c;然后定义快慢指针&#xff0c;让快指针先走n步&#xff0c;最后快慢指…

基于SSM的社区疫情防控管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的社区疫情防控管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spri…

拿捏c语言指针(中)

前言 书接上回 拿捏c语言指针&#xff08;上&#xff09; 此篇主要讲解的是指针与数组之间的爱恨情仇&#xff0c;跟着我的脚步一起来看看吧~ 创造不易&#xff0c;可以帮忙点点赞吗 如有差错&#xff0c;欢迎指出 理解数组名 数组名是首元素地址 例外 1.sizeof&#xff0…

C#使用迭代器实现文字的动态效果

目录 一、涉及到的知识点 1.GDI 2.Thread类 3.使用IEnumerable()迭代器 二、实例 1.源码 2.生成效果&#xff1a; 一、涉及到的知识点 1.GDI GDI主要用于在窗体上绘制各种图形图像。 GDI的核心是Graphics类&#xff0c;该类表示GDI绘图表面&#xff0c;它提供将对象绘制…