洛谷P3759 - [TJOI2017]不勤劳的图书管理员

Portal

Description

给出一个\(1..n(n\leq5\times10^4)\)的排列\(\{a_n\}\)和数列\(\{w_n\}(w_i\leq10^5)\),进行\(m(m\leq5\times10^4)\)次操作:
交换\(a_{p_1},a_{p_2}\),并求\(\sum_{i=1}^n \sum_{j=i+1}^n [a_i>a_j](w_{a_i}+w_{a_j})\)。

Solution

树套树/CDQ分治,想锻炼一下代码能力所以写了树套树。
首先这是一个求逆序对的问题,那么我们考虑交换\(a_{p_1},a_{p_2}\)对答案有什么影响。易知只有\(i\in[p_1+1,p_2-1]\)对答案造成影响:
若\(a_i<a_{p_1}\),那么答案减\(a_i+a_{p_1}\);若\(a_i>a_{p_1}\),那么答案加\(a_i+a_{p_1}\)。
若\(a_i<a_{p_2}\),那么答案加\(a_i+a_{p_2}\);若\(a_i>a_{p_2}\),那么答案减\(a_i+a_{p_2}\)。
那么求出\(\{c_1,s_1,c_2,s_2\}\)分别表示区间\([p_1+1,p_2-1]\)内小于/大于\(x\)的\(i\)的个数/\(w_i\)的和,然后就可以根据上两行计算答案的变化。而这可以用树套树来做。

时间复杂度\(O(mlog^2n)\)。

Code

