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

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

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

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

最重要的一步:开个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. 【Python3练习题 017】 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比。请编程序找出三队赛手的名单。

    import itertools   for i in itertools.permutations('xyz'):     if i[0] != 'x' and i[2] != 'x' and i[ ...

  2. Mysql优化单表查询

    借助explain分析SQL,判断该怎么建立索引. 还需要注意,有些情况会导致索引失效,用不上索引,应该优化SQL,应用上索引. 什么情况导致索引失效? 1.在索引列上做任何操作(计算.函数.类型转换 ...

  3. drf实现图片验证码功能

    一.背景 在之前实现过django的图片验证码,有自己实现过的,也有基于django-simple-captcha的,都是基于form表单验证,若自己实现,可以获取相应的标签name便可以获取判断,若 ...

  4. Dreamweaver怎样用Edge Web Fonts功能

    https://jingyan.baidu.com/article/37bce2beb3af6f1002f3a2c9.html

  5. LODOP设置判断后执行哪个

    LODOP的语句是普通的语句,可以通过JS判断确定要执行哪个,或通过循环循环执行一些语句.如果需要执行某些打印项在哪些条件下不打印,不需要通过代码删除打印项,类似LODOP.SET_PRINT_STY ...

  6. JS实现控制HTML5背景音乐播放暂停

    首先在网页中嵌入背景音乐,html5代码为: <script src="http://wuover.qiniudn.com/jquery.js"></script ...

  7. java中的几个概念

    1.JDK(Java Development Kit ):编写Java程序的程序员使用的软件(它是编写java程序,使用到的工具包,为程序员提供一些已经封装好的 java 类库) 2.JRE(Java ...

  8. java web 开发入门 --- tomcat/servlet/jsp

    在做java web 开发时,要先安装tomcat.它是一个web服务器,也叫web容器,我们把写好的jsp, html页面放到它里面,然后启动它,就可以用浏览器访问这些页面,地址栏中输入localh ...

  9. poj-2001(字典树)

    题意:给你一堆字符串,我们定义一个字符串可以被缩写成一个字符串(必须是原字符串的前缀),问你每个字符串能辨识的前缀是什么,不能辨识意思是(ab,abc我们缩写成ab): 解题思路:可以用字典树解决,我 ...

  10. hdu-1238(kmp+枚举)

    题意:给你n个字符串,问你这里面最长的公共子串的长度是多少,一个公共子串的反串也算,比如样例二: 解题思路:随便找一个字符,枚举它的子串然后跑kmp就行了,很多人的博客都是用string类里面的函数来 ...