[BZOJ3295][Cqoi2011]动态逆序对

PyCharm配置WSL开发环境保姆级教程:从安装Conda到项目依赖一键搞定 本文提供PyCharm配置WSL开发环境的完整教程,涵盖从安装Conda到项目依赖管理的全流程。详细介绍了WSL2环境准备、Conda环境配置、PyCharm远程解释器设置等关键步骤,并包含实用技巧和常见问题解决方案,帮助开发者高效搭建Python开发环境。 阅读详情
题意

给定一个N个数序列,以及M个操作,每个操作删除一个数,求每次操作前数列中逆序对的个数

(x,y)满足A[x]<A[y]且x>y,即为逆序对。


第一想法是线段树套treap,交上去的时候发现treap没有打旋转……结果6.9s过了,打完旋转后9.6s……

#include <cstdio>
#include <cstdlib>
#define N 100010

typedef long long ll;

struct trp{
    trp *ls,*rs;
    int x,sz,rnd,ds;
}P[N<<5],*t=P,_nil,*nil;

struct xds{
    int l,r;
    trp *rt;
}T[N<<2];

int n,m,pst[N],Bit[N];
ll Ans;

inline void reaD(int &x){
    char Ch=getchar();x=0;
    for(;Ch>'9'||Ch<'0';Ch=getchar());
    for(;Ch>='0'&&Ch<='9';x=x*10+Ch-'0',Ch=getchar());
}

inline trp *New(int x,int r){
    trp *w=t++;
    w->ls=w->rs=nil;w->ds=0;
    w->sz=1;w->x=x;w->rnd=r;
    return w;
}

inline void upd(trp *x){x->sz=x->ls->sz+x->rs->sz+1;}
inline void lrt(trp *&x){trp *y=x->ls;x->ls=y->rs;y->rs=x;upd(x);upd(y);x=y;}
inline void rrt(trp *&x){trp *y=x->rs;x->rs=y->ls;y->ls=x;upd(x);upd(y);x=y;}

void Inst(trp *&g,int x){
    if(g==nil){g=New(x,rand());return;}
    if(g->sz++,g->x>x){Inst(g->ls,x);/*if(g->rnd<g->ls->rnd)lrt(g);*/}//就是这个旋转......
    else{Inst(g->rs,x);/*if(g->rnd<g->rs->rnd)rrt(g);*/}
}

void build(int g,int l,int r){
    T[g].l=l;T[g].r=r;T[g].rt=nil;
    if(l==r) return;
    int mid=l+r>>1;
    build(g<<1,l,mid);build(g<<1|1,mid+1,r);
}

void InserT(int g,int p,int x){
    Inst(T[g].rt,x);
    if(T[g].l==T[g].r) return;
    int mid=T[g].l+T[g].r>>1;
    if(p<=mid) InserT(g<<1,p,x);
    else InserT(g<<1|1,p,x);
}

inline void insertb(int x){for(;x;x-=x&-x) Bit[x]++;}

inline int queryb(int x){
    int Res=0;
    for(;x<=n;x+=x&-x) Res+=Bit[x];
    return Res;
}

int w[30],wt;

inline int Qry(trp *g,int x,int k){
    int r=0;
    if(k==1)while(g!=nil)if(g->x>x) r+=g->sz-g->ls->sz,g=g->ls;else g=g->rs;
    else while(g!=nil)if(g->x<x) r+=g->sz-g->rs->sz,g=g->rs;else g=g->ls;
    return r;
}

int query(int g,int l,int r,int x,int k){
    if(T[g].l==l&&T[g].r==r) return Qry(T[g].rt,x,k);
    int mid=T[g].l+T[g].r>>1;
    if(r<=mid) return query(g<<1,l,r,x,k);
    if(l>mid) return query(g<<1|1,l,r,x,k);
    return query(g<<1,l,mid,x,k)+query(g<<1|1,mid+1,r,x,k);
}

void delt(trp *g,int x){
    g->sz--;if(g->x==x)return;
    if(g->x>x)delt(g->ls,x);else delt(g->rs,x);
}

void Dlt(int g,int p,int x){
    delt(T[g].rt,x);
    if(T[g].l==T[g].r) return;
    int mid=T[g].l+T[g].r>>1;
    if(p<=mid) Dlt(g<<1,p,x);
    else Dlt(g<<1|1,p,x);
}

