首页 > 其他分享 >刷题记录2

刷题记录2

时间:2024-08-08 10:54:39浏览次数:18  
标签:return 记录 int max a1 add a2 刷题

小白逛公园

  • 注意线段树的分块思维,以及分治的思维,写了好久,还看了题解

AC code

#include <bits/stdc++.h>
using namespace std;
#define int long long
// P4513 小白逛公园
int read()
{
    int x = 0, f = 1;char ch = getchar();
    while (!isdigit(ch)){if (ch == '-')f = -1;ch = getchar();}
    while (isdigit(ch)){x = x * 10 + ch - '0';ch = getchar();}
    return x * f;
}
const int maxn = 5e5 + 9;
inline int min(int a, int b, int c)
{
    return min(min(a, b), c);
}
inline int max(int a, int b, int c){return max(max(a,b),c);}
inline int max(int a, int b, int c,int d){return max(max(a,b),max(c,c));}
class seg
{
public:
#define ls(p) (p << 1)
#define rs(p) (p << 1 | 1)
    struct node
    {
        int l, r, sum, lv, rv; // lv 包含左边界的最大值, rv 包含右边界的最大值
        int ma;
    };
    int a[maxn];
    node t[maxn<<2];
    void update(int p)
    {
        if(t[p].l==t[p].r)return ;// 防止越界
        t[p].sum = t[ls(p)].sum + t[rs(p)].sum;
        t[p].lv = max(t[ls(p)].lv, t[rs(p)].lv + t[ls(p)].sum);
        t[p].rv = max(t[rs(p)].rv, t[ls(p)].rv + t[rs(p)].sum);
        t[p].ma = max(t[ls(p)].ma,t[rs(p)].ma,t[ls(p)].rv+t[rs(p)].lv);
    }
    void build(int p, int l, int r)
    {
        t[p].l = l, t[p].r = r;
        if (l == r)
        {
            t[p].ma=a[l];
            t[p].sum = a[l];
            t[p].lv = a[l];
            t[p].rv = a[l];
            return;
        }
        int mid = (l + r) >> 1;
        build(ls(p), l, mid);
        build(rs(p), mid + 1, r);
        update(p);
    }
    void change(int p,int x,int v)
    {
        if(t[p].l==t[p].r&&t[p].l==x)
        {
            
            t[p].ma=t[p].rv=t[p].lv=t[p].sum=v;
            return ;
        }
        int mid=(t[p].l+t[p].r)>>1;
        if(mid>=x)change(ls(p),x,v);
        else  change(rs(p),x,v);
        update(p);
    }
    vector<int> ask(int p,int x,int y)
    {
        if(x<=t[p].l&&t[p].r<=y)
        {
            return {t[p].ma,t[p].sum,t[p].lv,t[p].rv};// 0 代表最终的答案 
            
        }
        int mid=(t[p].l+t[p].r)>>1;
        if(mid>=x&&mid<y){
            vector<int> l=ask(ls(p),x,y),r=ask(rs(p),x,y), ans(4,0);
            ans[0]=max(l[0],r[0],r[2]+l[3]);
            ans[1]=l[1]+r[1];
            ans[2]=max(l[2],l[1]+r[2]);
            ans[3]=max(r[3],l[3]+r[1]);
            return ans;
        }
        else if(mid>=x)return ask(ls(p),x,y);
        else if(mid <y) return ask(rs(p),x,y);
    }
};
seg T;

signed main()
{
    int n,m,k,a,b;
    n=read(),m=read();
    for(int i=1;i<=n;i++)T.a[i]=read();
    T.build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        k=read(),a=read(),b=read();
        if(k==1)
        {
            if(a>b)swap(a,b);   
            cout<<T.ask(1,a,b)[0]<<'\n';
        }
        else
        {
            T.change(1,a,b);
        }
    }
    return 0;
}

冒泡排序

  • 主要是思维的转化 $ k $ 轮冒泡排序后剩下的逆序对的数量是 $ \sum\limits_{i=k}^n(i-k) \times a[i] $ , \(a[i]\) 代表前方存在 $ i $ 个比自己大的数的个数 , 通过树状数组就可以转化成 维护两个序列 , $ a[i] $ 和 $ i\times a[i] $ 当然也可以用线段树做,但是树状数组的常数时间更小
