对每个位置i处理出以其为结尾,且比a(i)大的数有j个的前缀个数,记成一个数组l;同理,处理出以其为开头,且比a(i)大的数有j个的后缀的个数,记成一个数组r。

整个序列中比a(i)大的数的个数的数组就是对l和r数组卷积起来。

于是枚举所有i,FFT,累加答案即可。

但是,有可能有重复的元素,就将a(i)前面的和它相同的数当成比它大,后面的和它相同的数当成比他小即可。

存疑:FFT的数组到底要开多大啊?四倍?还是只要是一个比卷积结果数组长度大的2的整数幂次就行了?我倾向于后者。求解。

2#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <cstring>
#include <vector>
using namespace std;
#define EPS 1e-8
const double PI = acos(-1.0);
struct Complex{
double real,image;
Complex(double _real,double _image){
real=_real;
image=_image;
}
Complex(){}
};
Complex operator + (const Complex &c1,const Complex &c2){
return Complex(c1.real+c2.real,c1.image+c2.image);
}
Complex operator - (const Complex &c1,const Complex &c2){
return Complex(c1.real-c2.real,c1.image-c2.image);
}
Complex operator * (const Complex &c1,const Complex &c2){
return Complex(c1.real*c2.real-c1.image*c2.image,c1.real*c2.image+c1.image*c2.real);
}
int rev(int id,int len){
int ret=0;
for(int i=0;(1<<i)<len;++i){
ret<<=1;
if(id&(1<<i)){
ret|=1;
}
}
return ret;
}
Complex tmp[2100];
//µ±DFT==1ʱÊÇDFT, DFT==-1ʱÔòÊÇÄæDFT
void IterativeFFT(Complex A[],int len, int DFT){//¶Ô³¤¶ÈΪlen(2µÄÃÝ)µÄÊý×é½øÐÐDFT±ä»»
for(int i=0;i<len;++i){
tmp[rev(i,len)]=A[i];
}
for(int i=0;i<len;++i){
A[i]=tmp[i];
}
for(int s=1;(1<<s)<=len;++s){
int m=(1<<s);
Complex wm=Complex(cos(DFT*2*PI/m),sin(DFT*2*PI/m));
for(int k=0;k<len;k+=m){//ÕâÒ»²ã½áµã°üº¬µÄÊý×éÔªËØ¸öÊý¶¼ÊÇ(1<<s)
Complex w=Complex(1,0);
for(int j=0;j<(m>>1);++j){//ÕÛ°ëÒýÀí£¬¸ù¾ÝÁ½¸ö×Ó½Úµã¼ÆË㸸½Úµã
Complex t=w*A[k+j+(m>>1)];
Complex u=A[k+j];
A[k+j]=u+t;
A[k+j+(m>>1)]=u-t;
w=w*wm;
}
}
}
if(DFT==-1){
for(int i=0;i<len;++i){
A[i].real/=len;
A[i].image/=len;
}
}
}
Complex A[2100],B[2100]; int wq,qw,a[2100],ans[2100][2100],l[2100],r[2100],now,i,j,k,n,m,x;
int read()
{
char c;
int ans=0;
c=getchar();
while (c<'0' || c>'9') c=getchar();
while (c>='0' && c<='9') ans=ans*10+c-48,c=getchar();
return ans;
}
int main()
{
wq=read();
for (qw=1;qw<=wq;qw++)
{
n=read(); m=read();
for (i=1;i<=n;i++) a[i]=read();
memset(ans,0,sizeof(ans));
for (i=1;i<=n;i++)
{
memset(l,0,sizeof(l)); l[0]=1;
memset(r,0,sizeof(r)); r[0]=1;
now=0;
for (j=i-1;j>=1;j--)
{
if (a[j]>=a[i]) now++;
l[now]++;
}
int len1=now+1;
now=0;
for (j=i+1;j<=n;j++)
{
if (a[j]>a[i]) now++;
r[now]++;
}
int len2=now+1;
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
for(int j=0;j<len1;++j){
A[j]=Complex(l[j],0);
}
for(int j=0;j<len2;++j){
B[j]=Complex(r[j],0);
}
int len;
for(int j=0;;++j){
if((1<<j)>=len1+len2){
len=(1<<j);
break;
}
}
IterativeFFT(A,len,1);
IterativeFFT(B,len,1);
for(int j=0;j<len;++j){
A[j]=A[j]*B[j];
}
IterativeFFT(A,len,-1);
for(int j=0;j<len;++j){
ans[a[i]][j]+=(int)(A[j].real+0.5);
}
}
for (i=1;i<=m;i++)
{
k=read(); x=read();
printf("%d\n",ans[x][k-1]);
}
}
}

