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. Section 1.4 Mother's Milk

    又是一道怨念已久的题目0 0之前深搜写过广搜写过,怎么就是卡死,我还以为FP坏了重新装了一遍.今天偶尔翻起来,发现广搜忘记inc(head)了…简直哭瞎… 简单的广搜,分类比较多,不过不太要动脑子.至 ...

  2. Android 获取网络状态

    1.检测网络是否可用 public boolean isNetWorkConnected() { ConnectivityManager cm = (ConnectivityManager)getSy ...

  3. Activity(活动)-初讲

    是一种可以包含用户界面的组件,主要用于和用户进行交互. 上一次我们的MainActivity.java 是ADT帮我们自动创建的.手动创建Activity可以加深我们的理解和记忆,于是我们先自己手动创 ...

  4. Android studio 环境搭建

    环境变量: CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar JAVA_HOME:F:\Prog ...

  5. hdu2795 线段树

    //Accepted 6396 KB 3046 ms //线段树 //由于n只有200000,我们可以知道,当h>200000时,大于200000的部分是没有用的 //所以我们可以用n来创建线段 ...

  6. declare 关键字在Oracle中的应用。

    一般用在trigger或匿名存储过程中使用.如 declare a number;begina:=1;end;

  7. unity3d角色控制器01

    参考出处貌似是雨松大神.如有侵权,立即删除. 需要导入包 ①将FirstPerson Controller拖拽入Hierarchy(层次视图)中.由于角色控制器是具有一定物理引擎的,所以一定要将它放在 ...

  8. oracle 删除表和数据分析语句

    TRUNCATE TABLE 表名;ANALYZE TABLE 表名 ESTIMATE STATISTICS;

  9. hdu 2035

    Ps:查了下快速幂,顺便在这用下.... 积的求余等于两个数的求余的积再求余... 代码: #include "stdio.h"int mod(int a,int b);int m ...

  10. compare:(字符串的大小比较)

    1.字符串的比较是按照ascall码进行比较的 比如A比a的值小, if([string1 compare:string2] == (以下描述)) 如果比较的结果是NSOrderedDescendin ...