啦啦啦我ysw又回来啦!之后大概会准备打acm,暑假尽量复习复习,因为已经快两年没碰oi了,最多也就高三noip前学弟学妹出题讲题,所以从这一篇blog开始大概会有一系列“打基础”的blog,既是复习也是重新学一遍叭~高中的时候学得就不太扎实


题意:对于一个任何三条对角线不会交于同一点的凸$n$边形,问对角线交点个数,$n\leq 10^5$。

例如$n=6$的情形下答案为15

 

 
我来丢人啦(下面将呈现我当时整个思考过程…)
凸多边形相关的计数我们其实处理过不少,嗯比如我们如果从$n$个点中任取2个点,整个图形一共有$C_{n}^2=\frac{1}{2} n(n-1)$条边,去掉凸多边形自己一圈$n$条边,就得到对角线的条数:$\frac{1}{2}n(n-1)-n=\frac{1}{2}n(n-3)$
嗯…那我们要交点数,哦吼!那我们让对角线数*(对角线数-1)是不是就是答案了呢!等一下似乎不太对,因为这样相当于认为每条对角线都和其他对角线有交点(确实如果认为对角线是“直线”那就是这么回事了)但这题似乎是要我们对多边形内部的点计数,而一些对角线可能在多边形内部没交点(看图不难发现)…嗯那这个东西好像没什么卵用呢(
 
也许可以试试欧拉示性数定理?(平面内点数、边数、面数关系)但是面数好像更难搞…算了算了
 
嗯记住我们要求交点数…前面做法不行的原因在于处理不了那些没交点的情形,去对没交点的那些边的组合进行计数似乎更加困难…
等一下关于凸多边形我们好像还有一些处理方法

似乎我们可以随意给一个端点编号为1,按照逆时针/顺时针顺序依次编号$1,2,3……n$,这样一来我们可以先只考虑以点1为其中一个端点出发的所有对角线(图中红线)对应的交点,这个问题似乎好处理了许多,因为如果另一条对角线要和它有交点(蓝线)当且仅当蓝线的两个端点在红线的两侧!(嗯!这不就是计算几何里面判断直线是否有交点的方法嘛!?)

于是我们想,对于编号为$k$的点,1~k内从点2到点$k-1$是可以作为其中一个起点的,一共是$k-1-2+1=k-2$个点,同样的另一侧从$k+1$到$n$可以作为对角线另一点,一共是$n-(k+1)+1=n-k$个点

乘法原理得到$(k-2)(n-k)$,接着只要对所有情形进行求和就行了,对于$k$来说最小取到3(2的话就不是对角线了),最大取到$n-1$

所以对于以任意一点为端点的所有对角线的交点便是:$m=\sum_{k=3}^{n-1}(n-k)(k-2)$,对$n$个点进行同样的操作就得到$nm$,而注意到如果这样写,每个交点对应两条对角线的四个端点都作为了一次起点,也就是说每个交点都被算了四次,所以我们要的答案应该是$ans=\frac{1}{4}nm$,式子推出来啦!


接着就可以编程求解了…首先整个问题的时间复杂度是$O(n)$,轻轻松松通过,不过我们注意到对应答案的上界是$O(n^3)$级别的也就是$10^{15}$级别的差不多,一开始我只开了个long long交上去然后挂了两个点…后面改成unsigned long long 就过了…emm好吧


话说回来我们再回头看看那个和式$m=\sum_{k=3}^{n-1}(n-k)(k-2)$,好像我们并不陌生呀!

里面展开就是$nk-2n-k^2-2k$我们对k求和就稍微整理一下变成$\sum_{k=3}^{n-1}[k(n-2)-2n-k^2]$,嗯第一项是等差数列,第二项是对于$k$的常数列,第三项是平方和,我们有结论$\sum_{k=1}^{n}k^2=\frac{1}{6}n(n+1)(2n+1)$,对于这题只要改个$n$再扣掉前两项就行

整个和式拆开再化简就得到这题的答案可以写成:

$\frac{n}{4}[\frac{1}{2}(n+2)^2-2(n^2-3n)-\frac{1}{6}n(n-1)(2n-1)+5]$

整个问题变成$O(1)$的复杂度啦!~(虽然好像没什么用,哈哈哈)

[打基础]luogu2181对角线——计数原理的更多相关文章

  1. STM32F4_TIM基本延时(计数原理)

    Ⅰ.概述 STM32的TIM定时器分为三类:基本定时器.通用定时器和高级定时器.从分类来看就知道STM32的定时器功能是非常强大的,但是,功能强大了,软件配置定时器就相对复杂多了.很多初学者甚至工作了 ...

  2. Luogu 1351 NOIP 2014 联合权值(贪心,计数原理)

    Luogu 1351 NOIP 2014 联合权值(贪心,计数原理) Description 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi, ...

  3. 【计数原理】【UVA11538】 Chess Queen

    传送门 Description 给你一个n*m的棋盘,在棋盘上放置一黑一白两个皇后,求两个皇后能够互相攻击的方案个数 Input 多组数据,每组数据包括: 一行,为n和m 输入结束标志为n=m=0. ...

  4. Objective-C 引用计数原理

    http://www.cocoachina.com/ios/20160112/14933.html 引用计数如何存储 有些对象如果支持使用 TaggedPointer,苹果会直接将其指针值作为引用计数 ...

  5. oc引用计数原理-引用计数相关变化

    http://blog.csdn.net/null29/article/details/71191044 在 32 位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的 Retain 操作,实 ...

  6. polay计数原理

    公式: Burnside引理: 1/|G|*(C(π1)+C(π2)+C(π3)+.....+C(πn)): C(π):指不同置换下的等价类数.例如π=(123)(3)(45)(6)(7),X={1, ...

  7. 数学计数原理(Pólya):POJ 1286 Necklace of Beads

    Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7763   Accepted: 3247 ...

  8. 组合数学(Pólya计数原理):UvaOJ 10601 Cubes

    Cubes You are given 12 rods of equal length. Each of them is colored in certain color. Your task is ...

  9. 数学计数原理(Pólya,高精度):SGU 294 He's Circles

      He's Circles He wrote n letters "X" and "E" in a circle. He thought that there ...

随机推荐

  1. springboot同一项目部署多实例

    添加 -Dserver.port=xxxx 将配置文件放在nacos注册中心时,要记得在启动第二个实例记得把原来端口注释掉,如果配置文件在本地就不必注释掉了

  2. 深度分析:Java多线程,线程安全,并发包

    1:synchronized(保证原子性和可见性) 1.同步锁.多线程同时访问时,同一时刻只能有一个线程能够访问使synchronized修饰的代码块或方法.它修饰的对象有以下几种: 修饰一个代码块, ...

  3. 【JAVA基础】数组练习案例一

    /* * * 输入5个学生成绩 * 计算出每个成绩与最高分的差距 * 根据差距分配等级 * * */ import java.util.Scanner; public class ArrayTask ...

  4. Guitar Pro小课堂之如何演奏刮弦

    每当我们听到吉他现场演出的时候,看到吉他手在激烈的刮弦时,都觉得很酷,非常有感染力.刮弦在我们弹吉他或编曲时,会经常用到,虽然时间很短,但会为你加分不少. 那么我们应该如何演奏刮弦呢,我们先用E5和弦 ...

  5. 自定义JSTL Tag

    <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java ...

  6. Spring 源码阅读环境的搭建

    前言 本文记录了 Spring 源码环境的搭建方式,以及踩过的那些坑!​当前版本:5.3.2-SNAPSHOT. 环境准备 Git JDK master 分支需要 JDK 11 5.2.x 分支, J ...

  7. C语言讲义——数组

    数组是: 一组数据 一组类型相同的数据 在计算机底层,数组是一块连续的内存 为什么使用数组? 一年12个月 int m1=1, m2=2, m3=3, ... 麻烦 数组示例: #include &l ...

  8. Django之数据库--ORM

    一.建立数据库模型类 1.在model里创建模型类.(继承models.Model) from django.db import models # Create your models here. c ...

  9. 欢迎使用CSDN-markdown编辑器(这个只能看到一次保存一下)

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接 ...

  10. 第15.47节、PyQt显示部件:QGraphicsView图形视图和QGraphicsScene图形场景简介及应用案例

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 Designer中的Graphics V ...