2016 Hunan Province Programming Contest

A. 2016

题意

  • \(1 \le a \le n, 1 \le b \le m\) ,其中\(1 \le n,m \le 10^9\)
  • 求正整数\((a,b)\)对的数量,满足\(ab \% 2016 = 0\)

思路

  • \(2016=2^53^27\)
  • 根据\(a\)对因子的贡献对\(a\)分类,每种方案数对应\(b\)的数量,即\[\lfloor \frac{m}{\frac{2016}{a}} \rfloor\]
  • 那么剩下的就是求每类\(a\)的数量,这个容斥一下即可。

代码


B. 有向无环图

题意

  • 给一张有\(N(N \le 10^5)\)个点,\(M(M \le 10^5)\)条边的DAG
  • 求\[\sum_{i=1}^{n}{\sum_{j=1}^{n}{count(i,j)a_ib_j\%(10^9+7)}}\],其中\(count(i,j)\)表示点i到点j不同的路径数量。

思路

  • \(a_i\)表示从i出发的每条边都要加上的权值,\(b_i\)则表示到达i的每条边的权值。
  • 按照拓扑序转移下即可,注意要记忆化

代码


D.Toll

题意

思路

  • 算几何题吧,求一个凸包的面积,当然需要一些预处理。

代码


E.最长上升子序列

题意

  • 给一个长度为\(N(N \le 10^5)\)的全排列,有些位置被挖掉,用0表示。
  • 现在可以用被挖掉的值来填充0的位置,使得最后序列的最长上升子序列为\(N-1\),求方案数。

思路

  • 显然,如果|位移|>1的数大于1个,则无解,返回0即可。
  • 如果|位移|>1的数(设为\(x,p[x]\)表示位置)只有1个,那么最后的方案数已经固定,需要判断:
  1. \(x\)和\(p[x]\)之间的数满足位移情况,就是\(x\)若往右跳,则中间的数要左移。
  2. 两边的数不能出现有位移的数。
  • 如果没有|位移|>1的数,则判断位移1和位移-1的位置,以位移为1来说:
  1. 此时有两种情况,这些数是被动移动的,或者此时位移1的数只有一个,但是是主动移动的,而这种情况可以视为前一种情况处理。
  2. 找出位移1的所有位置,设\(L\)为最左的位置,\(R\)为最右的位置。
  3. 首先\(1\verb'~'L-1\)和\(R+1\verb'~'N\)是不能出现有位移的数,并且\(L\verb'~'R\)也不能有保持原位的数,否则无解;
  4. 假设与\(L\)相邻的连续0的个数为\(x\),\(R\)位置为\(y\),则可以让\([R,R+y]\)放置于\([L-x,L-1]\)位置上,则方案数有\(x(y + 1)\)种。
  5. 两个数相邻(如\(32\))的情况需要特判。
  • 如果上述情况都没发生,则说明其余位置要么保持原位,要么是0。
  1. 对于一段连续的0的段,显然这中间的数不会越位到该段之外,比如\(0,2,0,0\)中的数1不会出现在\(3,4\)位置上,否则\(2\)会发生位移。所以若最后上升序列长度为\(N-1\),则该段上升序列长度为\(L-1\),其余位置保持原位,即变成了原问题的子问题。
  2. 用\(f[i]\)表示全0段长度为i且最长上升子序列长度为\(i-1\)的方案数。
  3. 递推式:\(f[i]=2f[i-1]+2-f[i-2]\)
  4. 但事实上,\(f[i]=(i-1)^2\)
  • 可以自己多试一些小数据,比如\(0,0,2,0\)这样子的数据。

代码


F.地铁

题意

  • 有\(N(N \le 10^5)\)个地铁站,\(M(M \le 10^5)\)条地铁路线。
  • 每条路线需花费时间\(t_i\),属于\(c_i\)号线。
  • 换乘路线需要花费额外的\(|c_i-c_j|\)的时间。
  • 求从地铁站\(1\)到\(N\)最少花费时间。

思路

  • 最暴力的做法是,对于每个点连接的边,按\(c_i\)两两连边,时间花费为\(|c_i-c_j|\),但这样菊花状的图就做不了了。
  • 对于每个点,将其连边按照\(c_i\)从小到大构建新的点即可,最后跑遍单源最短路即可。

代码


H.Reverse

题意

  • 给一个长度为\(N(N \le 10^5)\)的数。
  • 求\[\sum_{i=1}^{n}{\sum_{j=1}^{n}{R(i,j)}}\%(10^9+7)\] \(R(i,j)\)表示将区间\([i,j]\)翻转后新的数。

思路

  • 考虑每个位置\(i\)对答案的贡献,即计算其他位置上的数到位置\(i\)的次数和当前位置的数不发生改变的次数。
  • 可以观察到,出现次数的规律为\(1,2,...,i-1,i,i,i,....,i,i-1,...,2,1\)
  • 即\([1,i]\)出现次数递增到\(i\),\([i,n-i+1]\)均为\(i\),\([n-i+1,n]\)则从\(i\)递减到\(1\)
  • 位置不变则选取的区间在\([1,i)\)和\((i,n]\)内。

代码


I.Tree Intersection

题意

  • 给一棵\(N(N \le 10^5)\)个点的树,每个点有一种颜色\(c_i\)。
  • 对于每条树边,求在把该边去掉后,两棵树的点的颜色交集大小。

