传送门

据说正解线段树套平衡树

然而网上参考(抄)了一个树状数组套动态开点线段树的

思路比较清楚,看代码应该就明白了

 //minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=,mod=1e9+;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(ll x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
int n,m,a[N],b[N],c[N],cntt[N];
ll ans;
inline void add(int x,int y){
for(;x<=n;x+=x&-x) c[x]+=y,++cntt[x];
}
inline ll sum_v(int x){
ll res=;
for(;x;x-=x&-x) res+=c[x];return res;
}
inline ll sum_cnt(int x){
ll res=;
for(;x;x-=x&-x) res+=cntt[x];return res;
}
int tot,rt[N],cnt[N<<],L[N<<],R[N<<];ll v[N<<];
void insert(int &p,int l,int r,int x,int k,int t){
if(!p) p=++tot;v[p]+=k,cnt[p]+=t;
if(l==r) return;int mid=l+r>>;
if(x<=mid) insert(L[p],l,mid,x,k,t);
else insert(R[p],mid+,r,x,k,t);
}
inline void add(int x,int y,int k,int t){
for(;x<=n;x+=x&-x) insert(rt[x],,n,y,k,t);
}
int query_v(int p,int l,int r,int ql,int qr){
if(!p) return ;
if(ql<=l&&qr>=r) return v[p];int mid=l+r>>;
int res=;
if(ql<=mid) res+=query_v(L[p],l,mid,ql,qr);
if(qr>mid) res+=query_v(R[p],mid+,r,ql,qr);
return res;
}
int query_cnt(int p,int l,int r,int ql,int qr){
if(!p) return ;
if(ql<=l&&qr>=r) return cnt[p];int mid=l+r>>;
int res=;
if(ql<=mid) res+=query_cnt(L[p],l,mid,ql,qr);
if(qr>mid) res+=query_cnt(R[p],mid+,r,ql,qr);
return res;
}
ll Q_v(int l,int r,int ql,int qr){
if(l>r||ql>qr) return ;
ll res=;
for(;r;r-=r&-r) res+=query_v(rt[r],,n,ql,qr);
for(--l;l;l-=l&-l) res-=query_v(rt[l],,n,ql,qr);return res;
}
ll Q_cnt(int l,int r,int ql,int qr){
if(l>r||ql>qr) return ;
ll res=;
for(;r;r-=r&-r) res+=query_cnt(rt[r],,n,ql,qr);
for(--l;l;l-=l&-l) res-=query_cnt(rt[l],,n,ql,qr);return res;
}
inline void dec(ll &x,ll y){
while(x<y) x+=mod;x-=y;
}
int main(){
//freopen("testdata.in","r",stdin);
n=read(),m=read();
for(int i=;i<=n;++i) a[i]=read(),b[i]=read();
for(int i=n;i;--i) add(a[i],b[i]),(ans+=sum_v(a[i]-)+sum_cnt(a[i]-)*b[i])%=mod;
for(int i=;i<=n;++i) add(i,a[i],b[i],);
while(m--){
int l=read(),r=read();
if(l>r) swap(l,r);
if(l==r) {print(ans);continue;}
(ans+=Q_v(l+,r-,,a[r]-))%=mod;
(ans+=Q_cnt(l+,r-,,a[r]-)*b[r])%=mod;
dec(ans,Q_v(l+,r-,a[r]+,n));
dec(ans,Q_cnt(l+,r-,a[r]+,n)*b[r]);
(ans+=Q_v(l+,r-,a[l]+,n))%=mod;
(ans+=Q_cnt(l+,r-,a[l]+,n)*b[l])%=mod;
dec(ans,Q_v(l+,r-,,a[l]-));
dec(ans,Q_cnt(l+,r-,,a[l]-)*b[l]);
if(a[l]>a[r]) dec(ans,b[l]+b[r]);
else (ans+=b[l]+b[r])%=mod;
add(l,a[l],-b[l],-),add(l,a[r],b[r],);
add(r,a[r],-b[r],-),add(r,a[l],b[l],);
swap(a[l],a[r]),swap(b[l],b[r]);
print(ans);
}
Ot();
return ;
}

bzoj4889: [Tjoi2017]不勤劳的图书管理员(树套树)的更多相关文章

  1. [TJOI2017]不勤劳的图书管理员(分块+树状数组)

    有一个数组开大会MLE开小会RE的做法:就是树套树,即树状数组套主席树,这种方法比较暴力,然而很遗憾它不能通过,因为其时空复杂度均为O(nlog2n). 想到一种不怎么耗内存,以时间换空间,分块!单次 ...

  2. [bzoj4889] [Tjoi2017]不勤劳的图书管理员

    Description 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被 ...

  3. 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组

    [BZOJ4889][Tjoi2017]不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让 ...

  4. 【bzoj4889】: [Tjoi2017]不勤劳的图书管理员 分块-BIT

    [bzoj4889]: [Tjoi2017]不勤劳的图书管理员 题目大意:给定一个序列(n<=50000),每个数有一个编码ai(ai<=50000)和权值vi(vi<=100000 ...

  5. 【BZOJ4889】不勤劳的图书管理员(树套树)

    [BZOJ4889]不勤劳的图书管理员(树套树) 题面 又是权限题,烦死了 洛谷真好 题解 分开考虑每一次交换产生的贡献. 假设交换\((x,y)\) 检查\(x\)与\(y\)对于区间\([x+1, ...

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

    Portal Description 给出一个\(1..n(n\leq5\times10^4)\)的排列\(\{a_n\}\)和数列\(\{w_n\}(w_i\leq10^5)\),进行\(m(m\l ...

  7. 4889: [Tjoi2017]不勤劳的图书管理员 树套树

    国际惯例的题面(Bzoj没有,洛谷找的):动态加权逆序对,一眼树套树.256MB内存,5e4范围,不虚不虚.首先把交换改成两个插入和两个删除.考虑插入和删除的贡献,就是统计前面比这个值大的数的数值和, ...

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

    点此看题面 大致题意: 给定一个序列,每个元素有两个属性\(a_i\)和\(v_i\),每次操作改变两个元素的位置,求每次操作后\(\sum{v_i+v_j}[i<j,a_i>a_j]\) ...

  9. P3759 [TJOI2017]不勤劳的图书管理员 [树套树]

    树套树是什么啊我不知道/dk 我只知道卡常数w // by Isaunoya #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC o ...

随机推荐

  1. 【转】web性能测试基本性能指标

    Web性能测试的部分概况一般来说,一个Web请求的处理包括以下步骤: (1)客户发送请求 (2)web server 接受到请求,进行处理: (3)web server 向DB获取数据: (4)web ...

  2. Android Weekly Notes Issue #319

    Android Weekly Issue #319 July 22nd, 2018. Android Weekly Issue #319 本期内容包括: MotionLayout加动画; Kotlin ...

  3. 使用aspnet_regiis.exe重新注册.NET Framework

    cd  C:\Windows\Microsoft.NET\Framework64\v4.0.30319  aspnet_regiis.exe -i     重新安装IIS以后,需要用aspnet_re ...

  4. jstl <c:url>标签

    标签作用是将一个URL地址格式化为一个字符串,并且保存在一个变量当中.它具有URL自动重写功能.value指定的URL可以是当前工程的一个URL地址,也可以是其他web工程的URL.但是这时需要con ...

  5. 第三届蓝桥杯决赛c++b组

    1.星期几 [结果填空] (满分5分)     1949年的国庆节(10月1日)是星期六.      今年(2012)的国庆节是星期一.     那么,从建国到现在,有几次国庆节正好是星期日呢? 只要 ...

  6. MD5算法的简单编写

    package com.t_09; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; ...

  7. linux ssh 命令使用解析

    前一阵远程维护Linux服务器,使用的是SSH,传说中的secure shell. 登陆:ssh [hostname] -u user 输入密码:***** 登 陆以后就可以像控制自己的机器一样控制它 ...

  8. mysql修改初始密码

    通过MySQL命令行,可以修改MySQL数据库的密码,下面就为您详细介绍该MySQL命令行,如果您感兴趣的话,不妨一看. 格式:mysqladmin -u用户名 -p旧密码 password 新密码 ...

  9. Nginx HTTP Server相关

    一.Nginx安装: 采取手动编译安装 对多种重要的选项进行配置 安装前提:常用工具和库,GCC PCRE(Rewrite模块需要) pcre-devel(源码) zlib zlib-devel(源码 ...

  10. 京东ie6中轮播模块小图出现在大图上

    请大家给个评论,给个支持!呵呵 本人最新一套模版小清新童装母婴日韩风全屏轮播(上线风暴),在审核时审核失败,报的是“ie6中全屏海报轮播是小图出现在大图中间的兼容性错误” 而本人本机出现的是小图基本上 ...