hdu4768 非常规的二分
题意:
n个社团给同学发传单,同学一共有1--2^31这么多,每个社团有三个数A ,B ,C ,只有
满足 A ,A + C ,A + C + C ...A + KC <= B 的学生才能得到传单,问你谁收到的传单数是奇数,题目保证给的测试数据要么没有奇数的,要么只有一个是奇数个传单.
思路:
"题目保证给的测试数据要么没有奇数的,要么只有一个是奇数个传单." ,这句非常关键,我们二分枚举1--2^31,对于mid,算出0--mid一共发出去tmp张传单,如果tmp是偶数那么奇数的那个人一定不会在前面,因为只有一个奇数,其他的都是偶数,奇数 + 偶数 = 奇数,偶数+ 偶数 = 偶数,所以可以根据当前的数是不是偶数就能断定奇数的那个人在不在mid前面.对于不存在的这个判定,我是前直接跑出所有的个数,也就是求出范围INF以前的所有,如果偶数那么就不存在,否则就二分找,找到后在枚举这个找到的人有多少个传单,输出来就行了.这个只是用二分的特性去节省时间,和以往的二分不同,因为他不是在单调函数上查找的.所以这个我感觉是一个非常规的二分.
#include<stdio.h> #define N 20000 + 100
typedef struct
{
__int64 A ,B ,C;
}NODE; NODE node[N]; __int64 minn(__int64 x ,__int64 y)
{
return x < y ? x : y;
} __int64 solve(__int64 mid ,int n)
{
__int64 sum = 0;
for(int i = 1 ;i <= n ;i ++)
{
if(mid >= node[i].A)
{
sum += ((minn(mid ,node[i].B) - node[i].A) / node[i].C + 1);
}
}
return sum;
} int main ()
{
int n ,i;
__int64 INF = 1;
for(__int64 ii = 1 ;ii <= 31 ;ii ++)
INF *= 2;
while(~scanf("%d" ,&n))
{
for(i = 1 ;i <= n ;i ++)
scanf("%I64d %I64d %I64d" ,&node[i].A ,&node[i].B ,&node[i].C);
__int64 tmp = solve(INF ,n);
if(tmp % 2 == 0)
{
puts("DC Qiang is unhappy.");
continue;
}
__int64 low ,up ,mid;
low = 0 ,up = INF;
__int64 ans_id = -1;
while(low <= up)
{
mid = (low + up) / 2;
tmp = solve(mid ,n);
//printf("%I64d******\n" ,tmp);
if(tmp % 2)
{
up = mid - 1;
ans_id = mid;
}
else
{
low = mid + 1;
}
}
__int64 ans_sum = 0;
for(i = 1 ;i <= n ;i ++)
{
if(ans_id <= node[i].B && (ans_id - node[i].A) % node[i].C == 0 && ans_id >= node[i].A)
ans_sum ++;
}
printf("%I64d %I64d\n" ,ans_id ,ans_sum);
}
return 0;
}
hdu4768 非常规的二分的更多相关文章
- HDU4768:Flyer [ 二分的奇妙应用 好题 ]
传送门 Flyer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- Flyer(二分 HDU4768)
Flyer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- hdu4768二分答案
/* 如果发的传单是偶数,那么所有人都收到双数张. 仅考虑发了单数张传单,二分答案x,如果x左边是偶数,那么答案在右侧,如果x左边是奇数,那么答案在左侧 */ #include<iostream ...
- [hdu4768]二分
http://acm.hdu.edu.cn/showproblem.php?pid=4768 题意:n个传单分别发给编号为ai, ai + ci, ai + 2 * ci, .. , ai + k * ...
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3352 Solved: 919[Submit][Stat ...
- 整体二分QAQ
POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...
- [bzoj2653][middle] (二分 + 主席树)
Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...
- [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
随机推荐
- LanQiao-297(快速排序)
快速排序 LanQiao-297 #include<iostream> #include<cstdio> #include<algorithm> #include& ...
- HDOJ-1711(KMP算法)
Number Sequence HDOJ-1711 1.这里使用的算法是KMP算法,pi数组就是前缀数组. 2.代码中使用到了一个技巧就是用c数组看成是复合字符串,里面加一个特殊整数位-1000006 ...
- Python爬虫系统化学习(5)
Python爬虫系统化学习(5) 多线程爬虫,在之前的网络编程中,我学习过多线程socket进行单服务器对多客户端的连接,通过使用多线程编程,可以大大提升爬虫的效率. Python多线程爬虫主要由三部 ...
- springboot注解之@Import @Conditional @ImportResource @ConfigurationProperties @EnableConfigurationProperties
1.包结构 2.主程序类 1 @SpringBootApplication(scanBasePackages={"com.atguigu"}) 2 public class Mai ...
- T1215拯救公主
1 #include <cstdio> 2 #include <queue> 3 #include <set> 4 #include <cstring> ...
- Excel老式技术
Excel老式技术 VBS宏脚本嵌入明文代码
- flutter简易教程
跟Java等很多语言不同的是,Dart没有public protected private等关键字,如果某个变量以下划线 _ 开头,代表这个变量在库中是私有的.Dart中变量可以以字母或下划线开头,后 ...
- Windows + Jenkins + .NetFramework + SVN 持续部署
Windows + Jenkins + .NetFramework + SVN 持续部署 环境准备 服务端环境 安装 Windows 服务器 1.阿里云购买临时服务器 阿里云:https://www. ...
- python多版本与虚拟环境
这篇纯python技术文章,我自己平时也会用到,在此记录一下. 为什么会用到多个Python版本? 用macOS和Ubutntu的同学都知道系统默认安装的Python2.7.x,然后,我们平时pyth ...
- 计算机体系结构——CH1基本概念
CH1基本概念 右键点击查看图像,查看清晰图像 CH1基本概念 目的与内容 了解计算机系统的完整概念 学习计算机系统的分析方法与设计方法 编写程序所必需了解的计算机属性 计算机系统结构简介 为什么要研 ...