//[TJOI2017]不勤劳的图书管理员
#include <algorithm>
#include <cstdio>
using std::swap;
typedef long long lint;
inline char gc()
{
    static char now[1<<16],*s,*t;
    if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}
    return *s++;
}
inline int read()
{
    int x=0; char ch=gc();
    while(ch<'0'||'9'<ch) ch=gc();
    while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x;
}
const int N=5e4+10;
const int P=1e9+7;
int n,m,a[N],w[N];
namespace init
{
    int tr1[N],tr2[N];
    void add(int x,int v) {while(x<=n) tr1[x]++,tr2[x]=(tr2[x]+v)%P,x+=x&(-x);}
    int sum1(int x) {int r=0; while(x) r+=tr1[x],x-=x&(-x); return r;}
    int sum2(int x) {int r=0; while(x) r=(r+tr2[x])%P,x-=x&(-x); return r;}
    int calc()
    {
        int res=0;
        for(int i=1;i<=n;i++)
        {
            res=(res+(lint)sum1(n-a[i]+1)*w[a[i]])%P;
            res=(res+sum2(n-a[i]+1))%P;
            add(n-a[i]+1,w[a[i]]);
        }
        return res;
    }
}
const int N1=2e6;
struct info
{
    int c1,s1,c2,s2;
    info(int _c1=0,int _s1=0,int _c2=0,int _s2=0) {c1=_c1,s1=_s1,c2=_c2,s2=_s2;};
    friend info operator +(info x,info y)
    {
        int c1=x.c1+y.c1,s1=x.s1+y.s1,c2=x.c2+y.c2,s2=x.s2+y.s2;
        return info(c1,s1%P,c2,s2%P);
    }
};
namespace inTr
{
    int cnt,fa[N1],ch[N1][2],siz[N1]; int val[N1],sum[N1];
    inline void update(int p)
    {
        siz[p]=siz[ch[p][0]]+1+siz[ch[p][1]];
        sum[p]=((sum[ch[p][0]]+sum[ch[p][1]])%P+w[val[p]])%P;
    }
    inline int wh(int p) {return p==ch[fa[p]][1];}
    inline void rotate(int p)
    {
        int q=fa[p],r=fa[q],w=wh(p);
        fa[p]=r; if(r) ch[r][wh(q)]=p;
        fa[ch[q][w]=ch[p][w^1]]=q;
        fa[ch[p][w^1]=q]=p;
        update(q),update(p);
    }
    void splay(int &rt,int p)
    {
        for(int q=fa[p];q;rotate(p),q=fa[p]) if(fa[q]) rotate(wh(p)^wh(q)?p:q);
        update(rt=p);
    }
    int pre(int rt,int x)
    {
        int r=0;
        for(int p=rt;p;p=ch[p][val[p]<x]) if(val[p]<x) r=p;
        return r;
    }
    void ins(int &rt,int p)
    {
        if(!rt) {rt=p; return;}
        int q=rt;
        while(ch[q][val[q]<val[p]]) q=ch[q][val[q]<val[p]];
        fa[ch[q][val[q]<val[p]]=p]=q;
        update(q); splay(rt,p);
    }
    int del(int &rt,int x)
    {
        if(x==0||!rt) return 0;
        int p=pre(rt,x+1); if(val[p]!=x) return 0;
        splay(rt,p);
        int chCnt=(ch[p][0]>0)+(ch[p][1]>0);
        if(chCnt==0) {rt=0; return p;}
        if(chCnt==1) {rt=ch[p][ch[p][1]>0],fa[rt]=0; return p;}
        int q=ch[p][0]; while(ch[q][1]) q=ch[q][1];
        splay(rt,q);
        fa[ch[q][1]=ch[p][1]]=q;
        fa[p]=ch[p][0]=ch[p][1]=0;
        update(q);
        return p;
    }
    inline void change(int &rt,int x1,int x2)
    {
        int p=del(rt,x1); if(!p) p=++cnt;
        fa[p]=ch[p][0]=ch[p][1]=0,siz[p]=1;
        val[p]=x2,sum[p]=w[x2];
        ins(rt,p);
    }
    info query(int rt,int x)
    {
        int c1=0,s1=0;
        for(int p=rt;p;p=ch[p][val[p]<x])
            if(val[p]<x) c1+=siz[p]-siz[ch[p][1]],s1=(s1+sum[p]-sum[ch[p][1]]+P)%P;
        return info(c1,s1,siz[rt]-c1,sum[rt]-s1);
    }
}
namespace outTr
{
    #define Ls (p<<1)
    #define Rs (p<<1|1)
    int rt[N<<2];
    int in(int L,int R,int p1,int p2) {return ((L<=p2&&p2<=R)<<1)|(L<=p1&&p1<=R);}
    void change(int p,int L0,int R0,int p1,int p2)
    {
        int inP=in(L0,R0,p1,p2);
        if(inP==1) inTr::change(rt[p],a[p1],a[p2]);
        else if(inP==2) inTr::change(rt[p],a[p2],a[p1]);
        if(L0==R0) return;
        int mid=L0+R0>>1;
        if(in(L0,mid,p1,p2)) change(Ls,L0,mid,p1,p2);
        if(in(mid+1,R0,p1,p2)) change(Rs,mid+1,R0,p1,p2);
    }
    int optL,optR;
    info query(int p,int L0,int R0,int x)
    {
        if(optL<=L0&&R0<=optR) return inTr::query(rt[p],x);
        int mid=L0+R0>>1; info res=info(0,0,0,0);
        if(optL<=mid) res=res+query(Ls,L0,mid,x);
        if(mid<optR) res=res+query(Rs,mid+1,R0,x);
        return res;
    }
}
inline void change(int p1,int p2) {outTr::change(1,1,n,p1,p2);}
inline info query(int L,int R,int x)
{
    outTr::optL=L,outTr::optR=R;
    return outTr::query(1,1,n,x);
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++)
    {
        a[0]=read(),w[a[0]]=read();
        change(0,i); swap(a[0],a[i]);
    }
    int ans=init::calc();
    for(int i=1;i<=m;i++)
    {
        int p1=read(),p2=read();
        if(p1>p2) swap(p1,p2); else if(p1==p2) {printf("%d\n",ans); continue;}
        int x=a[p1],y=a[p2];
        info r1=query(p1+1,p2-1,x),r2=query(p1+1,p2-1,y);
        ans-=((lint)r1.c1*w[x]%P+r1.s1)%P; ans=(ans+P)%P;
        ans+=((lint)r1.c2*w[x]%P+r1.s2)%P; ans=ans%P;
        ans+=((lint)r2.c1*w[y]%P+r2.s1)%P; ans=ans%P;
        ans-=((lint)r2.c2*w[y]%P+r2.s2)%P; ans=(ans+P)%P;
        if(x<y) ans=(ans+w[x]+w[y])%P; else ans=(ans-w[x]-w[y]+P)%P;
        printf("%d\n",ans);
        change(p1,p2); swap(a[p1],a[p2]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/VisJiao/p/LgP3759.html

Win7时间修复(时间错误修复文件) 运行方法:解压后运行reg文件即可。 支持的Win7版本: 1. Windows 7 Starter(入门版 / 初级版) 2. Windows 7 Home Basic(家庭普通版) 3. Windows 7 Home Premium(家庭高级版) 4. Windows 7 Professional(专业版) 5. Windows 7 Enterprise(企业版) 6. Windows 7 Ultimate(旗舰版) 7. Windows 7 Professional for Embedded Systems(嵌入式专业版) 8. Windows 7 Ultimate for Embedded Systems(嵌入式旗舰版) 立即下载

相关推荐

科技中介服务机构想要提升服务效率,需要哪些数智工具支持?.docx

科技中介服务机构想要提升服务效率,需要哪些数智工具支持?

洛谷P3759 [TJOI2017]不勤劳的图书管理员(二维线段树)

裸的动态逆序对,但维护的东西很多写的一不是一般的麻烦采用二维线段树,外层区间,内层权值query的返回值是pair(或用全局变量)代码里有注释// P3759 [TJOI2017]不勤劳的图书管理员 //二维线段树 #include&lt;bits/stdc++.h&gt; #define Pli pair&lt;ll,int&gt; #define mp make_pair #define f...

p_b_p_b的博客 606

usb 扩容盘检测修复工具源码,编译产物

usb 扩容盘检测修复工具源码,编译产物

BZOJ4889 & 洛谷3759:[TJOI2017]不勤劳的图书管理员——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=4889 https://www.luogu.org/problemnew/show/P3759 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员。他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度。现在有n本被打乱顺序的书,在接下...

weixin_34293246的博客 165

融合UWB和IMU割草机定位EKF研究(Matlab代码实现)

内容概要:本文主要介绍了一个名为“Plecs全桥LLC谐振变换器仿真模型”的技术资源,该资源聚焦于电力电子领域中的LLC谐振变换器建模与仿真,涵盖开环、闭环控制、软启动设计及参数优化等核心内容。文档不仅提供了LLC变换器的详细建模方法与仿真案例,还系统梳理了其在高效电源转换系统中的应用,包括隔离型全桥拓扑结构的设计与性能分析。此外,资源汇总了大量Matlab/Simulink仿真模型及相关科研方向,涉及新能源并网、储能控制、电机驱动等多个前沿领域,全面展示LLC谐振变换器在现代电力系统中的关键技术实现路径。同时,文档附带多种学习资料获取途径,如网盘链接和公众号资源,便于研究人员深入实践与拓展研究。; 适合人群:具备扎实的电力电子、自动控制理论基础,从事新能源发电、开关电源设计、电力系统仿真等相关领域的研究生、工程师及科研人员。; 使用场景及目标:①深入理解LLC谐振变换器的工作原理、建模方法与控制策略;②开展电力电子变换器的仿真验证与参数优化设计;③支撑科研项目、学位论文或工程项目的系统仿真与方案验证; 阅读建议:建议结合所提供的仿真模型与参考文献,使用Plecs或Simulink软件进行动手实践,重点掌握LLC谐振变换器的建模流程、闭环控制设计、软启动机制及参数调试技巧,以全面提升在实际工程中的应用与创新能力。

基于变频控制的多相交错LLC谐振变换器闭环仿真(Simulink仿真实现)

基于变频控制的多相交错LLC谐振变换器闭环仿真(Simulink仿真实现)内容概要:本文主要介绍了基于Plecs的全桥LLC谐振变换器仿真模型,涵盖变频控制下的多相交错LLC谐振变换器闭环仿真、V2G电动汽车ACDC整流与双向CLLC谐振变换器充放电仿真、LLC谐振变换器的开环与闭环软启动设计,以及储能系统中双向Buck-Boost变换器结合模型预测电流控制和电压下垂控制的仿真研究。同时,文档列举了多种电力电子系统与控制策略的Simulink/Plecs仿真案例,涉及三相交错并联Buck变换器、三电平Buck直流变换器、单相Boost PFC电路等,展示了丰富的电力变换器建模与控制技术。此外,还包括参数设计报告、计算书及相关参考文献,适用于从事电力电子、新能源发电、电动汽车充放电系统等领域的研究人员和技术开发人员。; 适合人群:具备电力电子、自动控制理论基础,从事新能源、电动汽车、电力系统等相关领域研究的研发人员、高校研究生及高年级本科生。; 使用场景及目标:① 学习和掌握LLC谐振变换器及其他典型电力电子变换器的工作原理与建模方法;② 实现闭环控制策略如变频控制、软启动、模型预测控制、下垂控制等的仿真验证;③ 支持科研项目、毕业设计或工程开发中的系统仿真与优化设计。; 阅读建议:建议结合文中提供的仿真模型、设计报告与参考文献,逐步搭建并调试相应系统,重点关注控制策略的实现细节与参数整定过程,以深入理解系统动态响应特性与控制性能。

bzoj4889 [Tjoi2017]不勤劳的图书管理员(线段树套权值线段树)

相当于动态维护带权逆序对。 交换x,y位置的数,只会对他们之间的数产生影响。分类讨论即可。我写的线段树套权值线段树,卡空间,需要写垃圾回收qaq 复杂度O(nlog2n)O(nlog^2n)

Icefox的博客 503

独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)

内容概要:本文标题为“Plecs全桥LLC谐振变换器仿真模型”,但实际内容严重偏离主题,文档中混杂了大量来自优快云博客平台的无关信息,涵盖多个不同领域的Matlab/Simulink仿真项目,如电力系统优化、无人机路径规划、机器学习预测、微电网调度、卡尔曼滤波、无线能量传输等,导致核心内容缺失。文档未能提供关于Plecs平台下全桥LLC谐振变换器的建模方法、电路结构、参数设计、控制策略或仿真结果等关键技术细节,实质信息与标题完全不符,不具备作为该主题参考资料的有效性。; 适合人群:从事电力电子变换器研究、电源系统设计及相关领域的工程师、高校研究生与科研人员,尤其是希望掌握LLC谐振变换器建模与仿真的专业技术人员。; 使用场景及目标:① 学习并掌握全桥LLC谐振变换器的工作原理与Plecs仿真建模技术;② 开展高效电源转换器的研发与性能优化;③ 作为教学或科研项目中电力电子电路仿真的参考资料。; 阅读建议:鉴于文档内容与标题严重不符,建议读者谨慎甄别,优先选择专业书籍、学术论文或官方仿真软件教程等权威资源进行学习,避免被无效信息误导。

[BZOJ4889][洛谷P3759][TJOI2017]不勤劳的图书管理员 分块+树状数组

分块+树状数组

TYB的博客 523

AUTOSAR入门

一、AUTOSAR是什么 AUTOSAR组织自己的介绍是 AUTOSAR (AUTomotive Open System ARchitecture) is a worldwide development partnership of vehicle manufacturers, suppliers, service providers and companies from the automot...

天涯遍地是小草的博客 3万+

《AFSim 2.9中文参考手册》

本栏目将对《AFSim 2.9中文参考手册》进行持续更新,欢迎关注交流!对本文或者AFSIM相关内容感兴趣的朋友,可私心联系作者。《AFSim 2.9中文参考手册》内容概览。

henggesim的博客 1万+

洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】

题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> #define Redge(u) for (int k = h[u...

weixin_30764137的博客 126

VSCode玩转STM32:手把手教你配置EIDE插件与OpenOCD调试(附野火DAP配置文件详解)

本文详细介绍了如何在VSCode中配置EIDE插件与OpenOCD进行STM32开发,特别针对野火DAP调试器提供了配置文件详解。从基础环境搭建到深度调试技巧,帮助开发者高效完成STM32项目开发,实现现代化嵌入式开发工作流。

weixin_26905487的博客 553

【洛谷3759】[TJOI2017] 不勤劳的图书管理员(树套树)

点此看题面 大致题意: 给定一个序列,每个元素有两个属性aia_iai​和viv_ivi​,每次操作改变两个元素的位置,求每次操作后∑vi+vj[i&amp;amp;lt;j,ai&amp;amp;gt;aj]\sum{v_i+v_j}[i&amp;amp;lt;j,a_i&amp;amp;gt;a_j]∑vi​+vj​[i&amp;lt;j,ai​&amp;gt;aj​]。 关于题意的解读 其实,题目差不多就是让我们求逆序对(只不过每个逆序...

CXR的博客 418

使用VS Code创建第一个Flutter工程

你可以使用任意文本编辑器结合命令行工具来开发Flutter应用。然而,我们推荐使用本文介绍的编辑器插件以获取更好的开发体验。这些插件提供了代码补全、代码高亮、widget辅助编辑等功能,以及为项目的运行和调试提供支持。推荐的开发工具有VS Code、Android Studio、IntelliJ。本文将重点介绍如何使用VS Code进行Flutter应用开发。

2501_91373349的博客 2129

STM32F103C8T6的PC13-15引脚配置避坑指南:为什么你的IO口不工作?

本文详细解析了STM32F103C8T6的PC13-15引脚作为普通IO口不工作的原因及解决方案。这三个引脚默认关联侵入检测和低速外部时钟等特殊功能,需先禁用TAMPER和LSE,并开启AFIO时钟,才能正确配置为普通GPIO。文章提供了标准外设库和HAL库的配置步骤、常见问题排查方法及硬件设计注意事项。

weixin_29169899的博客 523

BZOJ4889: [TJOI2017]不勤劳的图书管理员

BZOJ4889: [TJOI2017]不勤劳的图书管理员 额,这个题由于被卡评测了,于是变成了权限题。。。 本蒟蒻表示没钱氪金。。。 当然,可以去洛谷/$LOJ$搞搞事。。。 洛谷P3759 [TJOI2017]不勤劳的图书管理员 LOJ#2639. 「TJOI2017」不勤劳的图书管理员 这里附上洛谷的题面。 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理...

weixin_30318645的博客 131

【ArcGIS Pro微课1000例】0065:制作千层饼多图层叠加效果

右键dem图层,点击符号系统,在右侧的符号系统窗口中,选择拉伸,勾选【显示名称】和【显示全部】,选择高程色带7。由于数据具有高程源,因此可以将数据进行三维显示。右键地面→添加高程源图层。打开ArcGIS PRo,新建一个局部场景,命名为千层饼。设置了高程源数据之后,千层饼一下子就变成了三维形状。数据默认都是在一个平面上,以默认的符号系统显示。到此为止,每个图层均为平面的千层饼已经做好了。将TIN图层的高程偏移设置为-1000。最后将等高线的高程设为2000.移除工程默认加载的图层。默认即可,不需要做修改。

智慧空间实验室 1157

【BZOJ2141】排队

点此看题面 大致题意: 给你一个序列,每次交换两个数,求每次操作后的逆序对个数。 关于另一道题目 推荐先去看一下这道题目:【洛谷3759】[TJOI2017] 不勤劳的图书管理员(貌似是此题的升级版)。 推荐先去学一学线段树套\(Treap\)。(当然你也可以学习\(hl666\)奆佬分块狂踩树套树)。 大致思路 做了上面给出的那道题目,这道题目就是一道水题。 反正我是直接将上面那题代码改了一下然...

weixin_30247781的博客 181

[STM32F103C8T6]W5500+Modbus TCP(HAL库)

本章节是博主学习Modbus TCP所写的一篇文章Modbus TCP是Modbus的一个分支,主要用到网口通信的,在工业上也用的很频繁,我们公司最近的项目就是用的W5500+modbus TCP来和PC端的上位机通信和交互的。虽然这个项目不是我在写代码,但是我都学了Modbus RTU了,那我也抽空学习一下Modbus TCP吧。本次的Modbus TCP不是博主写的,是一个大佬开源的一个W5500写的一个Mobus TCP代码,我在这个基础上自己写了主机读从机多个数据,和主机写从机寄存器的函数。

sinat_58149788的博客 4086

(11)(2.2.2) BLHeli32,AM32, and BLHeli_S ESCs(一)

Ardupilot官网关于《Peripheral Hardware》的翻译 —《(2.2.2) BLHeli32,AM32, and BLHeli_S ESCs》。

无人机开发(开源Ardupilot) 2233
上一篇: 洛谷P3758 - [TJOI2017]可乐
下一篇: 洛谷P3760 - [TJOI2017]异或和
ayw1069
博客等级 码龄11年 4粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值