首页 > 其他分享 >第 372 场周赛(位运算技巧,跳表 + 二分,线段树)

第 372 场周赛(位运算技巧,跳表 + 二分,线段树)

时间:2023-11-20 09:34:14浏览次数:38  
标签:周赛 vector return int res heights 跳表 ans 372

 

class Solution:
    def findMinimumOperations(self, s1: str, s2: str, s3: str) -> int:
        cnt = 0
        for a, b, c in zip(s1, s2, s3):
            if not a == b == c:
                break
            cnt += 1
        if cnt == 0:
            return -1
        mi = min(len(s1), len(s2), len(s3))
        return len(s1) + len(s2) + len(s3) - 3 * cnt

 

 

class Solution:
    def minimumSteps(self, s: str) -> int:
        ans = cnt1 = 0

        for c in s:
            if c == '0':
                ans += cnt1
            else:
                cnt1 += 1

        return ans

 

 

 

class Solution:
    def maximumXorProduct(self, a: int, b: int, n: int) -> int:
        if a < b:
            a, b = b, a

        mask = (1 << n) - 1 # n个1

        ax = a & ~mask # 无法通过mask修改的部分
        bx = b & ~mask
        # 把低位抠出来
        a &= mask
        b &= mask

        left = a ^ b # 一位为1,一位为0的位
        one = mask ^ left # 全为0的位,全部变为1
        ax |= one
        bx |= one

        if left > 0 and ax == bx:
            high_bit = 1 << (left.bit_length() - 1)
            ax |= high_bit
            left ^= high_bit
        
        bx |= left

        MOD = 10**9 + 7

        return ax * bx % MOD

 

 

 

跳表+二分

class Solution {
public:
    const static int N = 50005, M = 17;
    int f[N][M];
    
    void init(const vector<int> &a, int n) {
        for(int j = 0; j < M; j ++ ) {
            for(int i = 1; i <= n - (1 << j) + 1; i ++ ) {
                if(!j) f[i][j] = a[i - 1];
                else {
                    f[i][j] = max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);
                }
            }
        }
    }
    
    int query(int l, int r) {
        int k = __lg(r - l + 1);
        return max(f[l][k], f[r - (1 << k) + 1][k]);
    }
    
    vector<int> leftmostBuildingQueries(vector<int>& heights, vector<vector<int>>& queries) {
        int n = heights.size(), m = queries.size();
        init(heights, n);
        vector<int> res(m);
        for(int i = 0; i < m; i ++ ) {
            int l = queries[i][0] + 1, r = queries[i][1] + 1;
            if(l > r) swap(l, r);
            if(l == r) res[i] = l - 1;
            else if(heights[l - 1] < heights[r - 1]) res[i] = r - 1;
            else {
                int L = r, R = n + 2;
                while(L + 1 < R) {
                    int m = (L + R) >> 1;
                    if(query(r + 1, m) > heights[l - 1]) R = m;
                    else L = m;
                }
                if(L == n + 1) res[i] = -1;
                else res[i] = L;
            }
        }
        
        return res;
    }
};

 

线段树做法

class Solution {
public:

    vector<int> tr;

    void build(int u, int l, int r, vector<int> &heights) {
        if(l == r) {
            tr[u] = heights[l - 1];
            return;
        }
        int m = l + r >> 1;
        build(u << 1, l, m, heights);
        build(u << 1 | 1, m + 1, r, heights);
        tr[u] = max(tr[u << 1], tr[u << 1 | 1]);
    }

    int query(int u, int l, int r, int L, int v) {
        if(v >= tr[u]) return 0;
        if(l == r) return l;
        int mid = l + r >> 1;
        if(L <= mid) {
            int pos = query(u << 1, l, mid, L, v);
            if(pos > 0) return pos; 
        }

        return query(u << 1 | 1, mid + 1, r, L, v);
    }

