列表

详情


NC25835. 数据结构题

描述

题目背景

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

题目描述

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

给一个a数组,求

,其中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<=10^5 ;1<=l,r,l_1,r_1<=10^5;a[i]\leq10000,x\leq100000

提示:20180623不是质数

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 543ms, 内存消耗: 6784K, 提交时间: 2020-09-09 15:20:57

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int mod=20180623;
#define ll long long 
vector< vector<int> >s(N);  
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		s[x].push_back(i);
	}
	while(m--)
	{
		int a,b,c,d,e;
		cin>>a>>b>>c>>d>>e;
		if(b<a)	swap(a,b);
		if(d<c)	swap(c,d);
		ll x=upper_bound(s[e].begin(),s[e].end(),b)-lower_bound(s[e].begin(),s[e].end(),a);
		ll y=upper_bound(s[e].begin(),s[e].end(),d)-lower_bound(s[e].begin(),s[e].end(),c);
		ll z=x*y%mod;
		cout<<x<<endl<<y<<endl<<z<<endl;
	}
}

C(clang 3.9) 解法, 执行用时: 537ms, 内存消耗: 4060K, 提交时间: 2019-07-11 22:47:00

#include<stdio.h>
#include<math.h>
int ans[100001];
int main ()
{
    int n,m,i,j,l,r,l1,r1,x,sum1,sum2;
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++){
    	scanf("%d",&ans[i]);
	}
	for(i=0;i<m;i++){
		scanf("%d %d %d %d %d",&l,&r,&l1,&r1,&x);
		if(l>r){
			int c=l;
			l=r;
			r=c;
		}
		for(j=l;j<=r;j++){
			if(ans[j]==x)
			sum1++;
		}
			if(l1>r1){
			int c=l1;
			l1=r1;
			r1=c;
		}
		for(j=l1;j<=r1;j++){
			if(ans[j]==x)
			sum2++;
		}
		printf("%d\n%d\n%d\n",sum1,sum2,sum1*sum2);
		sum1=sum2=0;
	}
	return 0;
 } 

C++ 解法, 执行用时: 961ms, 内存消耗: 1400K, 提交时间: 2021-10-15 20:06:11

#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main()
{
	int n,m,num1,num2,l,r,l1,r1,x;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=0;i<m;i++)
	{
		num1=0,num2=0;
		cin>>l>>r>>l1>>r1>>x;
		if(l>r)
			swap(l,r);
		if(l1>r1)
			swap(l1,r1);
		for(int j=l;j<=r;j++)
			if(a[j]==x)
				num1++;
		for(int j=l1;j<=r1;j++)
			if(a[j]==x)
				num2++;
		
		cout<<num1<<endl;
		cout<<num2<<endl;
		cout<<num1*num2%20180623<<endl;
	}
	return 0;
}

上一题