Flyer

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

题意:给你1--2^32个位置,然后有m个操作,每次操作给你3个数 a,b,c,然后在a,a+c,a+2*c......a+k*c的位置加一,其中a+k*c<=b,a+(k+1)*c>b,要你找出最后的结果是奇数的位置和这个数。

题解:由于这一题,题目保证最多只有一个奇数,所以可以想到用二分。具体的方法可以直接看代码。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=30003;
 7 long long a[N],b[N],c[N];
 8 int n;
 9 long long getsum(long long mid){
10     long long as=0,tmp=mid;
11     for(int i=1;i<=n;i++){
12         tmp=min(mid,b[i]);
13         if(tmp>=a[i])
14         as+=(tmp-a[i])/c[i]+1;
15     }
16    return as;
17 }
18 bool judge(long long mid){
19      long long temp=getsum(mid);
20      if(temp&1)return true;
21        return false;
22 }
23 int main(){
24   while(~scanf("%d",&n)){
25     memset(a,0,sizeof(a));
26     memset(b,0,sizeof(b));
27     memset(c,0,sizeof(c));
28     for(int i=1;i<=n;i++){
29         scanf("%I64d%I64d%I64d",&a[i],&b[i],&c[i]);
30     }
31     long long l=1,r=1e10,ans=0;
32     while(l<r){
33         long long mid=(l+r)/2;
34         if(judge(mid)){
35             r=mid;
36             ans=mid;
37         }
38         else{
39             l=mid+1;
40         }
41     }
42     if(ans==0)
43         printf("DC Qiang is unhappy.\n");
44     else{
45       long long num=getsum(ans)-getsum(ans-1);
46     printf("%I64d %I64d\n",ans,num);
47     }
48   }
49 }

时间: 2024-10-12 02:42:43

Flyer的相关文章

【HDOJ 4768】 Flyer (等差数列+二分)

[HDOJ 4768] Flyer (等差数列+二分) Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2022    Accepted Submission(s): 743 Problem Description The new semester begins! Different kinds of student soc

HDU4768:Flyer [ 二分的奇妙应用 好题 ]

传送门 Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1718    Accepted Submission(s): 622 Problem Description The new semester begins! Different kinds of student societies are all trying to

HDU 4768 Flyer (二分)

OJ题目:click here~~ 题目分析:n个[a  b] 区间,对于i 属于[a  b]  ,从a开始,间隔c ,即i = a , i = a + c , i = a + 2*c -- 将x[ i ] 加1 ,x[ i ] 初值为0 . 已知最多只有一个x[ i ] 为奇数.找到这个i , 和这个奇数. 由于最多只有一个奇数,且奇数 + 偶数 = 奇数.用二分夹逼出这个奇数的位置.找到这个位置,再计算这个奇数就很容易了. AC_CODE const int maxn = 20002; LL

HDU4768:Flyer(二分)

Problem Description The new semester begins! Different kinds of student societies are all trying to advertise themselves, by giving flyers to the students for introducing the society. However, due to the fund shortage, the flyers of a society can onl

hdu 4768 Flyer(二分查找)

Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1537    Accepted Submission(s): 552 Problem Description The new semester begins! Different kinds of student societies are all trying to adv

hdu 4768 Flyer【二分】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4768 题意:学校有N个社团,新学期开始之际这N个社团发传单,它们发 传单是有规律的,有三个数组A[maxn],B[maxn],C[maxn],第i个设 团值发给编号为x的同学,其中x=A[i]+k*C[i]且k为整数,x小于等于 B[i];学校学生标号1~2^31,求那个同学收到传单数为奇数和这位同学 收到的传单数目,题目保证最多有一位同学收到传单为奇数. 分析:题目保证的那句话很重要,由于学生的数

shell脚本for循环

Shell循环:for 循环次数是固定的 ===================== Shell: for  变量名  [in  取值列表] do 循环体 done C语言: for((初值;条件;步长)) do 循环体 done ===================== Shell循环:while  until 循环次数不一定是固定的 可以固定 可以不固定 while语句: while  条件测试 do 循环体 done 功能:当条件测试成立(条件测试为真),执行循环体. =========

词组习语3057组

superword是一个Java实现的英文单词分析软件,主要研究英语单词音近形似转化规律.前缀后缀规律.词之间的相似性规律等等. 1 Anointing of the Sick British English 2 Civvy Street Clerk of the Closet 3 I mean I must say 4 I suppose so I will thank you to do something 5 Incoming mail server Lithium battery 6 M

veridata实验举例(3)验证veridata查找出insert操作导致的不同步现象

veridata实验举例(3)验证veridata查找出insert操作导致的不同步现象 续接:<veridata实验举例(2)验证表BONUS与表SALGRADE两节点同步情况>,地址:点击打开链接 环境: Item Source System Target System Platform Red Hat Enterprise Linux Server release 5.4 Red Hat Enterprise Linux Server release 5.4 Hostname gc1 g