题目名称 323. [AHOI2006] 棋盘上的问题
输入输出 board.in/out
难度等级 ★★★☆
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 10
题目来源 Gravatarcqw 于2009-04-22加入
开放分组 全部用户
提交状态
分类标签
分享题解
通过:7, 提交:37, 通过率:18.92%
Gravatarmaxinyang 100 0.001 s 0.17 MiB Pascal
Gravatarmaxinyang 100 0.001 s 0.17 MiB Pascal
Gravatarmaxinyang 100 0.001 s 0.17 MiB Pascal
Gravatarmaxinyang 100 0.002 s 0.17 MiB Pascal
GravatarZwoi_Lpat 100 0.015 s 0.13 MiB Pascal
GravatarFoolMike 100 13.689 s 46.45 MiB C++
GravatarBYVoid 100 19.147 s 99.87 MiB C++
Gravatarmaxinyang 90 0.002 s 0.17 MiB Pascal
Gravatarmaxinyang 80 0.001 s 0.17 MiB Pascal
Gravatarmaxinyang 70 0.006 s 0.17 MiB Pascal
本题关联比赛
HAOI2009 模拟试题2
关于 棋盘上的问题 的近10条评论(全部评论)
求强连通分量会爆栈。。。
GravatarBYVoid
2009-04-22 19:54 1楼

323. [AHOI2006] 棋盘上的问题

★★★☆   输入文件:board.in   输出文件:board.out   简单对比
时间限制:1 s   内存限制:128 MiB

可可和卡卡画了一张巨大的 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__));
小心炸内存……