int main(){
    _nil.ls=_nil.rs=nil;nil=&_nil;_nil.sz=_nil.x=_nil.ds=0;
    reaD(n);reaD(m);build(1,1,n);
    for(int i=1,x;i<=n;i++){
        reaD(x),pst[x]=i,InserT(1,i,x);
        Ans+=queryb(x);insertb(x);
    }
    for(int i=1,x;i<=m;i++){
        printf("%lld\n",Ans);reaD(x);
        Ans-=query(1,1,pst[x],x,1)+query(1,pst[x],n,x,2);
        Dlt(1,pst[x],x);
    }
    return 0;
}

看大神博客学了CDQ分治,跑得飞快……

#include <cstdio>
#include <algorithm>
#define N 100010

typedef long long ll;

struct Unit{
    int t,x,y;
    bool operator<(Unit a)const{return t<a.t;}
}A[N],B[N];

inline void reaD(int &x){
    char Ch=getchar();x=0;
    for(;Ch>'9'||Ch<'0';Ch=getchar());
    for(;Ch>='0'&&Ch<='9';x=x*10+Ch-'0',Ch=getchar());
}

int n,m,pst[N],cnt,T[N],tt,Bit[N],t[N];
ll Ans[N];

inline void add(int x){
    for(;x;x-=x&-x)
        if(t[x]!=tt)t[x]=tt,Bit[x]=1;
        else Bit[x]++;
}

inline int query(int x){
    int res=0;
    for(;x<=n;x+=x&-x)
        if(t[x]==tt) res+=Bit[x];
    return res;
}

void S(int l,int r){
    if(l>=r) return;
    int mid=l+r>>1,l1=l,l2=mid+1;
    for(int i=l;i<=r;i++)
        if(A[i].x<=mid) B[l1++]=A[i];
        else B[l2++]=A[i];
    tt++;
    for(int i=mid+1,j=l;i<=r;i++){
        for(;B[j].t<B[i].t&&j<=mid;j++) add(B[j].y);
        Ans[B[i].t]+=query(B[i].y);
    }
    tt++;
    for(int i=l,j=mid+1;i<=mid;i++){
        for(;B[j].t<B[i].t&&j<=r;j++) add(B[j].y);
        Ans[B[i].t]+=(j-mid-1)-query(B[i].y);
    }
    for(int i=l;i<=r;i++)A[i]=B[i];
    S(l,mid);S(mid+1,r);
}

int w[30],wt;

int main(){
    reaD(n);reaD(m);cnt=n;
    for(int i=1,x;i<=n;i++) reaD(x),pst[x]=i;
    for(int i=1,x;i<=m;i++) reaD(x),T[x]=cnt--;
    for(int i=1;i<=n;i++)if(T[i]==0) T[i]=cnt--;
    for(int i=1;i<=n;i++) A[i]=(Unit){T[i],pst[i],i};
    std::sort(A+1,A+1+n);
    S(1,n);
    for(int i=1;i<=n;i++) Ans[i]+=Ans[i-1];
    for(int i=1;i<=m;i++) printf("%lld\n",Ans[n-i+1]);
    return 0;
}
GraphRAG深度解析:架构设计与实战案例 生成模块结合检索到的图数据和用户输入的查询,生成高质量的文本输出。通过结合图数据库中的知识,模型可以更准确地回答用户的问题,提供更优质的客户服务。通过分析用户的行为和偏好,结合图数据库中的知识,模型可以为用户提供个性化的推荐。:通过图数据库存储和检索结构化的知识,为语言模型提供丰富的背景信息,提升生成内容的质量和准确性。:选择合适的图数据库,如Neo4j、OrientDB等,以支持高效的图数据存储和检索。:利用图数据库的高效检索能力,快速找到与用户查询最相关的图元素,提高系统的响应速度。 阅读详情

相关推荐

微信小程序使用ucharts折线图,有负数显示0刻度线

当数据有负数和正数的时候默认不会显示0刻度线,不方便看出正负对比。

欢迎来到我的博客!在这里,我将分享我在前端开发方面的知识和经验。让我们一起探索前端开发的无限可能! 1579

bzoj3295【CQOI2011】动态逆序对

CDQ分治+树状数组

AaronPolaris 6140

Drugbank XML文件解析

DrugBank Release Version 5.1.13 | DrugBank Online点击download下载XML文件,也可以使用COMMAND命令下载。(下载文件需要先注册一个账号文件,就可以下载了)下载好压缩文件,并解压会得到如下两个文件:full database.xml就是我们所需要的XML文件,完整的XML很大,大约为1.6G因为原始的文件非常大,直接查看XML文件是有困难的,所以我们使用一下命令来查看该文件的前一百行 得到如下输出 对于前三行 第一行:表示XML 版本为 1.0

