力扣寒假刷题笔记(15)2.8 二分练习

一、每日一题

class Solution {
public:
    vector<int> gridIllumination(int n, vector<vector<int>> &lamps, vector<vector<int>> &queries) {
        unordered_map<int, int> row, col, diagonal, antiDiagonal;
        auto hash_p = [](const pair<int, int> &p) -> size_t {
            static hash<long long> hash_ll;
            return hash_ll(p.first + (static_cast<long long>(p.second) << 32));
        };
        unordered_set<pair<int, int>, decltype(hash_p)> points(0, hash_p);
        for (auto &lamp : lamps) {
            if (points.count({lamp[0], lamp[1]}) > 0) {
                continue;
            }
            points.insert({lamp[0], lamp[1]});
            row[lamp[0]]++;
            col[lamp[1]]++;
            diagonal[lamp[0] - lamp[1]]++;
            antiDiagonal[lamp[0] + lamp[1]]++;
        }
        vector<int> ret(queries.size());
        for (int i = 0; i < queries.size(); i++) {
            int r = queries[i][0], c = queries[i][1];
            if (row.count(r) > 0 && row[r] > 0) {
                ret[i] = 1;
            } else if (col.count(c) > 0 && col[c] > 0) {
                ret[i] = 1;
            } else if (diagonal.count(r - c) > 0 && diagonal[r - c] > 0) {
                ret[i] = 1;
            } else if (antiDiagonal.count(r + c) > 0 && antiDiagonal[r + c] > 0) {
                ret[i] = 1;
            }
            for (int x = r - 1; x <= r + 1; x++) {
                for (int y = c - 1; y <= c + 1; y++) {
                    if (x < 0 || y < 0 || x >= n || y >= n) {
                        continue;
                    }
                    auto p = points.find({x, y});
                    if (p != points.end()) {
                        points.erase(p);
                        row[x]--;
                        col[y]--;
                        diagonal[x - y]--;
                        antiDiagonal[x + y]--;
                    }
                }
            }
        }
        return ret;
    }
};

 二、二分练习

#include <iostream>
#include <cstring>
using namespace std;
const int N=100100;
int n;
int q[N],maxval;
bool success(int x)
{
    int temp = x;
    for(int i=0;i<n;i++)
    {
        temp += (temp - q[i]);
        if(temp < 0) return false;
        if(temp >= maxval) return true; //如果大于最大值的话会一直增大
    }
    return true;
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>q[i];
        maxval = max(q[i],maxval);
    }
    int l = 0,r = maxval;
    while(l<r)
    {
        int mid = l + r >>1;
        if(!success(mid)) l = mid+1;
        else r = mid;
    }
    cout<<l;
}

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;
int n,m;
const int N = 25 * 1e6 + 10;
struct Sum{
    int s,c,d;
    bool operator< (const Sum &t)const
    {
        if(s != t.s)    return s < t.s;
        if(c != t.c)    return c < t.c;
        return d < t.d;
    }
}sum[N];
int main()
{
    cin >>n;
    for(int c = 0;c * c <= n;++c){
        for(int d = c;c * c + d * d <= n;++d){
            sum[m++] = {c * c + d * d,c,d};
        }
    }
    sort(sum,sum + m);
    for(int a = 0;a * a <= n;++a){
        for(int b = a;a * a + b * b <= n;++b){
            int t = n - a * a - b * b;
            int l = 0,r = m - 1;
            while(l < r){
                int mid = l + r >> 1;
                if(sum[mid].s >= t) r = mid;
                else    l = mid + 1;
            }
            if(sum[l].s == t){
                printf("%d %d %d %d\n",a,b,sum[l].c,sum[l].d);
                return 0;
            }
        }
    }
    return 0;
}

 

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
typedef pair<int,int> PII;
const int N=100010;
vector<PII> q;
int n,k,maxc;
bool valid(int x)
{
    int cnt =0 ;
    for(int i=0;i<n;i++)
    {
        int a=q[i].first,b = q[i].second;
        cnt += (a/x) * (b/x);
    }
    if(cnt>=k) return true;
    return false;
}
int main()
{
    cin >> n >> k;
    for(int i=0;i<n;i++)
    {
        int a,b;
        maxc = max(maxc,a);
        cin>>a>>b;
        q.push_back({a,b});
    }
    int l=1,r = maxc;
    while(l<r)
    {
        int mid = l+r+1>>1;
        if(!valid(mid)) r = mid - 1;
        else l = mid;
    }
    cout<<l;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值