比赛场次 | 33 |
---|---|
比赛名称 | HAOI2009 模拟试题2 |
比赛状态 | 已结束比赛成绩 |
开始时间 | 2009-04-22 08:15:00 |
结束时间 | 2009-04-22 11:30:00 |
开放分组 | 全部用户 |
注释介绍 |
题目名称 | 棋盘上的问题 |
---|---|
输入输出 | board.in/out |
时间限制 | 1000 ms (1 s) |
内存限制 | 128 MiB |
测试点数 | 10 简单对比 |
用户 | 结果 | 时间 | 内存 | 得分 |
---|---|---|---|---|
zqzas | AAAWWTTTTT | 0.000 s | 0.00 MiB | 30 |
lc | WWAWWWWWWW | 0.000 s | 0.00 MiB | 10 |
maxiem | WWAEEEEEEE | 0.000 s | 0.00 MiB | 10 |
苏轼 | WWAWWWWWWW | 0.000 s | 0.00 MiB | 10 |
打不死的羊 | WWAWWWWWWW | 0.000 s | 0.00 MiB | 10 |
.Xmz | WWAWWWWEEE | 0.000 s | 0.00 MiB | 10 |
辨机ZN | WWWWWWWWWW | 0.000 s | 0.00 MiB | 0 |
可可和卡卡画了一张巨大的 N * N 的棋盘,他们想在这个棋盘上放尽量多的国际象棋的“車”,使得它们互相不能攻击到对方(車可以沿着棋盘的横向和纵向攻击)。但这个答案显然就是棋盘的宽度 N ,于是可可在棋盘上规定了只有在有限的 M 个位置上才能放棋子。(其他位置不能放棋子,而車却可以穿过这个位置去攻击其他的棋子)然而这样也不会难倒两个聪明的小家伙,他们很快算出来这个答案是 K 。于是卡卡又提出来一个问题:如果我们在这 M 个可以放棋子的位置中再去掉一个位置,而仍然保证最多能放下 K 个車,可行的方案又有多少种呢?
编写一个程序:
• 从输入文件中读入棋盘的大小和棋盘上可以放棋子的位置信息;
• 计算出如题卡卡所说的可行方案的数目;
• 向输出文件打印你得到的答案。
输入文件的第一行有两个正整数 N 和 M ,分别表示棋盘的大小和可以放棋子的位置数目。
以下 M 行,每行用 x i 和 y i 两个整数描述一个位置,表示这个位置是棋盘的第 x i 行第 y i 列 (1<= i <= M , 1<= x i , y i <= N ) 。同样的一个位置不会被描述两次。
输出文件中只有一个整数,表示可行方案的数目。
3 4
1 2
1 3
2 2
2 1
4
30% 的测试数据中, 1<= N <=1 000, 1<= M <=20 000
100% 的测试数据中, 1<= N <=200 000, 1<= M <=600 000
对 C++ 选手的提示:经测试,对最大的测试数据使用 fstream 进行输入有可能会比使用 stdio 慢很多,因此建议在可以的情况下使用后者。
本题不设部分分,对于每个测试点只有当你的程序的输出和我们的标准输出完全一致时才可以得到相应的分数。
UPD:2017.7.12 By Mike
原题应该是数据有误,我用Byvoid学长的程序,和我的跑出了相同的答案,而且和标准答案不同!此题数据已更换为我和Byvoid学长程序跑出的结果。
原题时间限制是1s,如果有哪位神犇知道能在时限中跑出的方法,请给我发邮件联系,感激不尽!
解决爆栈,我们加两行代码就好了:
int __size__=64<<20; char *__p__=(char*)malloc(__size__)+__size__; __asm__("movl %0, %%esp\n"::"r"(__p__));小心炸内存……