qtjbzs的博客 583

【BZOJ 3295】 [Cqoi2011]动态逆序对

CDQ分治+树状数组~

Regina8023 1339

Selenium实战:突破反爬,自动化抓取国家知识产权局专利数据

网络爬虫是数据采集的核心技术,其原理是通过程序模拟浏览器行为,自动访问网页并提取结构化信息。在数据驱动决策的今天,高效获取公开数据对市场分析、技术调研和竞争情报至关重要。然而,面对广泛应用的JavaScript动态渲染和反爬虫机制,传统的静态页面抓取方法往往失效。Selenium作为浏览器自动化工具,通过驱动真实浏览器执行JavaScript,能够有效绕过前端反爬,实现“可见即可得”的数据抓取,在需要与页面进行复杂交互或处理动态内容的场景中价值显著。本文以【专利数据】抓取为例,结合【Selenium】工具,

weixin_33881140的博客 392

360可视门铃双摄版数据恢复实战:BIN文件解析与视频重组

本文详细解析了360可视门铃双摄版BIN文件的数据恢复过程,包括文件结构分析、双摄像头数据存储机制及视频重组技术。通过Python开发环境和FFmpeg工具链,成功实现了H.265视频流的解析与重组,为智能家居设备数据恢复提供了实用解决方案。

weixin_29196891的博客 908

bzoj 3295 [Cqoi2011]动态逆序对

CDQ分治+树状数组

我要吃熊猫 392

Python遥感图像处理指南(2)-卫星影像分析MNDWI提取

在第一篇文章中,我们使用了我们导入的软件包中已定义的函数,如 rasterio 中的 open 和 read 以及 matplotlib 中的 imshow。现在,我们可以编写自己的函数了。函数是一段代码,它接收一些参数作为输入并返回输出(经过一些计算),可以在代码中多次重复使用,也可以被其他代码重用。在 Python 中定义一个新函数非常简单。return v在此语法示例中,arg1和arg2强制参数,应该传递给函数,否则会引发错误,而arg3是一个可选参数,如果是,则假定默认值 1从函数调用中省略。

gis收藏家的博客 1575

BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组

BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删 除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数 Input 输入第一行包含两个整数n和m,即初始元素的个数和删除...

135

[QMT量化交易小白入门]-十二、QMT回测龙头打首板和连板的策略

class a():passA = a() #创建空的类的实例 用来保存委托状态field_list定义了需要的市场数据字段,而类a用于保存交易状态。

木头大左的博客 4757

面向业务角色的 SAP Fiori Space 与 Page 创建全流程实战指南

