bzoj:http://www.lydsy.com/JudgeOnline/problem.php?id=2141

cogs:http://cogs.pro:8080/cogs/problem/problem.php?pid=1871

这题和动态逆序对有点像

这题有些小卡常

首先用树套树维护值域,然后求出初始逆序对数,修改只需修改被影响的

当然可以每次减去与a,b构成的逆序对再修改再加回去,但显然常数飞起

修改操作分类讨论

交换\(h_a,h_b(a<b)\):

\(h_a=h_b\):

  • 你在逗我。

\(h_a<h_b\):

  • 两边的不用管。
  • 首先a和b会产生1个逆序对
  • 不在区间\([a,b]\)里的和在区间里的没有变动。
  • 再讨论\(h\):
  • \(h_i=h_a\) :原来没有,之后与\(h_b\)产生了一个。对于此类的++ans。
  • \(h_i=h_b\) :原来没有,之后与\(h_a\)产生了一个。对于此类的++ans。
  • \(h_i\in(h_a,h_b)\) :原来没有,之后与\(h_a\)和\(h_b\)都产生了一个。对于此类的ans+=2。
  • 剩下的:没变化。

\(h_a>h_b\):

  • 与上一种情况类似,自己YY把,懒得写了。

直接上代码吧:

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#define il inline
#define rg register
#define vd void
#define sta static
#define lb(o) ((o)&-(o))
typedef long long ll;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=20001;
int h[maxn],H[maxn];
int root[maxn],ls[2333333],rs[2333333],sum[2333333],id;
#define mid ((l+r)>>1)
il vd Update(int&x,int l,int r,const int&p,const int&k){
if(!x)x=++id;sum[x]+=k;
if(l==r)return;
if(p<=mid)Update(ls[x],l,mid,p,k);
else Update(rs[x],mid+1,r,p,k);
sum[x]=sum[ls[x]]+sum[rs[x]];
}
il int Query(const int&x,int l,int r,const int&L,const int&R){
if(L<=l&&r<=R)return sum[x];
if(!x||R<l||r<L||!sum[x]||L>R)return 0;
return Query(ls[x],l,mid,L,R)+Query(rs[x],mid+1,r,L,R);
}
int main(){
freopen("nt2011_queue.in","r",stdin);
freopen("nt2011_queue.out","w",stdout);
int n=gi(),m,q,a,b;
for(rg int i=1;i<=n;++i)h[i]=H[i]=gi();
std::sort(H+1,H+n+1);m=std::unique(H+1,H+n+1)-H-1;
for(rg int i=1;i<=n;++i)h[i]=std::lower_bound(H+1,H+m+1,h[i])-H;
for(rg int i=1;i<=n;++i)
for(rg int j=i;j<=n;j+=lb(j))
Update(root[j],1,m,h[i],1);
long long ans=0;
for(rg int i=1;i<=n;++i)
for(rg int j=i-1;j;j-=lb(j))
ans+=Query(root[j],1,m,h[i]+1,m);
printf("%lld\n",ans);
q=gi();while(q--){
a=gi(),b=gi();
if(a>b)std::swap(a,b); if(h[a]<h[b]){
++ans;
for(rg int j=b-1;j;j-=lb(j))ans+=Query(root[j],1,m,h[a],h[b])+Query(root[j],1,m,h[a]+1,h[b]-1);
for(rg int j= a ;j;j-=lb(j))ans-=Query(root[j],1,m,h[a],h[b])+Query(root[j],1,m,h[a]+1,h[b]-1);
}else if(h[a]>h[b]){
--ans;
for(rg int j=b-1;j;j-=lb(j))ans-=Query(root[j],1,m,h[b],h[a])+Query(root[j],1,m,h[b]+1,h[a]-1);
for(rg int j= a ;j;j-=lb(j))ans+=Query(root[j],1,m,h[b],h[a])+Query(root[j],1,m,h[b]+1,h[a]-1);
} for(rg int j=a;j<=n;j+=lb(j))Update(root[j],1,m,h[a],-1),Update(root[j],1,m,h[b],1);
for(rg int j=b;j<=n;j+=lb(j))Update(root[j],1,m,h[b],-1),Update(root[j],1,m,h[a],1);
std::swap(h[a],h[b]); printf("%lld\n",ans);
}
return 0;
}

