莫对算法

https://ac.nowcoder.com/acm/contest/917/H

链接:https://ac.nowcoder.com/acm/contest/917/H
来源:牛客网
 

题目背景

把一张纸对折100次就和珠穆朗玛峰一样高了哦

                                                                     ——syh

题目描述

水宝宝某天突发奇想,在纸上写了这样一个问题:

给一个a数组,求∑∞i=1get(l,r,i)⋅∑∞i=1get(l1,r1,i)∑i=1∞get(l,r,i)⋅∑i=1∞get(l1,r1,i)

,其中get(l,r,x)表示求a[l]~a[r]中x出现了几次,他很快推出了规律,

但正当他把这道题录入电脑是发现作为一个蒟蒻的他不会打latex也没找到数学符号(主要是懒),

所以他省略了那个∑∑式子,于是,题面变为了求get(l,r,x)*get(l1,r1,x)的值了.

为了防数据过大,你要对20180623取模

不保证l<r,l1<r1,遇到这种情况,请先交换一下

注:本系列题不按难度排序哦

输入描述:

第一行一个n,m 接下来一行n个数表示a[i] 接下来m行,每行l,r,l1,r1,x,表示求get(l,r,x)*get(l1,r1,x)

输出描述:

3×m行,先输出get(l,r,x),再输出get(l1,r1,x),再输出get(l,r,x)*get(l1,r1,x)

示例1

输入

复制

5 1
2 2 2 2 2
1 5 1 3 2

输出

复制

5
3
15

说明

对于所有数据1<=n,m<=105;1<=l,r,l1,r1<=1051<=n,m<=105;1<=l,r,l1,r1<=105;a[i]≤10000,x≤100000;a[i]≤10000,x≤100000

提示:20180623不是质数

看了别人AC的代码,暴力过的!!!

我??????这n^2的复杂度就过了???搞不懂,实在搞不懂。

自己第一眼看去就就是莫队算法,奈何没注意到区间还能不规范,一直找了很久的错误,于是一两个小时就过去了。哎。。

这已经不知道是第几个低级错误了。

之所以发出来,也是因为这是自己第一次动手写莫队算法。

这题没什么说的,就是莫队板子:

#include<bits/stdc++.h>
#define forn(i,a,b) for(ll i=a;i<=b;i++)
#define INF 0x3f3f3f3f
using namespace std;

#define ll long long
const ll N =100*1000+10;
const ll mod = 20180623;
ll n,m;
ll a[N],ans[N*2],num[N],pos[N];
struct node{
    ll L,R,x,id;
}t[N*2];

bool cmp(node a,node b){
    if(pos[a.L]==pos[b.L])
        return a.R<b.R;
    else return pos[a.L]<pos[b.L];
}

ll L=1,R=0;
void solve(node p){
     while(p.L>L){
        num[a[L]]--;
        L++;
    }
    while(p.R>R){
        R++;
        num[a[R]]++;
    }
    while(p.L<L){
        L--;
        num[a[L]]++;
    }
    while(p.R<R){
        num[a[R]]--;
        R--;
    }
}

int main(){
    scanf("%lld %lld",&n,&m);
    memset(num,0,sizeof(num));
    ll block=sqrt(n);
    for(ll i=1;i<=n;i++){
        scanf("%lld",a+i);
        pos[i]=i/block;
    }

    for(ll i=1;i<=m;i++){
        ll l1,r1,l2,r2,x;
        scanf("%lld%lld%lld%lld%lld",&l1,&r1,&l2,&r2,&x);
        if(l1>r1)swap(l1,r1);
        if(l2>r2)swap(l2,r2);
        t[i].L=l1,t[i].R=r1,t[i].id=i,t[i].x=x;
        t[i+m].L=l2,t[i+m].R=r2,t[i+m].id=i+m,t[i+m].x=x;
    }

    sort(t+1,t+1+2*m,cmp);
    memset(num,0,sizeof(num));

    for(ll i=1;i<=2*m;i++){
        solve(t[i]);
        ans[t[i].id]=num[t[i].x];
    }

    for(ll i=1;i<=m;i++)
        printf("%lld\n%lld\n%lld\n",ans[i]%mod,ans[i+m]%mod,(ans[i]%mod*ans[i+m])%mod);

    return 0;
}
发布了70 篇原创文章 · 获赞 5 · 访问量 7191

猜你喜欢

转载自blog.csdn.net/xiaonanxinyi/article/details/92717946