[摸鱼]cdq分治 学习笔记

待我玩会游戏整理下思绪(分明是想摸鱼

cdq分治是一种用于降维和处理对不同子区间有贡献的离线分治算法

对于常见的操作查询题目而言,时间总是有序的,而cdq分治则是耗费\(O(logq)\)的代价使动态操作化为静态查询问题(the world!

考虑无修改的求逆序对问题

每个元素可定义为\((pos_i,val_i)\),求对每个\((pos_i,val_i)\)有多少个\((pos_j,val_j)\),满足\(pos_j<pos_i,val_j>val_i\)

cdq分治的过程就是令其中一维有序(pos),计算出贡献消除该维度的影响,后面对已遍历的元素只需得知\(val\)的关系即可

因此对于归并过程的merge中假设\([l,mid]\)\([mid+1,r]\)的子区间已经统计完,保证了两个子区间分别有序,那只需再求左子区间对右子区间的贡献即可

比如左子区间中的下标\(p\)和右子区间中的下标\(q\)满足\(val_p>val_q\),那么可以得出\(val_{[p...mid]}>val_q\),左区间对于右区间中的\(q\)的贡献为\(mid-p+1\),统计完后继续维护大区间的有序并pushup即可

而对于有修改(既存在时间变量)的操作,我们需要维护左子区间的修改对右区间查询的影响(因为对于分治,左区间存在是右区间存在的前提),对于查询则需要标记时间的维度\(ansid\)

注意如果\(p\)\(q\)优先越界的处理上的不同

以及区间查询时一分为二的做法


练手题 Luogu - P3374

题意:m次操作,单点更新,区间查询

我们把原数组的初始值当作插入修改来处理,时间复杂度\(O((m+n)log(m+n))\)

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
using namespace std;
const int MAXN = 1.5e6+11;
typedef long long ll;
const ll MOD = 1e9+7;
const ll INF = 1ll<<60;
unsigned int SEED = 19260817;
ll read(){ll x=0,f=1;register char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}struct QUERY{int pos,val,type;bool operator < (const QUERY &rhs) const{if(pos!=rhs.pos) return pos<rhs.pos;return type<rhs.type;}
}Q[MAXN],tmp[MAXN];
ll ans[MAXN];
void solve(int l,int r){if(l==r)return;int mid=l+r>>1;solve(l,mid);solve(mid+1,r);int p=l,q=mid+1,cnt=0;ll sum=0;while(p<=mid&&q<=r){if(Q[p]<Q[q]){if(Q[p].type==1) sum+=Q[p].val;tmp[++cnt]=Q[p++];}else{if(Q[q].type==2) ans[Q[q].val]-=sum;if(Q[q].type==3) ans[Q[q].val]+=sum;tmp[++cnt]=Q[q++];}}while(p<=mid) tmp[++cnt]=Q[p++];while(q<=r){if(Q[q].type==2) ans[Q[q].val]-=sum;if(Q[q].type==3) ans[Q[q].val]+=sum;tmp[++cnt]=Q[q++];}rep(i,1,cnt) Q[i+l-1]=tmp[i];
}
int main(){int m,n;while(cin>>n>>m){int cnt=0,ansid=0;rep(i,1,n){Q[++cnt].pos=i;Q[cnt].val=read();Q[cnt].type=1;}rep(i,1,m){int op=read();if(op==1){Q[++cnt].pos=read();Q[cnt].val=read();Q[cnt].type=1;}else{int l=read();int r=read();Q[++cnt].pos=l-1;Q[cnt].val=++ansid;Q[cnt].type=2;Q[++cnt].pos=r;Q[cnt].val=ansid;Q[cnt].type=3;}}solve(1,cnt);rep(i,1,ansid) println(ans[i]);}return 0;
}

转载于:https://www.cnblogs.com/caturra/p/9387626.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SEO 搜索引擎优化

http://www.caopeng.org/html/seo.htm

粉丝回馈,8000元大礼包免费相送

9月开学季&#xff0c;福利送不停&#xff0c;果哥又给大家送福利了&#xff0c;价值8000元豪礼相送&#xff01;一、 前言非常感谢大家对我公众号的支持&#xff0c;暑假也结束了。这次邀请了3个不错的公众号朋友&#xff0c;同时也是电子嵌入式领域的优质公众号&#xff0c;一…

[Drupal] How to get the real path of a node, no matter it is a path or a url alias

Just test the code as below: 代码 $urisubstr(request_uri(),1,strlen(request_uri()));$uri_arrayarray();if(!($pathdrupal_lookup_path(source,$uri))) {$uri_arrayexplode(/,$uri); }else{$uri_arrayexplode(/,$path); }var_dump($uri_array);Have fun!

图文讲解5G调制,特别通俗易懂!

大家好&#xff0c;今天我们来聊聊调制。说到调制&#xff0c;我想很多同学马上会联想到这些关键词&#xff1a;BPSK、QPSK、调幅、调相、QAM、星座图……众所周知&#xff0c;调制和解调是通信基本业务流程中的重要组成部分。没有它们&#xff0c;我们的移动通信根本无法实现。…

2018 Multi-University Training Contest 3

好像克拉丽丝小姐姐题解写的超详细我都没啥好说的了 Problem A. Ascending Rating 仔细一看m是固定的单调DQ就好了 1 #include <bits/stdc.h>2 using namespace std;3 typedef long long LL;4 const int maxn 1e7 10;5 int st, ed, deq[maxn];6 int a[maxn];7 8 inline…

curl 增加header_libcurl增加HTTP header 和 POST之后获取返回数据

http://blog.csdn.net/flyfish1986/article/details/508962712016static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream){size_t written fwrite(ptr, size, nmemb, (FILE *)stream);return written;}1234512345main函数CURL *curl;CURLcode res;cur…

配置SAMBA文件共享的基本方法

根据自己的实践经验, 介绍一下在linux上使用samba作为类似win2000的文件服务器的方法. 一个基本的配置文件, 包含了基本的设定, 可以作为配置的模板&#xff1a; -------------------------------------------------------------- [global] netbios name SERVERNAME work…

内核抢占,让世界变得更美好 | Linux 内核

大家好&#xff0c;我是老吴。今天要分享的是抢占相关的基础知识。本文以内核抢占为引子&#xff0c;概述一下 Linux 抢占的图景。我尽量避开细节问题和源码分析。什么是内核抢占&#xff1f;别急&#xff0c;咱们慢慢来。先理解抢占 (preemption) 这个概念&#xff1a;involun…

ESXI3.5 单网卡实现iSCSi连接

其实这个也没啥好说的&#xff0c;只是很多文章都是建议大家在做ESXI方案时&#xff0c;要配置专用的设备卡/网络卡来接 SAN设备&#xff0c;由于环境限制&#xff0c;我这里是用Openfiler2.3来当SAN用&#xff01; 步骤: 1.直接启用 iSCSI Software Adapter 连接 2.启动 i…

centOS 6 和centOS 7 防火墙指令

centOS 6 service iptables status 查看防火墙状态 service iptables stop 关闭防火墙 chkconfig iptables off永久关闭防火墙 centOS 7 systemctl status firewalld.service 查看防火墙状态 systemctl stop firewalld.service 关闭防火墙 systemctl disable firewalld.servic…

体制内工作了十几年,跳出来学嵌入式合适吗?

这说的不是我&#xff0c;是我原公司的一个朋友&#xff0c;他原来的同事。我这个朋友原来毕业是在体制内工作&#xff0c;但学习的是电子专业&#xff0c;后因为体制内不适应&#xff0c;或者说是体制内太轻松了&#xff0c;就出来折腾嵌入式。这一折腾就是快十来年&#xff0…

java class 字符串_java基础知识四 math类 字符 字符串 控制台输入输出 StringBuilder与StringBuffer...

第四章&#xff1a;数学函数、字符和字符串math类Math是final类&#xff1a;在java.lang.Math中&#xff0c;所有数学函数都是静态方法在一个java程序中&#xff0c;java.lang包中的所有类是隐式导入的。三角函数方法『此处需要插入图』指数函数方法『此处需要插入图』取整方法…

适合嵌入式的C++开源项目-Workflow

在来腾讯之前&#xff0c;我是没有真正用C开发过一个完整的项目的&#xff0c;然后&#xff0c;赶鸭子上架&#xff0c;鹅厂的人特别喜欢用C&#xff0c;而且用的特别好。我这次推荐一个开源的C项目&#xff0c;希望喜欢C&#xff0c;或者想往C方向发展的同学可以看看。面向过程…

微信小程序-音频播放-wx.createInnerAudioContext() 每次都是重复播放同一条录音

前言 在调试微信小程序音频播放时&#xff0c;刚开始我也是直接复制官方文档的实例&#xff1a; const innerAudioContext wx.createInnerAudioContext() innerAudioContext.autoplay true innerAudioContext.src http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?…

几段失败的代码

1、下面一段代码将注释和代码混在了一起&#xff0c;不认真看还真不知道。高亮显示后&#xff1a;2、看到这种多层嵌套恶心到头大。3、据说某俄国特工经过九死一生偷到了NASA的太空火箭发射程序的源代码的最后一页&#xff0c;代码是&#xff1a;)))))))))))))))))))))))))))))…

java 发送邮件添加附件_java邮件自动发送时添加网络附件

查了很多资料都是使用本地资源作为附件发送。但是数据和程序分开时&#xff0c;还需要先下载数据&#xff0c;保存到本地再发送邮件。查了很多资料后&#xff0c;发现apach提供了很好的一个commons-mail.jar包&#xff0c;做了很好的封装&#xff0c;简单易用。下载地址是http:…

Excel 取消Internet及网络路径自动替换为超链接

Excel 取消Internet及网络路径自动替换为超链接&#xff1a; 1.文件 》选项 》校对 点击自动更正选项 2. 自动更正 配置修改 点击“键入时自动套用格式”tab页&#xff0c;取消勾选 internet及网络路径替换为超链接 转载于:https://www.cnblogs.com/byronliu029/p/9408468.htm…

那些喝吐的酒~

酒逢知己千杯少我喝不了酒&#xff0c;但是高兴的时候也能喝两杯。入职腾讯&#xff0c;参加了两次部门聚会&#xff0c;都离不开喝酒&#xff0c;吃饭喝酒这事&#xff0c;大家都很开心&#xff0c;那种眼前朦胧&#xff0c;胆子很肥的感觉特别好。领导们也很给面子&#xff0…

实时内核(Core)和实时操作系统(RTOS)有何不同?

大家都知道什么是实时操作系统&#xff0c;但是&#xff0c;大家熟知的实时操作系统&#xff0c;站在更广的角度来看&#xff0c;其实它就是一个实时内核。一、实时内核和实时操作系统一个实时内核是管理微处理器&#xff08;MPU&#xff09;、微控制器&#xff08;MCU&#xf…

linux java远程调试_idea远程linux代码调试

如果线上代码出现问题&#xff0c;如何用本地idea排查问题查找问题&#xff1f;第一步&#xff1a;保证本地代码与线上代码一致&#xff1b;第二步&#xff1a;在线上tomcat文件中/tomcat/bin/catalina.sh文件中添加如下配置找到下面一行信息#----- Execute The Requested Comm…