poj3484 Showstopper 二分
来源:互联网 发布:网络恶意诽谤 编辑:程序博客网 时间:2024/06/08 02:25
http://poj.org/problem?id=3484
因为题目说至多存在一个奇数点,所以前缀和的奇偶性一定是
偶偶偶偶偶偶偶偶偶偶偶偶偶偶偶偶偶偶偶偶奇奇奇奇奇奇奇奇奇奇奇 的样子
等价于我们要找第一个奇数点,二分该点的坐标来判断即可。
至于判断呢需要以O(n)的时间来找出从1到k的一段的点数,具体实现看代码~
输入格式非常坑,小心数据与数据之间有可能有多个空行。
#include <iostream>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#include <cstdio>#include <algorithm>#define N 500005typedef long long LL;using namespace std;int n ;LL X[N] , Y[N] , Z[N];char str[55];LL cal(LL k){ LL sum = 0 , x; for (int i = 1 ; i <= n; ++ i) { if (k < X[i]) continue; x = min(k , Y[i]); sum += (x - X[i]) / Z[i] + 1; } return sum;}void work(){ n = 1; X[n] = 0; sscanf(str , "%I64d %I64d %I64d" , &X[n] , &Y[n] , &Z[n]); if (!X[n]) return; memset(str , 0 , sizeof(str)); while (gets(str) , *str) ++ n , sscanf(str , "%I64d %I64d %I64d" , &X[n] , &Y[n] , &Z[n]) , memset(str , 0 , sizeof(str)); LL l = 1 , r = 1LL << 33 , m; while (l < r) { m = (l + r) >> 1; if (cal(m) & 1) r = m; else l = m + 1; } if (l == 1LL << 33) puts("no corruption"); else printf("%I64d %I64d\n" , l , (cal(l) - cal(l - 1)));}int main(){ while(gets(str)) work(); return 0;}
- poj3484 Showstopper 二分
- POJ3484 Showstopper(二分)
- POJ3484-Showstopper
- Showstopper - POJ 3484 二分
- POJ 3484 Showstopper 二分
- Showstopper - POJ 3484 二分
- 【BZOJ1243】[Seerc2007]Showstopper【二分】
- poj3484
- POJ 3484 - Showstopper(二分搜索)
- POJ - 3484 Showstopper 二分搜索
- poj 3484 Showstopper(二分)
- POJ 3484 Showstopper (二分搜索)
- POJ - 3484 Showstopper(二分 + 前缀和)
- POJ 3484 Showstopper
- POJ-3484-Showstopper
- POJ 3484 Showstopper 已翻译
- 二分
- 二分
- TransProxy3.08beta.apk下载
- Http之Get,Post,put,delete请求
- 程序员应该懂的道理
- 提高用户忠诚度
- strstr函数
- poj3484 Showstopper 二分
- Access 2007 宝典--学习笔记5(数据表视图)
- Linux初学者探秘必问
- CRC32 vs Java.HashCode
- Extjs4 TreeGrid
- http://poj.org/problem?id=3264
- org.apache.jasper.compiler.TldLocationsCache tldScanJar No TLD files were fou
- Android ndk 之二
- 线程,进程