洛谷P3157 动态逆序对 [CQOI2011] cdq分治
正解:cdq分治
解题报告:
这题首先想到的就直接做逆序对,然后记录每个点的贡献,删去就减掉就好
但是仔细一想会发现布星啊,如果有一对逆序对的两个点都被删了岂不是就减重了嘛
那就再加上一个值
这个值是什么呢,就是满足逆序对且逆序对的另一个数的删除时间小于这个数的数对的个数(,,,有点绕口,,,但应该能get,,,?
然后就做完了,就是个cdq分治
但是这么想484有点复杂,,,?主要是实现起来想想它要实现哪些东西就jio得代码估计会比较长,就不想打嘛
那就再转化一下题意
把删去操作想成插入操作
那就是从后往前操作,每次会插入一些数,那这个数的贡献就是满足插入时间小于它且满足逆序对的数对的个数
这样就只要做一遍cdq就好了(其实核心思想是一样的,,,只是私信jio得这个方法的代码应该好打一些w
然后等下放代码QAQ!
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define rg register
#define gc getchar()
#define lowbit(x) (x&(-x))
#define rp(i,x,y) for(rg int i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i) const ll N=1e5+;
struct ques{ll pos,tim,num,as;}q[N],t[N];
bool is_del[N];
ll n,m,sum,q_cnt,del[N],p[N],tr[N]; il ll read()
{
rg char ch=gc;rg int x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc; if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void updat(ll x,ll y){while(x<=n)tr[x]+=y,x+=lowbit(x);}
il ll query(ll x){ll tmp=;while(x)tmp+=tr[x],x-=lowbit(x);return tmp;}
il bool cmp(ques gd,ques gs){return gd.tim<gs.tim;}
il bool cmq(ques gd,ques gs){return gd.pos<gs.pos;}
il void solv(ll l,ll r)
{
if(l>=r)return;ll mid=(l+r)>>,num=;solv(l,mid);solv(mid+,r);sort(q+l,q+r+,cmq);
rp(i,l,r)if(q[i].tim<=mid)updat(q[i].num,),++num;else q[i].as+=num-query(q[i].num);
rp(i,l,r)if(q[i].tim<=mid)updat(q[i].num,-);
my(i,r,l)if(q[i].tim<=mid)updat(q[i].num,);else q[i].as+=query(q[i].num);
rp(i,l,r)if(q[i].tim<=mid)updat(q[i].num,-);
} int main()
{
n=read();m=read();rp(i,,n)p[read()]=i;rp(i,,m)is_del[del[i]=read()]=;rp(i,,n)if(!is_del[i])q[++q_cnt]=(ques){p[i],q_cnt,i,};
my(i,m,)q[++q_cnt]=(ques){p[del[i]],q_cnt,del[i],};
solv(,n);sort(q+,q++n,cmp);rp(i,,n)q[i].as+=q[i-].as;my(i,n,n-m+)printf("%lld\n",q[i].as);
return ;
}
这是代码!(树状数组真的比线段树好打这——么多!爱了爱了TT
洛谷P3157 动态逆序对 [CQOI2011] cdq分治的更多相关文章
- 洛谷P1393 动态逆序对(CDQ分治)
传送门 题解 听别人说这是洛谷用户的双倍经验啊……然而根本没有感觉到……因为另外的那题我是用树状数组套主席树做的……而且莫名其妙感觉那种方法思路更清晰(虽然码量稍稍大了那么一点点)……感谢Candy大 ...
- 【Luogu1393】动态逆序对(CDQ分治)
[Luogu1393]动态逆序对(CDQ分治) 题面 题目描述 对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i < j的有序对(i,j)的个数.你需要计算出一个序 ...
- 【洛谷3157】[CQOI2011] 动态逆序对(CDQ分治)
点此看题面 大致题意: 给你一个从\(1\)到\(n\)的排列,问你每次删去一个元素后剩余的逆序对个数. 关于\(80\)分的树套树 为了练树套树,我找到了这道题目. 但悲剧的是,我的 线段树套\(T ...
- luogu P3157 [CQOI2011]动态逆序对(CDQ分治)
题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...
- bzoj3295: [Cqoi2011]动态逆序对(cdq分治)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- bzoj 3295 [Cqoi2011]动态逆序对(cdq分治,BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3295 [题意] n个元素依次删除m个元素,求删除元素之前序列有多少个逆序对. [思路] ...
- [luogu3157][bzoj3295][CQOI2011]动态逆序对【cdq分治+树状数组】
题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...
- BZOJ3295 [Cqoi2011]动态逆序对 【CDQ分治】
题目 对于序列A,它的逆序对数定义为满足i 输入格式 输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数.以下n行每行包含一个1到n之间的正整数,即初始排列.以下m行每行一个正整数,依次为 ...
- 【题解】动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393]
[题解]动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393] 水一水QAQ 题目链接: \([P3157]\) \([BZOJ3295]\) [题目描述] 对于一个序 ...
随机推荐
- Explaining Delegates in C# - Part 2 (Events 1)
In my previous post, I spoke about a few very basic and simple reasons of using delegates - primaril ...
- SpringMVC系列之主要组件
一.组件说明 DispatcherServlet:前端控制器,用于请求到达前端控制器,由它调用其他组件处理用户的请求. HandlerMapping:处理器映射器,负责根据用户请求找到Handler( ...
- 浏览器解析html全过程详解
前端文摘:深入解析浏览器的幕后工作原理 关于浏览器解析html全过程详解 输入URL到浏览器接收返回的数据的整个过程 TCP报文格式详解 IP报文格式详解 Linux IO模式及 select.pol ...
- jQuery给动态添加生成的元素绑定事件的方法
<div id="testdiv"> <ul></ul> </div> 需要给<ul>里面动态添加的<li&g ...
- Get方法和post方法有何不同?
Get方法和post方法有何不同? 在B/S应用程序中,前台与后台的数据交互,都是通过HTML中Form表单完成的.Form提供了两种数据传输的方式——get和post.虽然它们都 是数据的提交方式, ...
- 【EF框架异常】System.MissingMethodException:“找不到方法:“System.Data.Entity.ModelConfiguration.Configuration.PrimitivePropertyConfiguration
最近调试EF的时候遇到下面这个问题 System.MissingMethodException:“找不到方法:“System.Data.Entity.ModelConfiguration.Config ...
- 【十大算法实现之KNN】KNN算法实例(含测试数据和源码)
KNN算法基本的思路是比较好理解的,今天根据它的特点写了一个实例,我会把所有的数据和代码都写在下面供大家参考,不足之处,请指正.谢谢! update:工程代码全部在本页面中,测试数据已丢失,建议去UC ...
- read by other session 等待事件。
今天是2014-01-06,从今天开始,打算春节之前每天学习一个等待事件,今天就记录一下read by other session这个等待事件笔记. 什么是read by other session? ...
- javascript的fn方法(转)
jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展j ...
- JavaScript 中的 Map
很多编程语言中都有类似Map这种 键-值对 的数据结构. 可惜,JavaScript没有. 幸运的是,可以自己构建一个Map对象. 对象的定义 <script type="text/j ...