洛谷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]\) [题目描述] 对于一个序 ...
随机推荐
- iOS开发-- 使用NSNumber将int、float、long等数据类型加入到数组或字典中
// 设置值 NSNumber *number=[NSNumber numberWithInt:45]; // 取值 NSLog(@"NSNumber %d",[number in ...
- Python中常见的字符串小笔试题
1.获取实现两个字符串中最大的公共子串 思路: 1.比较两个字符串的长度 2.获取较短字符串的所有子串 3.使用__contains__函数进行比较 4.把子串当做键,子串长度作为值,存入字典, ...
- Flask中向前端传递或者接收Json文件的方法
1. 利用flask的request.form.get()方法 这一中方法主要利用flask的request.form.get方法,获得前端发送给后台的json文件 Python 端代码: @app. ...
- linux 开机自启
cd /home/dpf 1.vi startup.sh #!/bin/shecho "hello world" >> /home/dpf/test.txt vi mq ...
- 使用es6的蹦床函数解决递归造成的堆栈溢出
首先,我们先定义一个函数,使用递归的思想写求和的方法: function sum(x, y) { if (y > 0) { return sum(x + 1, y - 1); } else ...
- Windows 7笔记本创建wifi热点供手机上网教程
Windows 7笔记本创建wifi热点供手机上网教程 | 浏览:60606 | 更新:2012-07-19 11:48 | 标签:笔记本 wifi 1 2 3 4 5 6 7 分步阅读 用智能手机的 ...
- c# MVC Take的使用
Take的使用 myPicture = dbContext.MyPictures.Where(u => u.Width == request.Width && u.Height ...
- window策略设置
gpedit.msc 组策略编辑器 secopl.msc 本地安全设置 共享(不用登录即可访问本地共享)设置: 运行里输入secpol.msc启动“本地安全设置”-“用户权利指派”-将“拒绝从网络访 ...
- 《转》Python学习(17)-python函数基础部分
http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...
- 【资源大全】.NET资源大全中文版(Awesome最新版)
算法与数据结构(Algorithms and Data structures) 应用程序接口(API) 应用程序框架(Application Frameworks) 模板引擎(Application ...