“玲珑杯”线上赛 Round #17 河南专场 D -.妩钶取玳°月(FFT)
2017-06-24 20:41
274 查看
DESCRIPTION
妩钶取玳°月是月大叔的ID,他是一个智商高达429的智力大师,最擅长的技能就是搞事。今天他又要开始搞事了。现在有n个元素ai然后现在有Q个询问,每次月大叔想问一共有多少对pair,满足a[i]+a[j]>=k(其中 i < j)
INPUT
输入第一行包含一个正整数t(1≤t≤100) ,表示有t组数据对于每组数据:
第一行两个整数n,q。表示有n(1≤n≤100000)个元素,q(1≤q≤100000)次询问第二行n个整数(1≤ai≤100000),表示每个元素的大小。接下来q行,每行一个k(1≤k≤200000),表示询问。
OUTPUT
对于每组测试数据的询问,输出有多少对即可。
SAMPLE INPUT
1
5 5
1 2 3 4 5
1
2
3
4
5
SAMPLE OUTPUT
10
10
10
9
8
题解:fft快速求两个数和,前缀维护答案,o(1)查询。
代码:
妩钶取玳°月是月大叔的ID,他是一个智商高达429的智力大师,最擅长的技能就是搞事。今天他又要开始搞事了。现在有n个元素ai然后现在有Q个询问,每次月大叔想问一共有多少对pair,满足a[i]+a[j]>=k(其中 i < j)
INPUT
输入第一行包含一个正整数t(1≤t≤100) ,表示有t组数据对于每组数据:
第一行两个整数n,q。表示有n(1≤n≤100000)个元素,q(1≤q≤100000)次询问第二行n个整数(1≤ai≤100000),表示每个元素的大小。接下来q行,每行一个k(1≤k≤200000),表示询问。
OUTPUT
对于每组测试数据的询问,输出有多少对即可。
SAMPLE INPUT
1
5 5
1 2 3 4 5
1
2
3
4
5
SAMPLE OUTPUT
10
10
10
9
8
题解:fft快速求两个数和,前缀维护答案,o(1)查询。
代码:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const double PI = acos(-1.0); struct complex { double r,i; complex(double _r = 0,double _i = 0) { r = _r; i = _i; } complex operator +(const complex &b) { return complex(r+b.r,i+b.i); } complex operator -(const complex &b) { return complex(r-b.r,i-b.i); } complex operator *(const complex &b) { return complex(r*b.r-i*b.i,r*b.i+i*b.r); } }; void change(complex y[],int len) { int i,j,k; for(i = 1, j = len/2;i < len-1;i++) { if(i < j)swap(y[i],y[j]); k = len/2; while( j >= k) { j -= k; k /= 2; } if(j < k)j += k; } } void fft(complex y[],int len,int on) { change(y,len); for(int h = 2;h <= len;h <<= 1) { complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h)); for(int j = 0;j < len;j += h) { complex w(1,0); for(int k = j;k < j+h/2;k++) { complex u = y[k]; complex t = w*y[k+h/2]; y[k] = u+t; y[k+h/2] = u-t; w = w*wn; } } } if(on == -1) for(int i = 0;i < len;i++) y[i].r /= len; } const int MAXN = 400040; complex x1[MAXN]; int a[MAXN/4]; long long num[MAXN];//100000*100000会超int long long sum[MAXN]; int main() { int T; int n; int m; scanf("%d",&T); while(T--) { scanf("%d%d",&n, &m); memset(num,0,sizeof(num)); for(int i = 0;i < n;i++) { scanf("%d",&a[i]); num[a[i]]++; } sort(a,a+n); int len1 = a[n-1]+1; int len = 1; while( len < 2*len1 )len <<= 1; for(int i = 0;i < len1;i++) x1[i] = complex(num[i],0); for(int i = len1;i < len;i++) x1[i] = complex(0,0); fft(x1,len,1); for(int i = 0;i < len;i++) x1[i] = x1[i]*x1[i]; fft(x1,len,-1); for(int i = 0;i < len;i++) num[i] = (long long)(x1[i].r+0.5); len = 2*a[n-1]; //减掉取两个相同的组合 for(int i = 0;i < n;i++) num[a[i]+a[i]]--; //选择的无序,除以2 for(int i = 1;i <= len;i++) { num[i]/=2; num[i] += num[i-1]; } while(m--) { int k; scanf("%d", &k); if(k>len) printf("0\n"); else printf("%lld\n", num[len]-num[k-1]); } } return 0; }
相关文章推荐
- “玲珑杯”线上赛 Round #17 河南专场 B(容斥)
- “玲珑杯”线上赛 Round #15 河南专场 C 咸鱼魔法记
- “玲珑杯”线上赛 Round #15 河南专场 G -- 咸鱼拷问 RMQ
- “玲珑杯”线上赛 Round #15 河南专场:A -- Reverse the lights
- “玲珑杯”线上赛 Round #15 河南专场 H -- 喵哈哈村的战斗魔法师丶坏坏い月 分块/线段树
- “玲珑杯”线上赛 Round #15 河南专场 A -- Reverse the lights DP
- “玲珑杯”线上赛Round#17河南专场 A. Sin your life
- “玲珑杯”线上赛 Round #15 河南专场:C -- 咸鱼魔法记
- “玲珑杯”线上赛 Round #15 河南专场 J -- 喵哈哈村的几何大师╰☆莣メ誋こ月
- “玲珑杯”线上赛 Round #15 河南专场 F -- 咸鱼文章
- “玲珑杯”线上赛 Round #15 河南专场 C - 咸鱼魔法记 尺取法
- “玲珑杯”线上赛 Round #15 河南专场:F -- 咸鱼文章
- “玲珑杯”线上赛 Round #15 河南专场 D -- 咸鱼商店
- “玲珑杯”线上赛 Round #15 河南专场:G -- 咸鱼拷问
- “玲珑杯”线上赛 Round #15 河南专场 E -- 咸鱼旅行
- DP训练 玲珑杯线上赛 Round #15 河南专场:A -- Reverse the lights [线性DP]
- “玲珑杯”线上赛 Round #15 河南专场:E -- 咸鱼旅行
- “玲珑杯”线上赛 Round #15 河南专场:D -- 咸鱼商店
- “玲珑杯”线上赛 Round #15 河南专场 F 咸鱼文章
- “玲珑杯”线上赛 Round #15 河南专场 F -- 咸鱼文章