业务角色导航设计:从Space与Page规划到实施 摘要:本文探讨了SAP S/4HANA Cloud和BTP ABAP环境中基于业务角色的导航设计方法。传统Fiori Launchpad的Group+Tile模式存在应用堆积问题,而新的Space与Page模型将导航按工作领域(如应付会计、销售代表)组织,每个Space包含多个任务导向的Page。文章详细介绍了从业务角色建模到Space/Page创建、分配的完整流程,包括核心概念解析、规划思路和具体操作步骤。重点阐述了如何根据业务需求选择创建方式(基于预交

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 183

【CQOI2011】【BZOJ3295】动态逆序对

Description 对于序列A,它的逆序对数定义为满足i<\ltj,且Ai>\gtAj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。 Input 输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数。以下n行每行包含一个1到n之间的正整数,即初始排列。以下m行每行一个正整数,依次为每次删除的元素。

CreationAugust is 14 years old forever 1617

【ARM CoreLink 系列 5.3 -- CI-700 SLC memory 系统组件详细介绍】

在 CI-700 系统级缓存(SLC)内存系统中,HN-F 节点负责管理缓存一致性和数据传输。每个 HN-F 节点可以发送三种类型的 Snoop 请求,以确保系统中多核处理器和缓存之间的一致性。CI-700 中的系统级缓存(SLC)内存系统通过 HN-F 节点支持 TrustZone® 技术。以下是 CI-700 支持的 SN 类型以及配置方法的简要介绍。ARM CI-700 系统级缓存(SLC)是一个分布式、主要排他性(mostly exclusive) 的最后一级缓存,集成在 HN-F 节点内。

CodingCos的博客 897

BZOJ3295 CQOI2011 动态逆序对

3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2263  Solved: 721 [Submit][Status][Discuss] Description 对于序列A,它的逆序对数定义为满足ij,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任

毒液哥的专栏 1002

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【bzoj3295】[Cqoi2011]动态逆序对

题目描述: 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。 输入: 输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数。以下n行每行包含一个1到n之间的正整数,即初始排列。以下m行每行一个正整数,依次为每次删除的元素。 ...

diaopinshuo4087的博客 120

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

bzoj3295[Cqoi2011] 动态逆序对

题目链接:bzoj3295 题目大意: 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。 题解: cdq分治 当前的逆序对数=总逆序对数-含删除元素的逆序对数+删除元素序列中新增加的逆序对数(因为一个逆序对会被重...

213

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

[BZOJ3295] [Cqoi2011]动态逆序对 && CDQ分治

CDQ跑的比分治快得多 首先 我们可以把每一个点看成一个三元组(x, y, z) x 表示它当前的值 y 表示的在序列中的编号 z 表示它的时间 即第z次操作后的这个点 所以 如果某个点P在平面上的左上方有点(值小于P并且位置在P之后) 后者右下方(恰好相反)的地方有点 就会形成一个逆序对 在一开始我们很容易求出每一个点形成的逆序对总数 每次删除的时候从ans中减去 然而 在CDQ分治的过

shiyukun1998的专栏 841

BZOJ3295: [Cqoi2011]动态逆序对

BZOJ3295删除好像挺麻烦的。。那就考虑倒一下,也就是倒序加值。 考虑一个值加入进来,对答案的影响就是,它左边的比它大的个数和它右边比它小的个数加和。 先只考虑一半。只考虑右边比它小的数的个数。那么假设当前加入的为一个三元组 (t,pos,x)(t,pos,x),表示时间,位置和值。那么就是求满足(tt<t,ppos>pos,xx<x)(tt<t,ppos>pos,xx<x)的三元组(tt

Heret1c 351

bzoj3295: [Cqoi2011]动态逆序对

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3295 题意:中午题。 分析:本来打算练习cdq分治的,明天补吧。不过看到这题一眼就想用可持久化线段树,不过带修改的可持久化线段树开销有点大,变了一种方法卡了点空间才过。详见代码。O(nlogn*logn)。 代码: #include #include #include #include

Fsss 715

【BZOJ3295】【Cqoi2011】动态逆序对

Description 对于序列A,它的逆序对数定义为满足ij,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。 Input 输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数。以下n行每行包含一个1到n之间的正整数,即初始排列。以下m行每行一个正整数,依次为每次删除的元素。

dcx2001的博客 222

bzoj3295 [Cqoi2011]动态逆序对

Description 对于序列A,它的逆序对数定义为满足ij,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。 Input 输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数。以下n行每行包含一个1到n之间的正整数,即初始排列。以下m行每行一个正整数,依次为每次删除的元素。

wfj_2048的博客 300

BZOJ3295 [Cqoi2011]动态逆序对

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数...

dgoh41514的博客 103

BZOJ 3295: Cqoi2011动态逆序对

题目 凭吊我以前没过的3KB代码和现在的1.2KB代码,哎。 题解: 首先我们比起删除更喜欢插入,所以我们可以把m次删除操作倒过来看作m次插入操作。 然后显然我们就需要求每次插入一个数,求出插入这个数增加了多少逆序对即可。(思路清晰) 那么这就是一个动态二维数点问题直接上树状数组套主席树就结束了。 可是这怎么1.2KB呢? 考虑用CDQ分治。 假设每个数的位置为aia_iai​,数的大小为bib_...

Freopen的博客 269

bzoj3295 [CQOI2011]动态逆序对

http://www.elijahqi.win/2018/01/15/bzoj3295-cqoi2011%e5%8a%a8%e6%80%81%e9%80%86%e5%ba%8f%e5%af%b9/ 题目描述 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。 输入输出格式

Elijahqi 205

[BZOJ3295][Cqoi2011]动态逆序对(分块重建)

题意:一个排列,每次删除一个数,求每次删除后的逆序对的数量。 正确姿势请移步 http://blog.youkuaiyun.com/u011542204/article/details/50571409 将操作分成根号M段,然后每段内的操作按下标排序,计算它前面的比他小的和它后面的比他大的。有一个问题就是同一个块当中的没有被减掉,由于一个块内只有根号M个操作,暴力减掉即可。 如果要在线的话将那个排序变成

AZUI _ oi memories 869
上一篇: [BZOJ3358][Usaco2004 Jan]洪水
下一篇: [BZOJ1901]Dynamic Rankings 动态排名
LowestJN
博客等级 码龄10年 76粉丝 422原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值