首页 > 其他分享 >第 116 场双周赛(双指针,背包问题,线段树+lz标记)

第 116 场双周赛(双指针,背包问题,线段树+lz标记)

时间:2023-10-29 10:33:43浏览次数:32  
标签:nums int res 线段 tr 双周 116 long lz

 本题为双指针和贪心。当我们遇到奇数个0或1时,直接将下一位改变即可。

class Solution {
public:
    int minChanges(string s) {
        int n = s.size();

        int res = 0;
        int l = 0, r = -1;
        while(r ++ < n - 1) {
            if(s[l] == s[r]) continue;
            if((r - l) % 2 == 0) {
                l = r;
                continue;
            }
            s[r] = s[r] == '0'? '1': '0';
            l = r + 1;
            res ++ ;
        }

        return res;
    }
};

 

 

 本题f[i][j]表示只从前i个数中选,子序列和为j的所有方案数

if (j >= nums[i]) f[i][j] = f[i - 1][j - nums[i]] + 1  属于完全装满的01背包问题。

class Solution {
public:
    int lengthOfLongestSubsequence(vector<int>& nums, int target) {
        int n = nums.size();
        vector<int> f(1010, INT_MIN);
        f[0] = 0;
        int s = 0;

        for(auto x: nums) {
            s = min(s + x, target);
            for(int j = s; j >= x; j -- ) {
                f[j] = max(f[j], f[j - x] + 1);
            }
        }

        return f[target] > 0 ? f[target]: -1;
    }
};

 

 

 首先本题要求区间不同计数的平方和。

可以将此问题拆分为: 

        1、某个区间的不同数的个数

        2、子问题1所求得个数的平方和

可以用线段树来求解。

1、快速求出区间不同数的个数 -> 哈希 + 线段树

另 unordered_map<int, int> last; 即为nums[i]上一次出现的位置,那么对于last[nums[i]] 到 i 之间的所有区间,就都相当于包含了次数字。

2、快速求出区间平方和 -> 线段树 + lz标记

 我们同时维护区间和s1和区间平方和s2,

            s2 = s2 + 2 * k * s1 + k * k

            s1 = s1 + len * k

class Solution {
public:
    const static int N = 1e5 + 10, MOD = 1e9 + 7;

    struct Node {
        int l, r;
        long long sum1, sum2;
        int lazy;
    }tr[N * 4];

    void push_up(int u) {
        tr[u].sum1 = (tr[u << 1].sum1 + tr[u << 1 | 1].sum1) % MOD;
        tr[u].sum2 = (tr[u << 1].sum2 + tr[u << 1 | 1].sum2) % MOD;
    }

    void add(int u, int K) {
        int len = tr[u].r - tr[u].l + 1;
        tr[u].sum2 = (tr[u].sum2 + 2LL * K * tr[u].sum1 + 1LL * K * K % MOD * len);
        tr[u].sum1 = (tr[u].sum1 + 1LL * K * len) % MOD;
    }

    void push_down(int u) {
        tr[u << 1].lazy += tr[u].lazy;
        add(u << 1, tr[u].lazy);
        tr[u << 1 | 1].lazy += tr[u].lazy;
        add(u << 1 | 1, tr[u].lazy);
        tr[u].lazy = 0;
    }

    void build(int u, int l, int r) {
        if(l == r) tr[u] = {l, r, 0, 0, 0};
        else {
            tr[u] = {l, r, 0, 0};
            int mid = l + r >> 1;
            build(u << 1, l, mid);
            build(u << 1 | 1, mid + 1, r);
            push_up(u);
        }
    }

    void modify(int u, int l, int r) {
        if(tr[u].l >= l && tr[u].r <= r) {
            add(u, 1);
            tr[u].lazy ++ ;
        } else {
            push_down(u);
            int mid = tr[u].l + tr[u].r >> 1;
            if(l <= mid) modify(u << 1, l, r);
            if(r > mid) modify(u << 1 | 1, l, r);
            push_up(u);
        }
    }

