交换的话,只有它们中间的书会对答案产生影响

树状数组记位置,套线段树记书的编号 它对应的页数和书的个数

然后就是减掉中间那些原来是逆序对的,再把交换以后是逆序对的加上

别忘了考虑这两个自己交换以后是不是逆序的

最重要的一步:开个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 不勤劳的图书管理员 (树状数组套线段树)的更多相关文章

  1. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  2. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  3. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  4. 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[ ...

  5. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  6. BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树

    题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...

  7. bzoj3196 二逼平衡树 树状数组套线段树

    题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...

  8. 【序列操作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 ...

  9. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

  10. [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)

    [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...

随机推荐

  1. Ubuntu16系统中安装htpasswd

    htpasswd是Apache附带的程序, htpasswd生成包含用户名和密码的文本文件, 每行内容格式为“用户名:密码”, 用于用户文件的基本身份认证. 当用户浏览某些网页的时候, 浏览器会提示输 ...

  2. if判断条件注意!!!

    if(condition){ console.log(condition为true才执行): } 实际上会对condition执行Boolean()转型函数,将其转换成布尔值

  3. java.lang.NoClassDefFoundError: org/apache/log4j/Priority的问题解决

    在pom 文件中添加 <dependency> <groupId>log4j</groupId> <artifactId>log4j</artif ...

  4. python之路--前端CSS

    一.CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义了如何显示HTML元素,给HTML设置样式,让他更加美观. 当浏览器读到这个样式表, 他就会按照这个样式来对文档进行 ...

  5. SpringBoot Junit Maven JaCoCo

    写一下最近写单体测试的一些笔记. SrpingBoot的测试用例: @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = ...

  6. pip 升级

    pip install --upgrade qrcode pip install --upgrade qrcode==5.3

  7. bootstrap簡介

    bootstarp是最受歡迎的前端開發框架,可以開發數適用pc.平板電腦和手機的web應用,是基於html.css和javascript.只要學會bootstarp,就代表具有web的開發的中級水準.

  8. vue自定义组件及传值

    1.使用 Vue.component() 方法注册组件 2.使用 props 属性传递参数 v-for="item in items": 遍历 Vue 实例中定义的名为 items ...

  9. codeforces722B

    Verse Pattern CodeForces - 722B You are given a text consisting of n lines. Each line contains some ...

  10. 了解AutoCAD对象层次结构 —— 3 ——数据库

    数据库的结构是什么样的?对象是如何存储在数据库中的?这些问题我们需要搞明白.在此我们可以借助工具ArxDbg或MgdDbg来查看数据库结构及其内容.下图就是利用MgdDbg工具查看到的内容,我们可以看 ...