题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4768

题目意思:

有n个A、B、C,每个Ai,Bi,Ci,对于每个P=Ai+k*Ci(P<=Bi,k为整数) 标记一次,如果存在,数据保证只有一个数被标记了奇数次,求出那个数并输出次数。

解题思路:

二分答案。统计区间内所有数的出现次数,根据奇数+偶数=奇数原则。只有一个数是奇数,来决定移动的方向。

最大的n可能有2^31,暴力肯定不行,但网赛的时候很多人都是抑或o(2^31)*n过得,无语了。

二分要求的那个数,对于0~mid段,如果该区间内所有数一共出现了奇数次,则只可能在前面一段,如果是偶数,则肯定在后面一段。每次只用求0~mid该区间所有的值得出现次数和即可,因为奇数减偶数,奇偶性不变。所以每次只用求一遍,然后对于每个mid值,特判一下该点是否为要求的点,如果是的话就找到了。

注意用__int64.

代码:

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<sstream>
  5. #include<cstdlib>
  6. #include<string>
  7. #include<cstring>
  8. #include<algorithm>
  9. #include<vector>
  10. #include<map>
  11. #include<set>
  12. #include<stack>
  13. #include<list>
  14. #include<queue>
  15. #include<ctime>
  16. #include<bitset>
  17. #define eps 1e-6
  18. #define INF 0x3f3f3f3f
  19. #define PI acos(-1.0)
  20. #define ll __int64
  21. #define LL long long
  22. #define lson l,m,(rt<<1)
  23. #define rson m+1,r,(rt<<1)|1
  24. #pragma comment(linker, "/STACK:1024000000,1024000000")
  25. using namespace std;
  26.  
  27. #define Maxn 21000
  28.  
  29. ll A[Maxn],B[Maxn],C[Maxn],n;
  30.  
  31. ll iscan(ll m,ll &sum)//sum是区间0~m中所有数出现次数的总和
  32. {
  33. ll res=0; //res表示数m出现的次数
  34. sum=0;
  35. for(int i=1;i<=n;i++)
  36. {
  37. ll tmp=min(B[i],m);
  38. if(tmp>=A[i])
  39. sum+=(tmp-A[i])/C[i]+1;
  40. if(m>B[i]||m<A[i]) //都不行 注意 m<A[i]
  41. continue;
  42. if((m-A[i])%C[i]==0) //注意m是一个数
  43. res++;
  44. }
  45. return res;
  46. }
  47.  
  48. int main()
  49. {
  50.  
  51. while(~scanf("%I64d",&n))
  52. {
  53. ll Max=0;
  54. for(int i=1;i<=n;i++)
  55. {
  56. scanf("%I64d%I64d%I64d",&A[i],&B[i],&C[i]);
  57. Max=max(Max,B[i]);
  58. }
  59. ll l=0,r=Max,mid;
  60. ll ans=-1,aa;
  61.  
  62. while(l<=r)
  63. {
  64. mid=(l+r)>>1;
  65. //printf("%I64d,%I64d %I64d\n",l,r,mid);
  66. ll tmp=0;
  67. aa=iscan(mid,tmp);
  68. //printf("%I64d %I64d\n",aa,tmp);
  69. //system("pause");
  70. if(aa&1) //mid这个数符不符合
  71. {
  72. ans=mid;
  73. break;
  74. }
  75. if(tmp&1) //前一段区间为存在某数为奇数个
  76. r=mid-1;
  77. else
  78. l=mid+1;
  79. }
  80. if(ans==-1)
  81. {
  82. printf("DC Qiang is unhappy.\n");
  83. }
  84. else
  85. printf("%I64d %I64d\n",ans,aa);
  86. }
  87. return 0;
  88. }

二分-hdu-4768-Flyer的更多相关文章

  1. HDU 4768 Flyer(二分)

    题目链接: 传送门 Flyer Time Limit: 1000MS     Memory Limit: 32768 K Description The new semester begins! Di ...

  2. HDU 4768 Flyer (2013长春网络赛1010题,二分)

    Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. hdu 4768 Flyer 二分

    思路:由于最多只有一个是奇数,所以二分枚举这个点,每次判断这个点的左边区间段所有点的和作为 二分的依据. 代码如下: #include<iostream> #include<cstd ...

  4. HDU 4768 Flyer【二分】||【异或】

    <题目链接> <转载于  >>> > 题目链接: n个社团派发传单,有a,b,c三个参数,派发的规则是,派发给序号为a,a+c....a+k*c,序号要求是小 ...

  5. HDU 4768 Flyer(二分法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4768 题目大意:每组数据有n行输入,每行有三个数A.B.C,A<=B且小于2^32,从A到B每隔 ...

  6. 2013长春网赛1010 hdu 4768 Flyer

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4768 题意:有n个社团发传单,每个社团发给编号为A_i, A_i+C_i,A_i+2*C_i,…A_i ...

  7. HDU 4768: Flyer

    题意: 有N个社团,每个社团三个属性A,B,C,表示会向编号A+k*C的同学发传单(k=0,1,2...  && A+k*C <= B).题目保证最多有一个人收到的传单数是奇数. ...

  8. hdu 4768 Flyer (异或操作的应用)

    2013年长春网络赛1010题 继巴斯博弈(30分钟)签到后,有一道必过题(一眼即有思路). 思路老早就有(40分钟):倒是直到3小时后才被A掉.期间各种换代码姿态! 共享思路: unlucky st ...

  9. HDU 4768 (二分区间---涨姿势)

    题意:告诉n组A,B,C,按照A + k * C生成等差数列,问这n组数列中哪个数字出现了奇数次以及出现了几次,题目保证最多只会出现一个这种数字. 分析:读完题并没有思路,后来知道是二分区间,枚举是哪 ...

  10. hdu 4768 异或运算

    http://acm.hdu.edu.cn/showproblem.php?pid=4768 貌似非常多人是用的二分 可是更好的做法貌似还是异或 对于第k个人.假设他接到偶数个传单.那么异或的结果还是 ...

随机推荐

  1. mac在 aliyun linux ecs实例上安装 jdk tomcat mysql

    用了一个ftp 工具 把 gz rpm 等 传递到ecs 上 -- 用这个Transmit 用ssh远程登录,然后依次安装 jdk tomcat  mysql 到 /usr/local/... 设置环 ...

  2. Java面向对象的概念以及OOP思想的优点

    传统面向过程程序设计的思路: 先设计一组函数用来解决一个问题,然后确定函数中需要处理的数据以及存储位置. 面向对象的设计的思路: 先确定处理的数据,然后确定处理数据的算法,最后将数据和算法封装在一起构 ...

  3. [LeetCode OJ] Linked List Cycle II—Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  4. 初涉JavaScript模式 (13) : 代码复用 【上】

    引子 博客断了一段时间,不是不写,一是没时间,二是觉得自己沉淀不够,经过一段时间的学习和实战,今天来总结下一个老生常谈的东西: 代码复用. 为何复用 JS门槛低,故很多人以为写几个特效就会JS,其实真 ...

  5. [jQuery编程挑战]002:实现一个转盘大抽奖

    body { background-color: #F2F2F2; text-align: center; } .container { position: relative; width: 500p ...

  6. PHP 运算符 详解

    PHP 算数运算符 运算符 名称 例子 结果 + 加法 $x + $y $x 与 $y 求和 - 减法 $x - $y $x 与 $y 的差数 * 乘法 $x * $y $x 与 $y 的乘积 / 除 ...

  7. 一个用python实现的东方时尚(驾校)抢课程序

    2014-12-23 东方时尚约车还要网上选课,资源太紧张了,于是我决定自己写一个抢票程序来帮我刷票. 第一步,抓包.浏览器登陆选课系统,用抓包工具观察网络行为,这里我用的fildder.这里抓包主要 ...

  8. 学c语言做练习之文件

    打开两个文件,让程序打印第一个文件的第一行,第二个文件的第一行,第一个文件的第二行,第二个文件的第二行,依此类推,直到打印完行数较多的文件的最后一行. #include<stdio.h> ...

  9. oracle导入

    1 建立all.sql脚本,此脚本内容指定了insert脚本的路径all.sql脚本内容如下: @D:\workspace\workspace-二期开始使用的文件\Test\数据库升级工具\导入基础数 ...

  10. C++ 常用的字符串处理函数实现

    以下是一些标准库没有实现的函数,我觉得很方便就写了,估计会不定时更新. //根据一个文件的路径获取文件名 std::string file_name(const std::string& pa ...