NC25835. 数据结构题
描述
水宝宝某天突发奇想,在纸上写了这样一个问题:
给一个a数组,求
,其中get(l,r,x)表示求a[l]~a[r]中x出现了几次,他很快推出了规律,
但正当他把这道题录入电脑是发现作为一个蒟蒻的他不会打latex也没找到数学符号(主要是懒),
所以他省略了那个式子,于是,题面变为了求get(l,r,x)*get(l1,r1,x)的值了.
输入描述
第一行一个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
说明:
对于所有数据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; }