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 非常规的二分相关推荐
- 数据结构与算法之美(二)
一,二分查找 二分查找的非递归实现 public int bsearch(int[] a, int n, int value) {int low = 0;int high = n - 1;while ...
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- 分治算法的设计思想(二分检索、二分归并排序)
分治策略思想: 将原问题划分或者归结为规模较小的子问题. 递归或迭代求解每一个问题. 将子问题的解综合得到原问题的解. 性质: 子问题与原问题具有相同的性质. 子问题的求解彼此独立. 划分时子问题的规 ...
- LeetCode简单题之二分查找
题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...
- 二分查找模板全面总结
二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...
- [C] [二分] C语言实现快速排序
为了以防万一有人想不开想手撕快排呢?比如我. 通过快排来理解二分思想 什么是快排? 快排的思想不难,理解好递归很重要. 什么是递归? 递归,就是在运行的过程中调用自己. 构成递归需具备的条件: 子问题 ...
- Showstopper [POJ3484] [二分] [思维]
Description 给你n个数列,问哪一个数字在所有的数列中出现了奇数次(最多一个). Sample Input 1 10 1 2 10 11 10 1 1 10 11 10 1 4 4 1 1 ...
- BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】
题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...
- usaco The Perfect Stall(二分匹配模板)
其实二分匹配都是很早之前看的不过又忘了现在再看看比第一次好理解多了. /* ID:jinbo wu TASK:stall4 LANG:C++ */ #include<bits/stdc++.h& ...
最新文章
- while/do while
- SAP常见问题与解决办法 2
- postgresql 目录结构
- python 参数收集_Python基础教程第六章 6.4.4 收集参数
- zookeeper使用和原理探究
- oracle表字段获取,获取oracle表结构的字段信息
- ansible /usr/bin/python: not found
- 了解计算机中的信息编码教案,《信息编码》教学设计
- OpenCV-Python实战(16)——人脸追踪详解
- jdk api官方文档的使用
- Mac eclipse adt sdkmanager打不开
- BI报表工具FineReport的使用1【FineReport使用,看过这篇就够了】
- java EE crm代码_基于jsp的小型企业CRM-JavaEE实现小型企业CRM - java项目源码
- setoolkit的钓鱼攻击
- ruoyi vue 其功能介绍
- 墨水染色之广度优先搜索(C语言实现)
- NLP-基础任务-中文分词算法(3)-基于字:基于序列标注的分词算法【BiLSTM+CRF】
- 地磁传感器还可以用于室内定位?
- 工业设计最常用的表面处理方法-丝印
- 腾讯游戏业务竟然是这样利用低代码平台的 | ArchSummit
热门文章
- 个人信息安全 不能止于“打补丁”
- Git Push 不用再次输入用户名和密码方法
- (实用)将wordpad添加到Windows PowerShell中
- 学习Unix/Linux编程要学些什么
- IDEA 调试Spring-boot 应用
- Elasticsearch 性能调优
- Android得到控件在屏幕中的坐标
- [转载]Android: 如何实现ScrollView中含有ListView?
- C#正则表达式提取HTML中IMG标签的SRC地址(转)
- 一个项目涉及到的50个Sql语句(整理版)