这题各种卡.
先是卡空间, n太大了, 想要都存下来再sort只能是MLE.
因为开不下, 所以逼你写空间复杂度O(1)的算法, Online扫一遍. O(n)的时间复杂度.
算法是, 小于等于 L/2 的都可以加进来, 而大于L/2的可能可以加入一个, 只要min(大于L/2的)+max(小于等于L/2) 小于等于L就行了.
完全不懂这题为什么用序列来描述而不用集合...这跟序根本没关系么...还有那个公式让人觉得是数论题...没想到是乱搞题...
再是卡时间. 过的一般都是1500ms+....写挫了还不敢保证不TLE...
另外 , 这题又提醒我杭电的int64输入输出是多么坑爹, TLE了不知道多少次是因为语言跟输入输出...
哦, 对了还有, WA了N次...因为你最后把min跟max加起来的时候, 要判断是不是真的存在min...也就是说, 不要落了所有数都可以选进去的情况. 我看题解发现这个大家都没考虑, 因为min初始化比1e9大, 所有就必然小于L了.
但是其实这题没必要用int64的...就是在算 A*i+B的时候考虑下溢出就是了.
先给个不用int64输入输出, 然后G++/C++都能A的代码:
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<string> #include<vector> #include<map> #include<algorithm> using namespace std; inline int Rint() { int x; scanf("%d", &x); return x; } inline int max(int x, int y) { return (x>y)? x: y; } inline int min(int x, int y) { return (x<y)? x: y; } #define FOR(i, a, b) for(int i=(a); i<=(b); i++) #define FORD(i,a,b) for(int i=(a);i>=(b);i--) #define REP(x) for(int i=0; i<(x); i++) //typedef long long int64; typedef __int64 int64; #define INF (1<<30) const double eps = 1e-8; #define bug(s) cout<<#s<<"="<<s<<" " int main() { int n, l, mod; int A, b; while(~scanf("%d%d%d%d%d", &n, &l, &A, &b, &mod)) { int maxx = 0; int minx = INF; int havemin=0; int cnt=0; int mid = l/2; for(int i=1; i<=n; i++) { int x = ((int64)A*i+b)%mod; if(x<=mid) { cnt++; maxx = max(maxx, x); } else { if(minx>x) minx=x, havemin=1; } } if(havemin && maxx+minx <= l) cnt++; printf("%d\n", cnt); } }
总结下, 以后要在杭电做int64输入输出的题目, 就用C++交, 然后int64都用 __int64, 输入输出都用 I64d .....
这样应该不会有问题了.....