暑假测试 Day 4

来源:互联网 发布:exit code 139 linux 编辑:程序博客网 时间:2024/06/14 04:28

问题 A: 七天使的通讯

时间限制: 2 Sec  内存限制:256 MB
提交: 422  解决: 122
[提交][状态][讨论版]

题目描述

n个天使排成一条直线,某些天使之间需要互相联系,他们之间的通讯可以通过黑白两种通道中的一种;所有通道必须在直线同侧(另一侧是地面);为了保证通讯效率,同种颜色的所有通道之间不能相交。请计算能否建立这种通讯方案。

输入

    第一行一个数T,表示接下来有T个询问。
    对于每个询问:第一行两个数n,m,分别表示有n个天使、需要建立通讯线路的天使有m对;接下来有m行,每行两个数a、b,表示a、b两个天使需要通讯。

输出

对于每个询问,输出一行“sane”表示有可行方案、“non”表示无解

样例输入

1
7 5
1 3
2 7
3 4
7 4
6 5

样例输出

sane

提示

【样例解释】

样例中共有一个询问。




在(1,3)、(4,7)、(5,6)之间连黑色通道,在(2,7)、(3,4)之间连白色通道,每条通道都成功建立,且同种颜色的通道没有相交,所以输出sane。


【数据规模和约定】

对于 20%的数据,1<=n<=50,1<=m<=15

对于 50%的数据,1<=n<=1000,1<=m<=300

对于 100%的数据,1<=n<=5000,1<=m<=1000,1<=T<=10,1<=a<=n,1<=b<=n

数据保证每对(a,b)不重复,且a不等于b

【提示】

当两条线路有一对相同的端点时,这两条线路不相交。

也就是说,对于线路(a,b)和线路(c,d)(a<b且c<d),当且仅当a<c<b<d或者c<a<d<b时这两条线路相交。



~~:

A了。

还是比较简单的……我们直接O(M^2)判断两两的交叉关系,

然后称交叉的连线(编号x,y),x和y有冲突。

根据题意能够看出这必须是一个二分图。。

所以就是如何去判断它是不是的问题了……

有些大佬上并查集…………其实直接黑白染色就可以了。。

假设如果一个点没有颜色,就染成白色;然后根据一些关系延伸下去;

假设碰到一个点有颜色,而且这个颜色和它要染的冲突了,就是不合法的。。

大致吧。


问题 B: 都市环游

时间限制: 1 Sec  内存限制:512 MB
提交: 261  解决: 92
[提交][状态][讨论版]

题目描述

因为SJY干的奇怪事情过多,SJY收到了休假的通知,于是他准备在都市间来回旅游。SJY有一辆车子,一开始行驶性能为0,每过1时间行驶性能就会提升1点。每个城市的道路都有性能要求。SJY一共有t时间休息,一开始他位于1号城市(保证1号城市道路要求为0),他希望在n号城市结束旅程。每次穿过一条城市间的路会花费1时间,当然他也可以停留在一个城市不动而花费1时间。当且仅当车子的行驶性能大于等于一个城市,我们才能到达那里。SJY希望知道,旅游的方案模10086后的答案。(只要在某一时刻通过的道路存在一条不相同,就算不同的方案)

输入

    第一行三个数n,m,t,表示有n个城市m条道路t时间。
    第二行n个数,hi表示第i个城市的道路性能要求。
第三到m+2行,每行两个数u,v,表示城市u与城市v之间有一条单向道路连接(可能有重边)。

输出

包括一个数字,表示旅游的方案模10086。

样例输入

5 17 7
0 2 4 5 3
1 2
2 1
1 3
3 1
1 4
4 1
4 5
5 4
5 3
4 1
2 1
5 3
2 1
2 1
1 2
2 1
1 3

样例输出

245

提示

【数据规模和约定】

    对于20%的数据,n<=10,t<=80;

    对于50%的数据,n<=30,t<=80;

    对于100%的数据,n<=70,m<=1000,t<=100000000,hi<=70。


~~:
A了。
首先很容易得到一个想法就是dp。。
dp[u][v]是时间u走到v位置的方案数目。
然后直接转移就好了。。很简单,,,但是只有50分。。
本来想着好像没什么花头了,,结果发现hi<=70??
我们DP的念头起源于题目有hi这个限制条件……
但是只有就没了?
说明就是累计从u~n,时间刚好过(t-70)的方案数了嘛。。
不就是矩乘吗……


问题 C: 大水题

时间限制: 1 Sec  内存限制:512 MB
提交: 202  解决: 27
[提交][状态][讨论版]

题目描述

    dzy 定义一个n^2 位的数的生成矩阵A 为一个大小为n*n 且Aij 为这个数的第i*n+j-n位的矩阵。
现在dzy 有一个数n^2 位的数k,他想知道所有小于等于k 的数的n*n 生成矩阵有多少种。(如果不足n^2 位则补前缀零)

输入

第一行一个数n,第二行一个n^2 位的数k

输出

仅一行表示答案,答案可能很大,你只需输出答案对10^9 + 7 取模后的结果。

样例输入

2
1000

样例输出

954

提示

【数据规模和约定】 

对于30% 的数据n<=2

对于100% 的数据n <=1000,且n为偶数

 

【提示】

    如果两个生成矩阵在其中一个旋转180 度后可以重叠,则称这两个矩阵是相同的。


~~:
50分。。
好难呀。。
一开始没什么思路就去刚扫雷……结果刚了好久还是没什么思路……
但是打了暴力的话肯定是个大众分数。。
后来考虑一下,
其实计算的就是满足x在K的范围内,然后x的反过来的串也在K的范围内的个数。
然后还有回文的要注意一下。
怎么搞呢……数位dp吧。。
考场上的想法是乱搞优化一下下,,骗些分数。。
结果它不让用srand?????那我搞个J随机。。
然后就上了几个表吧,,在n=10附近暴力一小会儿,然后上表。。
接着n又加大了几个。。发现暴力优化一下下速度还可以?
交了暴力发现40。。。。
然后把表带上,就50了…………(好少……)
策略挺好的其实。。
正解的话是数位dp……说真的我不大会,
然后f[x][p][q]是前x位的匹配情况……
方程什么的都不会……不过百度上有QAQ..



!!:
总分250,
排名4,
人数50……
果然230是个大众分……幸亏了……
还行吧……
什么时候努努力……
AK一把把!!!……