【FFT】OpenJ_POJ - C17H - Reverse K-th Problem的更多相关文章

  1. 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树

    [BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...

  2. 【LeetCode】150. Evaluate Reverse Polish Notation 解题报告(Python)

    [LeetCode]150. Evaluate Reverse Polish Notation 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/ ...

  3. 【BZOJ3527】【FFT】力

    [问题描述]给出n个数qi,给出Fj的定义如下:令Ei=Fi/qi.试求Ei.[输入格式]输入文件force.in包含一个整数n,接下来n行每行输入一个数,第i行表示qi.[输出格式]输出文件forc ...

  4. 【清橙A1084】【FFT】快速傅里叶变换

    问题描述 离散傅立叶变换在信号处理中扮演者重要的角色.利用傅立叶变换,可以实现信号在时域和频域之间的转换. 对于一个给定的长度为n=2m (m为整数) 的复数序列X0, X1, …, Xn-1,离散傅 ...

  5. 【HDU1402】【FFT】A * B Problem Plus

    Problem Description Calculate A * B. Input Each line will contain two integers A and B. Process to e ...

  6. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

  7. 【FFT】HDU4609-3 idiots

    ..退化为一天两题了,药丸.. [题目大意] 给出n根木棍的长度,求从其中取出3根能组成三角形的概率. [思路] 然后枚举求前缀和,枚举最长边.假设最长边为l,先求出所有两边之和大于它的情况数.然后减 ...

  8. 【FFT】BZOJ2179- FFT快速傅立叶

    [题目大意] 给出n位十进制a和b,求a*b. [思路] FFT.感觉弄起来比较麻烦,不如直接背板子. 注意一下MAXN的取值,我一开始非常随意地就写了60000*2+50,其实n是要扩展到最接近的2 ...

  9. 【暑假】[实用数据结构]UVa11997 K Smallest Sums

    UVa11997 K Smallest Sums  题目: K Smallest Sums You're given k arrays, each array has k integers. Ther ...

随机推荐

  1. grunt、Browsersync服务及weinre远程调试

    一.grunt server服务 前端开发时,经常需要把静态文件映射成web服务,传统的做法是丢到apache,但太重太不友好了.开发angular的时候,官方的chrome插件对file:///的支 ...

  2. zuul进行rate limit

    maven <dependency> <groupId>com.marcosbarbero.cloud</groupId> <artifactId>sp ...

  3. docker 环境

    1.docker 升级 步骤: docker -v service docker stop yum -y update docker.io

  4. ipython notebook环境搭建

    默认已经装好python基本环境,再进行下面步骤: 1. 下载安装IPython:  c:>pip.exe install ipython 系统就会去网上寻找ipython的包, 进行下载及安装 ...

  5. ctsc&apio2018八日游

    day0: 早就知道自己是打酱油的..早就做好了打铁的准备.. Q:那你来干嘛 A:当然是来玩啊!!玩啊!啊!! emmmmm 抱着半期考不及格的卷子瑟瑟发抖地上了飞机. day1:报道!当然还有在宾 ...

  6. (十六)strtok、strtok_s、strtok_r 字符串分割函数

    1.strtok函数 函数原型:char * strtok (char *str, const char * delimiters); 参数:str,待分割的字符串(c-string):delimit ...

  7. PHP下载APK文件

    PHP下载APK文件(代码如下) /** * //这里不要随便打印文字,否则会影响输出的文件的 * (例如下载没问题,但是apk安装时候提醒解析安装包错误) * @return array */ pu ...

  8. 【LabVIEW技巧】LabVIEW OOP怎么学

    前言 有很多人对LabVIEW OOP存在比较极端的看法,大致分为两类: 1. 绝对否定派认为LabVIEW OOP只不过是LabVIEW为了追求时髦,在面向过程的基础上用簇做了一些特性,实际上完全不 ...

  9. CSS/Compass修改placeholder的文字样式

    在HTML5中,<input>与<textarea>标签支持placeholder属性,用来定义无任何输入时的默认文字. 可以通过CSS修改placeholder的文字样式: ...

  10. Mysql 数据库学习笔记03 存储过程

    一.存储过程:如下           通过 out .inout 将结果输出,可以输出多个值. * 调用存储过程: call 存储名称(参数1,参数2,...); 如指定参数不符合要求,返回 Emp ...