题目描述
题目背景
把一张纸对折100次就和珠穆朗玛峰一样高了哦
——syh
题目描述
注:本系列题不按难度排序哦
输入描述:
第一行一个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
说明
题解:
莫队的裸题
把l,r和l1,r1都读入,并放在一起排序,然后进行莫队
最后按照原先顺序输出
代码:
我写的代码感觉没啥问题,,,但是就是wa
只好贴出其他人的代码。。。
#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;
}