省常中模拟 day2
第一题:
题目大意:
有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的更多相关文章
- 省常中模拟 Test2 Day2
two 模拟 大意:给你一个 N 位二进制数,有四种操作:加1.减1.乘2.整除2.给定一个操作序列,求最终结果.N <= 5*10^6.数据保证不会在最高位上进行进位或退位操作. 初步解法:由 ...
- 省常中模拟 Test3 Day2
matrix 找规律 题意:给定一个 N*N 的只有 0 和 1 的矩阵,有 Q 个操作,分三种:1. 将某行上的所有数字取反:2. 将某列上的所有数字取反:3. 输出 sum{ a[i][j]*a[ ...
- 省常中模拟 day1
第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...
- 省常中模拟 Test4
prime 数论 题意:分别求 1*n.2*n.3*n.... n*n 关于模 p 的逆元.p 是质数,n < p. 初步解法:暴力枚举.因为 a 关于模 p 的逆元 b 满足 ab mod p ...
- 省常中模拟 Test3 Day1
tile 贪心 题意:给出一个矩形,用不同字母代表的正方形填充,要求相邻的方块字母不能相同,求字典序(将所有行拼接起来)最小的方案. 初步解法:一开始没怎么想,以为策略是每次填充一个尽量大的正方形.但 ...
- 省常中模拟 Test1 Day1
临洮巨人 排序 题意:在字符串中找出 A.B.C 三个字母出现次数相同的区间个数. 初步的解法是前缀和,用 a(i), b(i), c(i) 表示在位置 i 之前(包括 i)各有 字母 A.B.C 多 ...
- 如何在C#中模拟C++的联合(Union)?[C#, C++] How To Simulate C++ Union In C#?
1 什么是联合? 联合(Union)是一种特殊的类,一个联合中的数据成员在内存中的存储是互相重叠的.每个数据成员都在相同的内存地址开始.分配给联合的存储区数量是“要包含它最大的数据成员”所需的内存数. ...
- Python中模拟enum枚举类型的5种方法分享
这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下 以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...
- 在C#中模拟Javascript的setTimeout方法
在C#中模拟Javascript的setTimeout方法 背景 每种语言都有自己的定时器(Timer),很多人熟悉Javascript中的setInterval和setTimeout,在Javasc ...
随机推荐
- 三层架构下的EntityFramework codefirst
好久没写博客了,今天研究了EF框架的CodeFirst模式,从字面意思可以看出,代码优先.所谓代码优先,与以往的添加ado.net不同,主要是编写代码生成数据库和数据表,生成数据实体映射.个人感觉这种 ...
- IE7 float:left失效的解决方法
<div id="a" style="width:500px"> <div id="b" style="widt ...
- Postgresql 帐号密码修改方法
1.Linux环境下 #su postgres -bash-3.2$psql -U postgres postgres=#alter user postgres with password 'new ...
- maven nexus
部署nexus步骤: 1.下载解压安装包到指定目录 2.设置环境变量(当然还有JAVA,jdk) 3.在配置文件(G:\nexus\nexus-2.3.1-01-bundle\nexus-2.3.1- ...
- QT开发实战精解
无法打开包括文件<QApplication> No such file or directory 这一问题 解决办法,使用QApplication时必须在项目pro文件中添加一句 QT ...
- 《Java并发编程实战》读书笔记
Subsections 线程安全(Thread safety)锁(lock)共享对象对象组合基础构建模块任务执行取消和关闭线程池的使用性能与可伸缩性并发程序的测试显示锁原子变量和非阻塞同步机制 一.线 ...
- python : HTML+CSS (左侧菜单)
左侧菜单 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3 ...
- 20个Linux服务器安全强化建议(二)
接上文,继续介绍一些Linux服务器的安全配置. #6.强密码策略. 当我们使用 useradd.usermod 命令创建或维护用户账号时,确保始终应用强密码策略.例如,一个好的密码至少包括8个字 ...
- mysql中Timestamp,time,datetime 区别
一.TIMESTAMP[(M)] 时间戳.范围是’1970-01-01 00:00:00’到2037年. TIMESTAMP列用于INSERT或UPDATE操作时记录日期和时间. 如果你不分配一个值, ...
- hdu2896病毒侵袭(ac自动机)
链接 ac自动机的模板题 说2个注意的地方 一是题目说明包含所有ASCII字符,可以开到0-127 包含空格 题目会输入多个源串,在加完当前的val值时,不应清0,可以开个标记数组. #include ...