luogu3759 不勤劳的图书管理员 (树状数组套线段树)
交换的话,只有它们中间的书会对答案产生影响
树状数组记位置,套线段树记书的编号 它对应的页数和书的个数
然后就是减掉中间那些原来是逆序对的,再把交换以后是逆序对的加上
别忘了考虑这两个自己交换以后是不是逆序的
最重要的一步:开个O2
#include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pa;
const int maxn=5e4+,lg2n=2e7+,P=1e9+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} namespace SegT{
int ch[lg2n][],pct;
ll sum[lg2n],cnt[lg2n]; inline void update(int x){sum[x]=sum[ch[x][]]+sum[ch[x][]],cnt[x]=cnt[ch[x][]]+cnt[ch[x][]];} inline void add(int &p,int l,int r,int x,int v){
if(!p) p=++pct;
if(l==r) sum[p]+=v,cnt[p]+=(v>?:-);
else{
int m=l+r>>;
if(x<=m) add(ch[p][],l,m,x,v);
else add(ch[p][],m+,r,x,v);
update(p);
}
} inline pa query(int p,int l,int r,int x,int y){
if(!p) return make_pair(,);
if(x<=l&&r<=y) return make_pair(sum[p],cnt[p]);
else{
int m=l+r>>;pa r1=make_pair(,),r2=make_pair(,);
if(x<=m) r1=query(ch[p][],l,m,x,y);
if(y>=m+) r2=query(ch[p][],m+,r,x,y);
return make_pair(r1.first+r2.first,r1.second+r2.second);
}
}
} int N,M,rt[maxn];
int pg[maxn],a[maxn]; inline int lowbit(int x){return x&(-x);} inline void add(int x,int y,int v){
for(;x<=N;x+=lowbit(x)) SegT::add(rt[x],,N,y,v);
}
inline pa query(int xl,int xr,int yl,int yr){
pa re=make_pair(,);
for(;xr;xr-=lowbit(xr)){
pa x=SegT::query(rt[xr],,N,yl,yr);
re.first+=x.first,re.second+=x.second;
}
for(xl--;xl;xl-=lowbit(xl)){
pa x=SegT::query(rt[xl],,N,yl,yr);
re.first-=x.first,re.second-=x.second;
}
return re;
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd();
for(i=;i<=N;i++) a[i]=rd(),pg[i]=rd();
ll ans=;
for(i=;i<=N;i++){
pa re=query(,i-,a[i]+,N);
ans+=re.first+re.second*pg[i],ans%=P;
add(i,a[i],pg[i]);
}
// printf("%d\n",ans);
for(i=;i<=M;i++){
int x=rd(),y=rd();
if(x>y) swap(x,y);
pa re=query(x+,y-,,a[x]-);
ans-=re.first+re.second*pg[x],ans%=P; re=query(x+,y-,a[y]+,N);
ans-=re.first+re.second*pg[y],ans%=P;
if(a[x]>a[y]) ans-=pg[x]+pg[y],ans%=P; re=query(x+,y-,,a[y]-);
ans+=re.first+re.second*pg[y],ans%=P; re=query(x+,y-,a[x]+,N);
ans+=re.first+re.second*pg[x],ans%=P;
if(a[x]<a[y]) ans+=pg[x]+pg[y]; add(x,a[x],-pg[x]);add(x,a[y],pg[y]);
add(y,a[y],-pg[y]);add(y,a[x],pg[x]);
swap(a[x],a[y]);swap(pg[x],pg[y]);
printf("%lld\n",(ans+P)%P); }
return ;
}
luogu3759 不勤劳的图书管理员 (树状数组套线段树)的更多相关文章
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树
题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...
- bzoj3196 二逼平衡树 树状数组套线段树
题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...
- 【序列操作IV】树状数组套线段树/树套树
题目描述 给出序列 a1,a2,…,an(0≤ai≤109),有关序列的两种操作. 1. ai(1≤i≤n)变成 x(0≤x≤109). 2. 求 al,al+1,…,ar(1≤l≤r≤n)第 k(1 ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
- [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)
[APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...
随机推荐
- PAT L2-016 愿天下有情人都是失散多年的兄妹
https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216 呵呵.大家都知道五服以内不得通婚,即两个人最 ...
- 解决jenkins运行磁盘满的问题
解决jenkins运行磁盘满的问题 - ling811的专栏 - CSDN博客 https://blog.csdn.net/ling811/article/details/74991899 1.自动丢 ...
- CSS小东西
1.表格列自动均分 table-layout:fixed; 2.单元格内容自动换行 word-wrap:break-word;
- js原生实现div渐入渐出
jq对渐入渐出进行封装,简单的使用连个方法就可以实现.fadeIn(),fadeOut();如果我们界面没有使用jq那么原生怎么实现呢? 我们讲解一下,这个原理.当我们要实现渐入的时候,首先是让隐藏的 ...
- java中的标记接口(标签接口)
Java中的标记接口(Marker Interface),又称标签接口(Tag Interface),具体是不包含任何方法的接口.在Java中很容易找到标记接口的例子,比如JDK中的Serialzab ...
- PHP Lumen Call to a member function connection() on null 报错
(1/1) Error Call to a member function connection() on nullin Model.php line 1201at Model::resolveCon ...
- php foreach跳出本次/当前循环与终止循环方法
continue:跳出本次循环 break:终止循环 exit:用来结束程序执行 return: 用来结束一段代码 $arr= array('le','yang','jun','lecode' ...
- CentOS7安装Jenkins,使用war方式直接运行或用yum方式安装运行
jenkins最简单的安装方式呢,就是直接去官网下载jenkins的war包,把war丢到tomcat里运行,直接就能打开了. Jenkins官网:https://jenkins.io/downloa ...
- css3特殊图形(气泡)
一.气泡 效果: body{ background: #dd5e9d; height: 100%; } .paopao { position: absolute; width: 200px; heig ...
- Servlet学习的一些笔记
Servlet一点笔记 Servlet:Server Applet,全称Java Servlet,是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP ...