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