#include <bits/stdc++.h>
#define print(x)    cout<<#x <<'='<<x<<'\n'
#define int long long
using namespace std;
int n, m;
int read()
{
    int x = 0, f = 1;
    char c = getchar();
    while (!isdigit(c))
    {
        if (c == '-')
            f = -1;
        c = getchar();
    }
    while (isdigit(c))
    {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}
const int maxn = 2e5 + 9;
int a[maxn];
int b[maxn], c[maxn], d[maxn], e[maxn];
inline int lowbit(int x) { return x & -x; }
void add(int *ar, int x, int y)
{
    while (x <= n)
    {
        ar[x] += y;
        x += lowbit(x);
    }
}
int sum(int *ar, int x)
{
    int ans = 0;
    while (x>0)
    {
        ans += ar[x];
        x -= lowbit(x);
    }
    return ans;
}
signed main()
{
    n = read(), m = read();
    for (int i = 1; i <= n; i++)
    {
        a[i] = read();
        add(b, a[i], 1);
        int k = i - sum(b, a[i]);
        e[i] = k;
        if (k != 0)
        {
            add(c, k, 1);
            add(d, k, k);
        }
    }
    int x, y;
    for (int i = 1; i <= m; i++)
    {
        x = read(), y = read();
        if (x == 1)
        {
            if (a[y] > a[y + 1])
            {
                int a1 = e[y], a2 = e[y + 1];
                swap(e[y],e[y+1]);
                e[y]--;
                if (a2 != 0)
                    add(c, a2, -1);
                if (a2 - 1 > 0)
                    add(c, a2 - 1, 1);
                if (a2 != 0)
                    add(d, a2, -a2);
                if (a2 - 1 > 0)
                    add(d, a2 - 1, a2 - 1);
                
            }
            else
            {
                int a1 = e[y], a2 = e[y + 1];
                swap(e[y],e[y+1]);
                e[y+1]++;
                add(c, a1 + 1, 1);
            if(a1!=0)    add(c, a1, -1);
                add(d, a1 + 1, a1 + 1);
            if(a1!=0)    add(d, a1, -a1);
            }
            swap(a[y], a[y + 1]);
        }
        else
        {
            // if(y-1!=0)print(sum(d,y-1)),print(sum(c,y-1));
            // print(sum(d,n));
            if(y>=n)cout<<0<<'\n';
            else
            cout << sum(d, n) - (y-1==0?0:sum(d, y-1)) - y * (sum(c, n) - (y-1==0?0:sum(c, y-1))) << '\n';
        }
    }
    return 0;
}

标签:return,记录,int,max,a1,add,a2,刷题
From: https://www.cnblogs.com/cxjy0322/p/18348513

相关文章

  • Git合并之————指定提交记录合并
    应用场景在测试环境提交了多个功能代码,其中一个功能需要提前上线如图所示,红框部分为我本次需要上线的功能提交记录代码,绿框部分为我已选择上线成功,可以看到红框与绿框直接的内容并没有被带入master分支.这里我以IDEA为例.首先,切换到master分支,也就是你需要......
  • 知能行考研数学- AI刷题APP使用体验
    我会从我的个人的使用经验出发,详细描述知能行这个AI刷题APP可以在备考中起到的作用。我为什么使用知能行我第一次使用知能行是在4月附近,当时学习正好有位学长的考研经验分享然后加了他的联系方式。通过和他交流然后我就尝试了一下知能行决定使用知能行主要有两个原因:1.这是......
  • 2024.08.07 记录一下面试。
    这次面试面试官就说我们想要基础好的,所以就问了一堆基础问题。这里的知识点图片都是来自JavaGuide,如果不是图片我会贴一下链接,但是很有可能我都不会解答。Java面试指南|JavaGuide按我能想到的写。1.手动获得spring配置文件application.yml文件。......
  • 记一次微信聊天记录导出工具的折腾
    目前的微信app(iOS端v8.0.46)聊天记录中,允许用户基于图片/视频进行筛选单个或者少量保存到本机没啥问题但是如果你量很大,不好意思,有批量操作功能,但是我不支持全选,因为我批量操作单次最多只支持9个文件就是玩儿!前提说明本文方法仅适用于iOS本次折腾实现的目......
  • 记录
    CF1556FSportsBettingDP、正难则反首先很明显可以转化为求每个点的获胜概率。直接考虑获胜的情况,发现由于获胜具有传递性,一个点的全局获胜情况可以会有其他点的局部获胜情况转移得来。由于每个点有一个权值\(a_i\),每个点不是等价的,也就是说到达点的不同会影响答案,这里只......
  • MySQL删除重复记录并且只保留最新一条
    目录测试表方式一:分组查询出每组最大的ID,其余的删除方式二:先标记重复待清理的数据,检查后清理附言查询所有重复的列:这里给到MySQL5.7和8.0版本的查询方式在开发过程中,因为某些问题可能会导致同一条数据在表中重复出现,此时我们需要申请权限走SQL去修复,下面介绍下具体修......
  • 使用python读取mysql数据,并记录到本地的文件中
    上次写过一次读取sqlserver数据,写入本地文件。今天分享一下mysql的。原理相似,希望对大家有小小的帮忙PS,我是3.6.13版本python,上一版本用包mysql-connector,一直不成功,查询官方文档,发现这个版本的PYTHON简直是奇葩的存在了。基本所有版本都支持,就是几个小版本排除在外了。......
  • 2024.08 别急记录
    1.ARC072F-Dam发现当\(t\)递增时优先倒掉前面的,再选后面的;否则优先选后面的,再一起倒掉。所以维护单调队列中\(t\)递增,每次弹出队首\(>L\)的部分,然后插入队尾。若队尾\(t_{i-1}>t_i\)则将两个合并。点击查看代码//AT_arc072_d#include<bits/stdc++.h>usingnames......
  • 算法力扣刷题记录 六十八【131.分割回文串】
    前言回溯章节第六篇。切割问题。记录六十八【131.分割回文串】。一、题目阅读给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。回文串指字符串从前读和从后读一样。返回s所有可能的分割方案。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]......
  • MYSQL死锁分析案例二(高并发增删改同一条记录)
    1、建表CREATETABLE`t1`(`id`intNOTNULL,`name`varchar(200)DEFAULTNULL,`age`intDEFAULTNULL,PRIMARYKEY(`id`),KEY`idx111`(`name`),KEY`idx_age`(`age`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci2、数据......