• 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.
    ");
    44     else{
    45       long long num=getsum(ans)-getsum(ans-1);
    46     printf("%I64d %I64d
    ",ans,num);
    47     }
    48   }
    49 }
    View Code
  • 相关阅读:
    php
    php
    linux 网络管理基础 OSI ISO IOS的区别
    Linux 添加交换分区的步骤
    linux 命令
    linux命令
    linux 命令
    linux 命令
    Linux命令
    linux命令- 挂载命令 mount
  • 原文地址:https://www.cnblogs.com/chujian123/p/3936562.html
Copyright © 2020-2023  润新知