COGS1871 [国家集训队2011]排队(魏铭)的更多相关文章

  1. 【bzoj2141】排队 [国家集训队2011]排队(魏铭) 树套树 线段树套替罪羊树

    这个题就是动态偏序对,每次操作做两个删除两个插入就好了. #include<cstdio> #include<iostream> #include<cstring> ...

  2. 【bzoj2141】排队 [国家集训队2011]排队(树套树)

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和. 红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...

  3. AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867

    [国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...

  4. cogs 1901. [国家集训队2011]数颜色

    Cogs 1901. [国家集训队2011]数颜色 ★★★   输入文件:nt2011_color.in   输出文件:nt2011_color.out   简单对比时间限制:0.6 s   内存限制 ...

  5. BZOJ 2150 cogs 1861 [国家集训队2011]部落战争

    题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb把 ...

  6. happiness[国家集训队2011(吴确)]

    [试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科 ...

  7. COGS1882 [国家集训队2011]单选错位

    ★   输入文件:nt2011_exp.in   输出文件:nt2011_exp.out   简单对比时间限制:1 s   内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题 ...

  8. 1893. [国家集训队2011]等差子序列(bitset)

    ★★   输入文件:nt2011_sequence.in   输出文件:nt2011_sequence.out   简单对比时间限制:0.3 s   内存限制:512 MB [试题来源] 2011中国 ...

  9. bzoj2144 【国家集训队2011】跳跳棋

    Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...

随机推荐

  1. 转:.NET中的三种Timer的区别和用法(转)

    //1.实现按用户定义的时间间隔引发事件的计时器.此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用. System.Windows.Forms.Timer // 2.提供以指定的 ...

  2. SIM900A模块HTTP相关调试笔记

    SIM900A模块使用笔记 更新2018-12-8 正常工作状态: 接线方法: 首先将 AT 写入字符串输入框,然后点击 发送.因为模块波特率默认是 9600,所以两条指令的显示都是没有问题的:如果将 ...

  3. September 10th 2017 Week 37th Sunday

    Dream most deep place, only then the smile is not tired. 梦的最深处,只有微笑不累. Everyday I expect I can go to ...

  4. My Heart Will Go On(我心永恒)

    My Heart Will Go On(我心永恒) 歌词(英文) 歌词(中文) 简介:电影<泰坦尼克号>插曲   歌手:Celine Dion(席琳·迪翁)   词作:韦尔·杰宁斯(Wil ...

  5. 面对对象程序设计_task2_C++视频教程

    lessons about C++ 1月份的事情不该留到2月份来做,这几天看了几个地方的C++视频教程,不习惯于云课堂的话多等等,最终还是选择了慕课网上面的资源,也安下心来看了一些内容,下面附上课程详 ...

  6. C++11 的右值引用

    作者:Tinro链接:https://www.zhihu.com/question/22111546/answer/30801982来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  7. 丢手绢问题(约瑟夫问题)的python实现

    约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉. def fnA(p, personNum, cnt): times = cnt // pe ...

  8. 【[SDOI2017]数字表格】

    求 \[Ans=\prod_{i=1}^N\prod_{j=1}^MFib[(i,j)]\] 连乘的反演,其实并没有什么不一样 我们把套路柿子拿出来 \[F(n)=\sum_{i=1}^N\sum_{ ...

  9. 解决django配合nginx部署后admin样式丢失

    解决django配合nginx部署后admin样式丢失 1.  在项目的settings.py文件里添加以下内容: STATIC_URL = '/static/' STATICFILES_DIRS = ...

  10. Day3 MySql高级查询

    DQL高级查询 多表查询(关联查询.连接查询) 1.笛卡尔积 emp表15条记录,dept表4条记录. 连接查询的笛卡尔积为60条记录. 2.内连接 不区分主从表,与连接顺序无关.两张表均满足条件则出 ...