codeforces 691F Couple Cover 暴力预处理

来源:互联网 发布:重庆药交所网络事业部 编辑:程序博客网 时间:2024/05/22 06:59

题意:对于长度为n的序列,m个询问,每次学问一个数。让你回答序列中乘积不小于它的数对有多少对,n<=1e6


预处理当前序列中不大于当前值的数对有多少,然后用总数减去他的前一个就是答案了

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#define MAX 3000010using namespace std;long long n;long long ct[MAX];long long num[MAX];int m;int main() {    scanf("%d",&n);    for (int i = 0; i < n; i++) {        int a;        scanf("%d",&a);        ct[a]++;    }    for (int i = 1; i * i < MAX; i++) {        for (int j = i; i * j < MAX; j++) {            if (i == j)                num[i * j] += ct[i] * (ct[i] - 1);            else                num[i * j] += 2 * ct[i] * ct[j];        }    }    for (int i = MAX-2; i > 0; i--)        num[i] += num[i+1];    long long x = n * (n - 1) - num[1];    scanf("%d",&m);    while (m--) {        int a;        scanf("%d",&a);        printf("%I64d\n", num[a] + x);    }}


0 0
原创粉丝点击