bzoj1271 秦腾与教学评估
SB题!!!
我TM困惑了一下午,三份代码答案全都不一样,后来才发现要用long long来二分...
拿记事本一改就A了。
我TM......
这SB题目......
这惨痛的事实充分说明了long long的重要性!!!
题解:
还是惨痛的教训:认真看题!
题目说:至多只有一个破绽;我:可能有多个破绽。
然后GG了两天...后来才发现...
然后就好搞了,在前缀和上二分。
去掉long long还是比较有水分的。
1 #include <cstdio> 2 typedef long long LL; 3 const LL N = 200010; 4 inline void max(LL &a, LL b) { 5 if(a < b) a = b; 6 return; 7 } 8 inline void read(LL &x) { 9 x = 0; 10 char c = getchar(); 11 while(c < '0' || c > '9') { 12 c = getchar(); 13 } 14 while(c >= '0' && c <= '9') { 15 x = (x << 3) + (x << 1) + c - '0'; 16 c = getchar(); 17 } 18 return; 19 } 20 struct Group { 21 LL s, e, d; 22 }g[N]; 23 24 LL n; 25 26 inline LL ge(LL i, LL k) { 27 if(g[i].s > k) return 0; 28 if(g[i].e <= k) { 29 return (g[i].e - g[i].s) / g[i].d + 1; 30 } 31 return (k - g[i].s) / g[i].d + 1; 32 } 33 34 inline bool check(LL k) { 35 bool ans = 0; 36 for(LL i = 1; i <= n; i++) { 37 ans ^= (ge(i, k) & 1); 38 } 39 return ans; 40 } 41 42 inline LL getsum(LL k) { 43 LL ans = 0; 44 for(LL i = 1; i <= n; i++) { 45 if(g[i].s > k || g[i].e < k) 46 continue; 47 if(!((k - g[i].s) % g[i].d)) 48 ans++; 49 } 50 return ans; 51 } 52 53 int main() { 54 LL T, m; 55 read(T); 56 while(T--) { 57 read(n); 58 m = -1; 59 for(LL i = 1; i <= n; i++) { 60 read(g[i].s); read(g[i].e); read(g[i].d); 61 max(m, g[i].e); 62 } 63 LL l = 1, r = m, mid; 64 if(!check(m)) { 65 printf("Poor QIN Teng:(\n"); 66 continue; 67 } 68 while(l < r) { 69 mid = (l + r) >> 1; 70 if(check(mid)) r = mid; 71 else l = mid + 1; 72 } 73 printf("%lld %lld\n", l, getsum(l)); 74 } 75 return 0; 76 }
附:不用long long不WA反T,导致我疯狂卡常数