第一题:

题目大意:

有mn颗糖,要装进k个盒子里,使得既可以平均分给n个人,也可以平均分给m个人。 求k的最小值。

解题过程:

1.先看一组小数据(13,21).那么根据贪心的原则很容易想到先拿13个盒子,每个盒子装13颗糖,这样当要分给13个人的时候,每个人还欠8颗糖,当要分给21个人的时候,还有8个人欠13颗糖.所以问题就变成了把8*13颗糖放到盒子里,要求既可以平均分给8个人,也可以平均分给13个人。 也就是说可以不断减小问题的规模:

(13,21)->(8,13)->(5,8)->(3,5)->(2,3)->(1,2)->(1,1)

2.观察上面的过程,和辗转相减求最大公约数的过程一模一样。但是仅仅是相减效率就不高了,所以可以变成辗转相除。对于数据(x,y) 每个盒子最多只能装min(x,y)颗,所以这样的装法一定是最优的。

3.题解里说最小盒子数量k=n + m - gcd(n,m)。

证明:考虑一个n 个黑点、m 个白点的二分图,第i 个黑点表示第i 个小朋友(总人数为n 时),第j 个白点表示第j 个小朋友(总人数为m 时);一条边(i,j) 表示这样一个盒子,这个盒子在人数为n 时属于第i 个小朋友,在人数为m 时属于第j 个小朋友。考虑这个图的某一连通分量,它包含x 个黑点,y 个白点,则此连通分量中的边所代表的盒子的糖果总数= xm = yn,于是x n/ gcd(n,m),即每个连通分量至少包含n/ gcd(n,m)个黑点,于是连通分量数量不超过gcd(n,m),所以边数至少为n + m - gcd(n,m).

初始得分100.


第二题:

题目大意:

在N个点M条边的无向图中,给出q个询问(A,B,P),求从A到B mod P 意义下的最短路的长度。

N,M,q<=50000.

解题过程:

1.这题真心神题,一点思路都没有,直接告诉我这绝对不是图论题而是数学题。直接暴力打了个spfa,拿到了35分。

2.直接贴官方题解吧,暂时还没看明白:


第三题:

题目大意:

给出一个长度为N的字符串,有q个询问(L,R),求区间[L,R]中有多少个子序列“gcd”。

N,q<=80000

解题过程:

1.70分是很好拿的(N,q<=4000),只要在区间里找出所有的c,然后就可以利用前缀和搞出它前面的g和后面的d的个数,根据乘法原理统计即可。  找出区间里所有的c,我加了个二分查找的优化,对于完全随机的数据(c的个数比较少)效率比较理想,但还是只能拿到70分。

2.莫队算法:先分块,然后把所有询问排序(左端点在同一个块里的按右端点排序,不在同一个块里的按左端点排序).根据询问区间的变化来维护g,c,d,gc,cd,gcd的个数。  效果比较理想,最慢的点只要500ms左右。

3.O(N+q)的神算法:先处理处g,c,d,gc,cd,gcd的前缀。

[L,R]里的gcd个数=[1,R]的gcd的个数-[1,L-1]里gcd的个数-[1,L-1]里g的个数*[L,R]里cd的个数-[1,L-1]里gc的个数*

[L,R]里d的个数。

而[L,R]里cd的个数又等于[1,R]里cd的个数-[1,L-1]里c的个数*[L,R]里d的个数-[1,L-1]里cd的个数。

所有的东东都可以用前缀和来得到。 最慢的点只要50ms.


总结:

1.不要被题目吓住了,从小的数据入手容易发现规律,比如T1。

2.做不出来的题目不要死磕,比如T2,早点写个暴力丢一边就行,应该把时间花在其它题目上。

省常中模拟 day2的更多相关文章

  1. 省常中模拟 Test2 Day2

    two 模拟 大意:给你一个 N 位二进制数,有四种操作:加1.减1.乘2.整除2.给定一个操作序列,求最终结果.N <= 5*10^6.数据保证不会在最高位上进行进位或退位操作. 初步解法:由 ...

  2. 省常中模拟 Test3 Day2

    matrix 找规律 题意:给定一个 N*N 的只有 0 和 1 的矩阵,有 Q 个操作,分三种:1. 将某行上的所有数字取反:2. 将某列上的所有数字取反:3. 输出 sum{ a[i][j]*a[ ...

  3. 省常中模拟 day1

    第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...

  4. 省常中模拟 Test4

    prime 数论 题意:分别求 1*n.2*n.3*n.... n*n 关于模 p 的逆元.p 是质数,n < p. 初步解法:暴力枚举.因为 a 关于模 p 的逆元 b 满足 ab mod p ...

  5. 省常中模拟 Test3 Day1

    tile 贪心 题意:给出一个矩形,用不同字母代表的正方形填充,要求相邻的方块字母不能相同,求字典序(将所有行拼接起来)最小的方案. 初步解法:一开始没怎么想,以为策略是每次填充一个尽量大的正方形.但 ...

  6. 省常中模拟 Test1 Day1

    临洮巨人 排序 题意:在字符串中找出 A.B.C 三个字母出现次数相同的区间个数. 初步的解法是前缀和,用 a(i), b(i), c(i) 表示在位置 i 之前(包括 i)各有 字母 A.B.C 多 ...

  7. 如何在C#中模拟C++的联合(Union)?[C#, C++] How To Simulate C++ Union In C#?

    1 什么是联合? 联合(Union)是一种特殊的类,一个联合中的数据成员在内存中的存储是互相重叠的.每个数据成员都在相同的内存地址开始.分配给联合的存储区数量是“要包含它最大的数据成员”所需的内存数. ...

  8. Python中模拟enum枚举类型的5种方法分享

    这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下   以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...

  9. 在C#中模拟Javascript的setTimeout方法

    在C#中模拟Javascript的setTimeout方法 背景 每种语言都有自己的定时器(Timer),很多人熟悉Javascript中的setInterval和setTimeout,在Javasc ...

随机推荐

  1. Android -- 自定义View小Demo,动态画圆(一)

    1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...

  2. C#学校班级自动升级实现代码

    代码逻辑如下: //班级自动升级 //获取该学校还没有毕业的班级 List<ClassInfoes> classinfoeslist = classinfoesbll.GetList(Sc ...

  3. html5,导航

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  4. spring aop 中获取 request

    使用aop时需要request 和response 使用方法调用时 HttpServletRequest request = ((ServletRequestAttributes)RequestCon ...

  5. js获取url参数值

    用过的封装好的js获取url问号后的参数的方法: <script> var Request = new Object(); Request = GetRequest();var error ...

  6. android的listview的详细用法

    listview是android开发中的一个极其重要的控件.所以,要学会android,如果这个不会,基本是不会android的. 这里按照几个步骤介绍这个控件的使用. 1. 使用API中ArrayA ...

  7. Linq join

    MXS&Vincene  ─╄OvЁ  &0000022─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好, ...

  8. 数据库连接driverClass和jdbcUrl大全

    一.MySQL: driverClass:com.mysql.jdbc.Driver                         org.gjt.mm.mysql.Driver jdbcUrl:j ...

  9. Oracle logmnr工具分析日志脚本

    在oracle:对logmnr工具分析日志这个不陌生:对数据恢复应用场景经常用到:这里为了方便对归档日志进行分析: 当然网上有一个logmnr界面的工具:感觉很人性化:下载需要积分:为此写一个脚本. ...

  10. mysql之show engine innodb status解读

    注:以下内容为根据<高性能mysql第三版>和<mysql技术内幕innodb存储引擎>的innodb status部分的个人理解,如果有错误,还望指正!!   innodb存 ...