HDU 5273 Dylans loves sequence (逆序对,暴力)
2015-06-21 22:07
435 查看
题意:
给定一个序列,对于q个询问:(L,R)之间有几个逆序对?序列元素个数上限1000,q上限10万。仅1测试例子。
思路:
[L,R]的逆序对数量可以这么算,假设L<=K<R,将区间拆成两部分,那么[L,k]中的逆序对要算上, (k,R]中的逆序对也要算上,还有一些逆序对假设为(l,r),l在左部分,r在右部分。则应该是3部分来构成,设3部分为A,B,C,那么ans=A+B+C 。
而如果将k移到最右边,比如k=R-1,那么区间拆成[L,k]和(K,R],而(K,R]其实就只有R一个元素,并不存在什么逆序对,所以B=0,那么ans=A+C,仅仅由两部分构成,就简单了。
对于序列a,假设m[j][i]表示从j到i-1之间有几个大于a[i](如果知道了j到i-1之间有多少逆序对,那么再加上m[j][i]就是j到i之间的逆序对数了)。复杂度1k*1k。
接着求答案了,假设ans[L][R]表示从L到R之间有多少个逆序对,那么ans[j][i]=ans[j][i-1]+m[j][i]。而我们知道ans[j][j]肯定为0,那么就能计算出其他的答案了。复杂度1k*1k。
(也可以对于每个询问才来求ans[L][R],复杂度10w*1k还是可以过的)
AC代码
给定一个序列,对于q个询问:(L,R)之间有几个逆序对?序列元素个数上限1000,q上限10万。仅1测试例子。
思路:
[L,R]的逆序对数量可以这么算,假设L<=K<R,将区间拆成两部分,那么[L,k]中的逆序对要算上, (k,R]中的逆序对也要算上,还有一些逆序对假设为(l,r),l在左部分,r在右部分。则应该是3部分来构成,设3部分为A,B,C,那么ans=A+B+C 。
而如果将k移到最右边,比如k=R-1,那么区间拆成[L,k]和(K,R],而(K,R]其实就只有R一个元素,并不存在什么逆序对,所以B=0,那么ans=A+C,仅仅由两部分构成,就简单了。
对于序列a,假设m[j][i]表示从j到i-1之间有几个大于a[i](如果知道了j到i-1之间有多少逆序对,那么再加上m[j][i]就是j到i之间的逆序对数了)。复杂度1k*1k。
接着求答案了,假设ans[L][R]表示从L到R之间有多少个逆序对,那么ans[j][i]=ans[j][i-1]+m[j][i]。而我们知道ans[j][j]肯定为0,那么就能计算出其他的答案了。复杂度1k*1k。
(也可以对于每个询问才来求ans[L][R],复杂度10w*1k还是可以过的)
#include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <map> #include <vector> #include <set> #include <map> #define LL long long using namespace std; const int N=1005; int a ; int m ; int ans ; int n, q; void cal() { memset(m,0,sizeof(m)); memset(ans,0,sizeof(ans)); for(int i=1; i<=n; i++) { for(int j=i-1; j>0; j--) if(a[j]>a[i]) m[j][i]=m[j+1][i]+1; //计算在j~i-1之间比a[i]大的有几个 else m[j][i]=m[j+1][i]; } for(int i=1 ;i<=n; i++) for(int j=i+1; j<=n; j++) ans[i][j]=ans[i][j-1]+m[i][j]; } int main() { //freopen("input.txt", "r", stdin); int aa,bb; while(~scanf("%d%d",&n,&q)) { for(int j=1; j<=n; j++) scanf("%d",&a[j]); cal(); while(q--) { scanf("%d%d",&aa,&bb); printf("%d\n",ans[aa][bb]); } } return 0; }
AC代码
相关文章推荐
- Handler,MessageQueue Loop 和Message的原理解析
- Handler,MessageQueue Loop 和Message的原理解析
- Handler,MessageQueue Loop 和Message的原理解析
- DP UVALive 6506 Padovan Sequence
- 找规律 UVALive 6506 Padovan Sequence
- UISlider
- .toString和String.valueOf()
- String、StringBuffer、StringBuilder三者的区别
- 文档型信息交互设计及相关技术实现
- 报错:this class is not key value coding-compliant for the key tableview
- UIView frame, bounds and center
- FrameLayou和UI的布局优化(merge、include、ViewStub)
- hdu 5273 Dylans loves sequence
- java.util.Queue用法
- GitHub 之 pull request 流程简介
- [Schema] I have updated my XML Schema for my service but SoapUI still generates/validates according to the old schema.
- iOS UILabel显示HTML文本
- iOS 在UILabel显示不同的字体和颜色
- 多线程 调用多线程的方法 Runtime与ProcessBuilder
- 安卓TV开发(五) 移动智能终端UI之实现主流TV焦点可控UI