    vector<int> leftmostBuildingQueries(vector<int>& heights, vector<vector<int>>& queries) {
        int n = heights.size();
        tr.resize(n * 4);
        build(1, 1, n, heights);

        vector<int> ans;

        for(auto &q: queries) {
            int i = q[0], j = q[1];
            if(i > j) swap(i, j);

            if(i == j || heights[i] < heights[j]) {
                ans.push_back(j);
            } else {
                int pos = query(1, 1, n, j + 1, heights[i]);
                ans.push_back(pos - 1);
            }
        }

        return ans;
    }
};

 

标签:周赛,vector,return,int,res,heights,跳表,ans,372
From: https://www.cnblogs.com/zk6696/p/17843217.html

相关文章

  • Acwing.第130场周赛
    Acwing.第130场周赛比赛链接A.最大数和最小数题目链接思路:简单模拟,使用max()和min()函数就可以了代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ inta,b,c; cin>>a>>b>>c; cout<<max(a,max(b,c))<<""<<min(a,min(b,c))<......
  • 跳表模型
    跳表RMQ算法求解静态区间最值的一种算法。f[i][j]表示从i出发,长度为2^j这一段区间的最大值。初始化和递推:voidinit(){for(intj=0;j<M;j++){for(inti=1;i+(1<<j)-1<=n;i++){if(!j)f[i][j]=w[i];el......
  • bupt ai院第一次周赛题解
    题目一简单模拟题点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineebkemplace_back#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefvector<string>VS;typedef......
  • LeetCode 第 115 场双周赛
    2899.上一个遍历的整数感觉读题比较困难classSolution{public:vector<int>lastVisitedIntegers(vector<string>&words){vector<int>res,a;for(inti=0,cnt=0,x;i<words.size();i++){if(words[i......
  • 第 117 场双周赛(容斥原理,记忆化搜索,排序)
     本题我们采用隔板法+容斥原理来解决合格总方案数=总方案书-不合理的方案数=不考虑limit的方案数-不合法方案数(至少有一个小朋友>limit)任意方案数n个小球放到3个盒子中->n+2个位置,选两个位置放隔板剩下位置放球c(n+2,2)三个小朋友为:甲乙丙小朋友甲(乙丙)>l......
  • Acwing.第 129 场周赛
    Acwing.第129场周赛比赛地址A.字符串题目思路:只需要用到reverse()反转函数就可以代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ strings; cin>>s; reverse(s.begin(),s.end()); cout<<s<<endl; }intmain(){ intt=1; while(t--){ solv......
  • 【LC周赛-371】 D. Trie树求最大异或对
    【LC周赛-371】D.Trie树求最大异或对题意给一个数组,求两个数满足|x-y|<=min(x,y)的异或最大值。题解从|x-y|<=min(x,y)知道,每个y可以考虑的x范围是y/2<=x<y;然后Trie树实现更优复杂度内,从窗口获得最大异或值思路就是高位依次取值,具体看代码吧代码constint......
  • 第371场周赛
    至少在态度上有进步昨天参加了今天也参加了  跟昨晚的类似第一题和第四题都是一样的但是plus版要求时间复杂度给你一个下标从 0 开始的整数数组 nums 。如果一对整数 x 和 y 满足以下条件,则称其为 强数对 :|x-y|<=min(x,y)你需要从 nums 中选出两个......
  • 第117场双周赛-3min签到题,然后做不了一点
     给你两个正整数 n 和 limit 。请你将 n 颗糖果分给 3 位小朋友,确保没有任何小朋友得到超过 limit 颗糖果,请你返回满足此条件下的 总方案数 。 示例1:输入:n=5,limit=2输出:3解释:总共有3种方法分配5颗糖果,且每位小朋友的糖果数不超过2:(1,2,2),(2......
  • 跳表的设计与实现
    链表作为一种数据结构我们是比较熟知的,相对数组来说插入和删除操作性能比较高,因为数组涉及到移位操作,但数组可以利用二分法进行快速查找,而在链表中想要获取当前元素,就必须知道该元素的上一个节点(头节点除外),这就限制了链表在查找操作的性能,试想有没有一种数据结构,在链表基础上也能......