    int sumCounts(vector<int>& nums) {
        int n = nums.size();
        build(1, 1, n + 5);
        long long res = 0;
        unordered_map<int, int> last;
        for(int i = 1; i <= n; i ++ ) {
            auto &old = last[nums[i - 1]];
            modify(1, old + 1, i);
            old = i;
            res = (res + tr[1].sum2) % MOD;
        }

        return res;
    }
};

 

标签:nums,int,res,线段,tr,双周,116,long,lz
From: https://www.cnblogs.com/zk6696/p/17795564.html

相关文章

  • 第 116 场双周赛
    不知道为什么今天晚上脑子里想的全是递归  说实话四道题看了都不是很有思路也不是没有思路吧而是知道怎么做但是感觉写不出来而且莫名其妙想的全是递归的解法可能是因为浏览量最高的那篇文章也是递归22:43-23:10差不多30min写了两道题 第一题(22:58AC)100094. 子数......
  • Databend 开源周报第 116 期
    Databend是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn。What'sOnInDatabend探索Databend本周新进展,遇到更贴近你心意的Databend。特性预览:使用SQL管理后台任务此前,Databend引入了......
  • Databend 开源周报第 116 期
    Databend是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn。What'sOnInDatabend探索Databend本周新进展,遇到更贴近你心意的Databend。特性预览:使用SQL管理后台任务此前,Databend引入了后......
  • Oracle10gOCP042题库121166题共168题
    121.Youwanttocreateanewoptimizeddatabaseforyourtransactionalproductionenvironmenttobeusedbyafinancialapplication.Whilecreatingthedatabase,youwanttheOraclesoftwaretotakecareofallbasicsettingstooptimizethedatabasep......
  • 【实测有效】.epub文件如何批量转换为word/AZW3/MOBI/DOCX/RTF/TXT/HTMLZ? 附工具下载
    常见电子书格式有很多种,其中有一种.epub格式,这种格式的文件比较多,也比较容易找到,阅读器也有多款软件支持。国内用的相对多点的比如ApabiReader。有时候,.epub文件明明是正常的,但ApabiReader却会报错而无法打开。上篇优爱酷分享了如何将.epub文件转换为可编辑的word,但是手动操作比......
  • 1168
    复制代码到粘帖板#include<bits/stdc++.h>#include<string>usingnamespacestd;intmain(){strings1,s2;cin>>s1>>s2;inta[201]={},b[201]={},c[201]={};intlena=s1.size();intlenb=s2.size();for(int......
  • lzm pic 1
    ......
  • 文心一言 VS 讯飞星火 VS chatgpt (116)-- 算法导论10.3 1题
    一、用go语言,画图表示序列(13,4,8,19,5,11),其存储形式为多数组表示的双向链表。同样画出单数组表示的形式。文心一言:在Go语言中,我们无法直接画图,但我可以帮助你描述如何使用Go语言来表示和操作多数组表示的双向链表和单数组表示。首先,多数组表示的双向链表可以表示为以下的数据结构:......
  • 蓝桥第一场双周赛
    蓝桥第一场双周赛最后一题看了别人代码还是有点不会,有些知识还没学到,等学会了再回来补这个最后一题比赛地址三带一题目链接思路:就是一个比较简单的模拟代码:/*[[⣇⣿⠘⣿⣿⣿⡿⡿⣟⣟⢟⢟⢝⠵⡝⣿⡿⢂⣼⣿⣷⣌⠩⡫⡻⣝⠹⢿⣿⣷]],[[⡆⣿⣆⠱⣝⡵⣝⢅⠙⣿⢕⢕⢕⢕⢝⣥......
  • CF1168C And Reachability
    CF1168CAndReachabilityAndReachability-洛谷|计算机科学教育新生态(luogu.com.cn)目录CF1168CAndReachability题目大意思路code题目大意给定一个长度为\(n\)的数组\(a\)。你可以选择一个长度为\(k\)的数组\(p\)\(p_1=x,p_k=y\)当\(x<y\)且\(a_......