poj 1759 二分搜索
题意:N个等差数列,初项X_i,末项Y_i,公差Z_i,求出现奇数次的数?
思路:
- 因为只有一个数出现的次数为奇数个
- 假设 第二个数字的个数为 奇数个,其余全部都是偶数个 ,累计出现的次数
a1偶数
a1+a2 奇数
a1+a2+a3 奇数
...................
会出现这种情况:偶偶偶...偶奇
第一个出现奇的就是我们想要的
解决问题的代码:
#include <iostream> #include <stdio.h> #include <algorithm> #include <math.h> #include <cstring> using namespace std; #define maxn 50010 typedef long long ll; ll x[maxn], y[maxn], z[maxn]; int cnt; char s[maxn]; ll judge(ll mid) { ll sum = 0; for (int i = 0; i < cnt; i++) { if (mid < x[i]) continue; ll t = min(mid, y[i]); sum += (t - x[i]) / z[i] + 1; } return sum; } void solve() { cnt = 1; x[0] = 0; sscanf(s, "%lld%lld%lld", &x[0], &y[0], &z[0]); if (!x[0]) return; while (gets_s(s) && s[0]) { sscanf(s, "%lld%lld%lld", &x[cnt], &y[cnt], &z[cnt]); cnt++; } ll l = 0, r = 1ll << 32; while (l < r) { ll mid = (l + r) / 2; if (judge(mid) % 2) r = mid; else l = mid + 1; } if (l == 1ll << 32) printf("no corruption\n"); else printf("%lld %lld\n", l, judge(l) - judge(l - 1)); } int main() { while (gets_s(s)) solve(); return 0; }
君子知命不惧,自当日日自新