hud4768(Flyer)详解,二分搜索

本文探讨了在大规模数据集中使用二分查找定位特定元素的方法,并详细解释了如何通过奇偶性判断目标位置范围,同时介绍了高效处理大量数据时变量定义及数组应用的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:点击打开链接

需要注意的点是:

1.如何表示这些票发给了某人(开始我想的是用数组,然后数组下标代表人,数组中存票数,不过这里数据量太大,不可)。

2.通过奇,偶性来知道要找的人在那个区间。

3.如何定义较大的数据变量。

4.二分搜索结束后,想找的人如何表示

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
long long a[200001], b[200001], c[200001];
long long cal(long long mid){//本函数用于判断截止到mid发出去的传单数量
    int sum = 0;
    for(int i = 0; i < n; i++){//用来求总的发传单的次数
        long long x = min(b[i], mid);//x用来表示最左端到mid的距离,但是当b[i]<mid的时候,只算到b[i],就足够了
        if(x>=a[i])//需要保证x在a[i]右边
            sum += (x-a[i])/c[i] + 1;//求单个社团传单的次数,例如(20-5)/7 = 2,而这里还有计算上5本身也有一张票所以再加1
    }
    return sum;
}
void solve(){
    long long l, r, mid, sum;
    l = 0; r = 1LL << 31;//学生总数为1到2^32,1LL是2^64,位运算31后是2^33
    while(l < r){
        mid = (l + r)/2;
        sum = cal(mid);
        if(sum%2 == 0) l = mid + 1;//当返回值(从左到中的发出去的票数)为偶数,说明该学生在右边
        else r = mid;
    }
    if(l == 1LL << 31)//找完也没有
        printf("DC Qiang is unhappy.\n");
    else{
        while(cal(r)%2 == 0) r++;//因为r和l交错后循环结束,所以向右寻找合适的r(也可向左寻找合适的l)
        cout<<r<<' '<<cal(r)-cal(r-1)<<endl;
    }
}
int main(){
    while(scanf("%d", &n) != EOF){
        for(int i = 0; i < n; i++){
            scanf("%d%d%d", &a[i], &b[i], &c[i]);
        }
        solve();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值