思路

  • 对于每种颜色单独考虑

  • 对于每种颜色的点,可以根据dfs序重新构建一棵新的树

  • 对于每条路径,底部节点+1,顶部-1,表示这条路径的每条树边的交集+1。

代码


J.三角形和矩形

题意

  • 给一个三角形和矩形,求面积交。

思路

  • 比较无脑的做法就是套凸包面积交模板

代码


K.盖房子

题意

  • 一个\(N \times M(1 \le N,M \le 10^3)\)矩形。
  • 每个格子要么为空地,要么为障碍。
  • 选取两个不相交的矩形,且每个矩形不能包含障碍的方案数\(mod(10^9+7)\)。

思路

  • 利用单调栈,可以求出以某个点为顶点的矩形个数。

  • 假设我们求出了以\((i,j)\)为左上角的矩形个数,并规定该矩形的左上角不会在另一个矩形的左边。
  • 那么可以发现这种做法有一种情况是统计不到的:

  • 那么把整个矩形旋转90°,则可以统计上述的情况,但是同时会重复计数一些情况:

  • 去掉这种情况即可。

代码

2016 Hunan Province Programming Contest的更多相关文章

  1. 2016 Sichuan Province Programming Contest

    2016 Sichuan Province Programming Contest 代码 2016 Sichuan Province Programming Contest A. Nearest Ne ...

  2. The Ninth Hunan Collegiate Programming Contest (2013) Problem A

    Problem A Almost Palindrome Given a line of text, find the longest almost-palindrome substring. A st ...

  3. The Ninth Hunan Collegiate Programming Contest (2013) Problem F

    Problem F Funny Car Racing There is a funny car racing in a city with n junctions and m directed roa ...

  4. The Ninth Hunan Collegiate Programming Contest (2013) Problem H

    Problem H High bridge, low bridge Q: There are one high bridge and one low bridge across the river. ...

  5. The Ninth Hunan Collegiate Programming Contest (2013) Problem I

    Problem I Interesting Calculator There is an interesting calculator. It has 3 rows of button. Row 1: ...

  6. The Ninth Hunan Collegiate Programming Contest (2013) Problem J

    Problem J Joking with Fermat's Last Theorem Fermat's Last Theorem: no three positive integers a, b, ...

  7. The Ninth Hunan Collegiate Programming Contest (2013) Problem G

    Problem G Good Teacher I want to be a good teacher, so at least I need to remember all the student n ...

  8. The Ninth Hunan Collegiate Programming Contest (2013) Problem L

    Problem L Last Blood In many programming contests, special prizes are given to teams who solved a pa ...

  9. The Ninth Hunan Collegiate Programming Contest (2013) Problem C

    Problem C Character Recognition? Write a program that recognizes characters. Don't worry, because yo ...

随机推荐

  1. CodeForces 546B-Soldier and Badges

    题意: 给出一些数字,要求每个数字都不一样需要增加几 思路: 先排序,然后一个个增加,最后求总和差 代码如下: #include <iostream> #include <cstdi ...

  2. 踏着前人的脚印学Hadoop——RPC源码

    A simple RPC mechanism.A protocol  is a Java interface.  All parameters and return types must be one ...

  3. SharePoint 2013 重复的管理账户错误:已添加项。字典中的关键字 所添加的关键字

    博客地址:http://blog.csdn.net/FoxDave 今天在管理中心创建新的Web应用程序时,想注册一个新的管理账户,一着急点了两次按钮,结果就出现了这样的错误...怎么说呢,太奇葩 ...

  4. JVM-class文件完全解析-字段表集合

     字段表集合 这个class文件的解析,分析得有点太久了.前面介绍类魔数,次版本号,主板本号,常量池入口,常量池,访问标志,类索引,父类索引和接口索引集合.下面就应该到字段表集合了.  紧接着接口索引 ...

  5. 有关PHP的字符串知识

    字符串是由一系列字符组成,在PHP中,字符和字节一样,也就是说,一共有256种不同字符的可能性. 字符串型可以用三种方法定义:单引号形式.双引号形式和Heredoc结构形式. 1.每条指令可要记得使用 ...

  6. 高效的iOS宏定义

    iOS开发过程中使用一些常用的宏可以提高开发效率,提高代码的重用性:将这些宏放到一个头文件里然后再放到工程中的-Prefix.pch文件中(或者直接放到-Prefix.pch中)直接可以使用,灰常方便 ...

  7. CentOS中vsftp安装与配置

    http://blog.chinaunix.net/uid-7271021-id-3086186.html 553 Could not create file 解决办法 [root@localhost ...

  8. JS判断移动设备最佳方法 并实现跳转至手机版网页

    我在开发的Magento或Wordpress主题时,通过都会制作手机版本,为了实现某个片段在手机端和桌面端不同功能,又或者如果是手机设备,就跳转到指定的网页上,那么这里就需要用到JS来做判断了,下面有 ...

  9. PHP图像处理之在原图像处理

    处理原有的图像        图片处理,缩放,裁剪,翻转,旋转,透明,锐化等图片操作        一.创建图片资源            imagecreatetruecolor(width,hei ...

  10. LINQ学习之旅(六)

    Insert/Update/Delete操作 插入(Insert) 1.简单形式 说明:new一个对象,使用InsertOnSubmit方法将其加入到对应的集合中,使用SubmitChanges()提 ...