您的位置:首页 > 其它

HDOJ 5213

2015-09-06 16:33 295 查看
[align=left]题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5213[/align]

BC 上的题,题解很清楚,会莫对的应该不难,
对于一个询问,我们拆成四个询问,开始拆成求区间矩形的样子,我想多了。
然后就是模板的莫队了。
一个变量打错,一直DEBUG  

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<string>
#include<iostream>
using namespace std;

#define N 600055
typedef long long LL;
int a
,pos
,block;
int n,m,k,idx;
int ans1
,tmp
;

struct node
{
int l,r,id;
int p;
}q
;

//BZOJ 4129
int cmp(node a,node b)
{
if (pos[a.l]==pos[b.l]) return a.r<b.r;
return pos[a.l]<pos[b.l];
}

void solve()
{
int l=1,r=0;
int ans=0;
for (int i=1;i<=m;i++)
{
while (l>q[i].l)
{
l--;
if (k-a[l]>0) ans+=tmp[k-a[l]];
tmp[a[l]]++;
}
while (r<q[i].r)
{
r++;
if (k-a[r]>0) ans+=tmp[k-a[r]];
tmp[a[r]]++;
}
while (l<q[i].l)
{
if (k-a[l]>0) ans-=tmp[k-a[l]];
tmp[a[l]]--;
l++;
}
while (r>q[i].r)
{
if (k-a[r]>0) ans-=tmp[k-a[r]];
tmp[a[r]]--;
r--;
}
ans1[q[i].id]+=q[i].p*ans;
}
}

int main()
{
while (scanf("%d%d",&n,&k)!=EOF)
{
memset(ans1,0,sizeof(ans1));
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(tmp,0,sizeof(tmp));

block=sqrt(n);
for (int i=1;i<=n;i++)
pos[i]=(i-1)/block+1;
idx=0;
scanf("%d",&m);

for (int i=1;i<=m;i++)
{
int l,r,l2,r2;
scanf("%d%d%d%d",&l,&r,&l2,&r2);
q[++idx].l=l;q[idx].r=r2;q[idx].id=i;q[idx].p=1;
if (r+1<=l2-1)
{
q[++idx].l=r+1,q[idx].r=l2-1,q[idx].id=i,q[idx].p=1;
}
q[++idx].l=l;q[idx].r=l2-1;q[idx].id=i,q[idx].p=-1;
q[++idx].l=r+1;q[idx].r=r2;q[idx].id=i,q[idx].p=-1;
}
swap(idx,m);
sort(q+1,q+m+1,cmp);
//for (int i=1;i<=m;i++) cout<<q[i].id<<" ";
//cout<<endl;
// cout<<m<<" "<<idx<<endl;
solve();
for (int i=1;i<=idx;i++)
printf("%d\n",ans1[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: