bzoj4889: [Tjoi2017]不勤劳的图书管理员(树套树)
据说正解线段树套平衡树
然而网上参考(抄)了一个树状数组套动态开点线段树的
思路比较清楚,看代码应该就明白了
- //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]不勤劳的图书管理员(树套树)的更多相关文章
- [TJOI2017]不勤劳的图书管理员(分块+树状数组)
有一个数组开大会MLE开小会RE的做法:就是树套树,即树状数组套主席树,这种方法比较暴力,然而很遗憾它不能通过,因为其时空复杂度均为O(nlog2n). 想到一种不怎么耗内存,以时间换空间,分块!单次 ...
- [bzoj4889] [Tjoi2017]不勤劳的图书管理员
Description 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被 ...
- 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组
[BZOJ4889][Tjoi2017]不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让 ...
- 【bzoj4889】: [Tjoi2017]不勤劳的图书管理员 分块-BIT
[bzoj4889]: [Tjoi2017]不勤劳的图书管理员 题目大意:给定一个序列(n<=50000),每个数有一个编码ai(ai<=50000)和权值vi(vi<=100000 ...
- 【BZOJ4889】不勤劳的图书管理员(树套树)
[BZOJ4889]不勤劳的图书管理员(树套树) 题面 又是权限题,烦死了 洛谷真好 题解 分开考虑每一次交换产生的贡献. 假设交换\((x,y)\) 检查\(x\)与\(y\)对于区间\([x+1, ...
- 洛谷P3759 - [TJOI2017]不勤劳的图书管理员
Portal Description 给出一个\(1..n(n\leq5\times10^4)\)的排列\(\{a_n\}\)和数列\(\{w_n\}(w_i\leq10^5)\),进行\(m(m\l ...
- 4889: [Tjoi2017]不勤劳的图书管理员 树套树
国际惯例的题面(Bzoj没有,洛谷找的):动态加权逆序对,一眼树套树.256MB内存,5e4范围,不虚不虚.首先把交换改成两个插入和两个删除.考虑插入和删除的贡献,就是统计前面比这个值大的数的数值和, ...
- 【洛谷3759】[TJOI2017] 不勤劳的图书管理员(树套树)
点此看题面 大致题意: 给定一个序列,每个元素有两个属性\(a_i\)和\(v_i\),每次操作改变两个元素的位置,求每次操作后\(\sum{v_i+v_j}[i<j,a_i>a_j]\) ...
- P3759 [TJOI2017]不勤劳的图书管理员 [树套树]
树套树是什么啊我不知道/dk 我只知道卡常数w // by Isaunoya #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC o ...
随机推荐
- 《C prime plus (第五版)》 ---第11章 字符串和字符串函数---2
11-3:字符串 输出 三个标准的函数:puts() fputs() printf() 1.puts()函数: #include<stdio.h> #define DEF "I ...
- Mybatis 批量删除 单引号
MySQL效果: ' AND NAME IN ('policycustom1.xmlx','policycustom.xmlx','policycustom1.xmlx','policycustom. ...
- 破解 Navicat Premium 12
一.下载 若文件百度云链接失效,请发邮件给博主:1766211120@qq.com 1.安装文件下载 v12.0.11(x64)版本下载地址如下 链接:https://pan.baidu.com/s/ ...
- spring的了解以及简单框架的搭建
了解spring: Spring是一个开源的控制反转(Inversion of Controller)和面向切面(AOP)的框架,目的是为了简化开发. IOC(控制反转): public class ...
- listen 57
Secondhand Smoke Exposure Doubled Asthmatic Kids' Hospital Readmissions If your child has asthma哮喘, ...
- codeforces 659D D. Bicycle Race(水题)
题目链接: D. Bicycle Race time limit per test 1 second memory limit per test 256 megabytes input standar ...
- 从CWnd::GetSafeHwnd实现得到的知识
在看MFC源码的过程中,有个地方一直不解,看如下代码 BOOL CFrameWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWO ...
- java面试题07
1.重载和重写的区别? 重载(Overload):(1)方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性 ...
- AndyQsmart ACM学习历程——ZOJ3872 Beauty of Array(递推)
Description Edward has an array A with N integers. He defines the beauty of an array as the summatio ...
- visualVM远程监控JVM
对于完全没用使用过visualVM的初学者 环境:Windows PC上使用visualVM监控远端JVM @@@@jstatd方式连接@@@@ 1.Windows安装jdk,$JAVA_HOME/b ...