Manthan, Codefest 16 H. Fibonacci-ish II (暴力)

来源:互联网 发布:大数据规划 编辑:程序博客网 时间:2024/05/21 16:59

题目链接
题意:给出n个数,一个m, q个询问区间[l,r] ,问区间里面的数排序去重后 f[1]* a[1]+f[2] *a[2]+… %m的结果

技巧的暴力,记下每个元素在数组中的位置,然后排序,再接着暴力就可以了

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define ll long long#define pb push_back#define gcd __gcdconst double EPS = 1e-8;const int maxn = 3e4+1000;const int inf  = 0x3f3f3f3f;const double PI = acos(-1.0);int n,m;pair<int,int> a[maxn];int l[maxn],r[maxn];int f[maxn];int ans[maxn];int last[maxn];int step[maxn];int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++){        scanf("%d",&a[i].first);a[i].second=i;    }    sort(a+1,a+1+n);    int q;scanf("%d",&q);    for(int i=1;i<=q;i++){        scanf("%d%d",&l[i],&r[i]);        last[i]=-1;    }    f[0]=f[1]=1;    for(int i=2;i<maxn;i++)f[i]=(f[i-1]+f[i-2])%m;    for(int i=1;i<=n;i++){        int x=a[i].first%m;        int p=a[i].second;        for(int j=1;j<=q;j++){            if(p<l[j]||p>r[j])continue;            if(last[j]==a[i].first)continue;            ans[j]=(ans[j]+f[step[j]++]*x)%m;            last[j]=a[i].first;        }    }    for(int i=1;i<=q;i++)printf("%d\n",ans[i]);}
0 0
原创粉丝点击