博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【NOIP 模拟赛】区间第K大(kth) 乱搞
阅读量:5138 次
发布时间:2019-06-13

本文共 1315 字,大约阅读时间需要 4 分钟。

这道题就是预处理,我们就是枚举每一个数,找到左边比他大的数的个数以及其对应的区间,右边也如此,我们把左边的和右边的相乘就得到了我们的答案,我们发现这是O(n^3)的,但是实际证明他能A,分析证明他的时间复杂度是较小的,这个故事告诉我们,对于一些估计的时间复杂度,如果我们估计得太草率以至于他过于偏离实际我们往往会做出错误的决定,于是我们对于某一些拿不准的时间复杂度应该稍作分析。

正解FFT.............

#include 
#include
namespace Pre{ inline void read(int &sum){ register char ch=getchar();bool symbol=0; for(sum=0;ch<'0'||ch>'9';ch=getchar())if(ch=='-')symbol=1; for(;ch>='0'&&ch<='9';sum=(sum<<1)+(sum<<3)+ch-'0',ch=getchar()); if(symbol)sum=-sum; } const int N=2017; int Num_Kth[N][N]; int z[N],y[N],l,r,Q; int n,a[N]; inline void Init(){ for(int mid=1;mid<=n;mid++){ memset(z,0,sizeof(z)); memset(y,0,sizeof(y)); l=r=0;z[0]=y[0]=1; for(int i=mid-1;i>0;--i){ if(a[i]>=a[mid])++l; ++z[l]; } for(int i=mid+1;i<=n;++i){ if(a[i]>a[mid])++r; ++y[r]; } for(int i=0;i<=l;++i) for(int j=0;j<=r;++j) Num_Kth[a[mid]][i+j+1]+=z[i]*y[j]; } }}namespace P=Pre;inline void Init(){ P::read(P::n),P::read(P::Q); for(int i=1;i<=P::n;i++)P::read(P::a[i]); P::Init();}inline void Work(){ register int k,x; while(P::Q--){ P::read(k),P::read(x); printf("%d\n",P::Num_Kth[x][k]); }}int main(){ Init(),Work(); return 0;}

 

转载于:https://www.cnblogs.com/TSHugh/p/7354459.html

你可能感兴趣的文章
Linux环境下Redis安装和常见问题的解决
查看>>
HashPump用法
查看>>
cuda基础
查看>>
Vue安装准备工作
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
Xcode5和ObjC新特性
查看>>
LibSVM for Python 使用
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
iOS按钮长按
查看>>
Shell流程控制
查看>>
CSS属性值currentColor
查看>>
[Leetcode|SQL] Combine Two Tables
查看>>
《DSP using MATLAB》Problem 7.37
查看>>
ROS lesson 1
查看>>
js笔记
查看>>
c风格字符串函数
查看>>
python基础学习第二天
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>