SB题!!!
我TM困惑了一下午,三份代码答案全都不一样,后来才发现要用long long来二分...
拿记事本一改就A了。
我TM......
这SB题目......
这惨痛的事实充分说明了long long的重要性!!!
题解:
还是惨痛的教训:认真看题!
题目说:至多只有一个破绽;我:可能有多个破绽。
然后GG了两天...后来才发现...
然后就好搞了,在前缀和上二分。
去掉long long还是比较有水分的。
#include <cstdio>
typedef long long LL;
const LL N = ;
inline void max(LL &a, LL b) {
if(a < b) a = b;
return;
}
inline void read(LL &x) {
x = ;
char c = getchar();
while(c < '' || c > '') {
c = getchar();
}
while(c >= '' && c <= '') {
x = (x << ) + (x << ) + c - '';
c = getchar();
}
return;
}
struct Group {
LL s, e, d;
}g[N]; LL n; inline LL ge(LL i, LL k) {
if(g[i].s > k) return ;
if(g[i].e <= k) {
return (g[i].e - g[i].s) / g[i].d + ;
}
return (k - g[i].s) / g[i].d + ;
} inline bool check(LL k) {
bool ans = ;
for(LL i = ; i <= n; i++) {
ans ^= (ge(i, k) & );
}
return ans;
} inline LL getsum(LL k) {
LL ans = ;
for(LL i = ; i <= n; i++) {
if(g[i].s > k || g[i].e < k)
continue;
if(!((k - g[i].s) % g[i].d))
ans++;
}
return ans;
} int main() {
LL T, m;
read(T);
while(T--) {
read(n);
m = -;
for(LL i = ; i <= n; i++) {
read(g[i].s); read(g[i].e); read(g[i].d);
max(m, g[i].e);
}
LL l = , r = m, mid;
if(!check(m)) {
printf("Poor QIN Teng:(\n");
continue;
}
while(l < r) {
mid = (l + r) >> ;
if(check(mid)) r = mid;
else l = mid + ;
}
printf("%lld %lld\n", l, getsum(l));
}
return ;
}
AC代码
附:不用long long不WA反T,导致我疯狂卡常数