您的位置:首页 > 其它

hdu 5213 容斥&& 莫队算法

2017-09-08 16:39 330 查看
问题描述

wld有n个数(a1...an)
保证对于任意1≤i≤n,1≤ai≤n
wld有一个常数k保证2≤k≤2∗n
为了消除歧义保证k为奇数
他有m个询问
每个询问有参数l1,r1,l2,r2
保证(1≤l1≤r1<l2≤r2≤n)
对于每个询问你需要回答有多少个二元组(i,j)满足:
l1≤i≤r1且l2≤j≤r2且ai+aj=k
保证1≤n≤30000,1≤m≤30000

输入描述

多组数据(最多5组)
对于每组数据:
第一行:一个数n表示数的个数
接下来一行:一个数k表示wld的常数
接下来一行:n个数,依次为a1,a2,…an
接下来一行:一个数m表示询问数
接下来m行:四个数l1,r1,l2,r2表示这组询问的参数

输出描述

对于每组数据:
对于每个询问输出二元组的数目

输入样例

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

输出样例

2

Hint

a1 + a4 = 3
a2 + a3 = 3


//未解决。不知道为甚么错了。

参考https://vjudge.net/solution/5146082http://blog.csdn.net/qq_24451605/article/details/46411115

#include<bits/stdc++.h>
using namespace std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define MP make_pair
#define ULL unsigned long long
#define LL   long long
#define inf 0x3f3f3f3f
#define md ((ll+rr)>>1)
#define ls (i<<1)
#define rs (ls|1)
#define eps 1e-8
#define ree freopen("in.txt","r",stdin);
#define bug pf("----------------");
#define N 30010
#define mod 475
#define double long double
#define  pii pair<int,int>
#define MP make_pair
#define lson ll,md,ls
#define rson md+1,rr,rs
#define pii pair<int,int>
#define B 180
//2017年09月08日14:37:08
//2017年09月08日14:56:51
//2017年09月08日15:14:54
struct Node{
int l,r,id,v;
void init(int _l,int _r,int _id,int _v){
l=_l,r=_r,id=_id,v=_v;
}
}node
;
int pos
;
int now;
bool cmp(Node a,Node b){
if(pos[a.l]!=pos[b.l])return pos[a.l]<pos[b.l];
return a.r<b.r;
}
int n,k,m;
int a
;
int ans
;
int tot
;
void addit(int l,int r,int v){
for(int i=l;i<=r;++i){
if(k>a[i])now+=v*tot[k-a[i]];
tot[a[i]]+=v;
}
}
int main(){
ree
while(~sf("%d",&n)){
sf("%d",&k);
rep(i,1,n)sf("%d",&a[i]),pos[i]=(i-1)/B+1;
mem(tot,0);
sf("%d",&m);
int cnt=0;now=0;
rep(i,1,m){
int l1,r1,l2,r2;
sf("%d%d%d%d",&l1,&r1,&l2,&r2);
node[++cnt].init(l1,r2,i,1);
node[++cnt].init(l1,l2,i,-1);
node[++cnt].init(r1,r2,i,-1);
node[++cnt].init(r1,l2,i,1);
}
sort(node+1,node+1+cnt,cmp);
for(int i=1,l=1,r=0;i<=cnt;++i){
if(l<node[i].l)addit(l,node[i].l-1,-1);
if(l>node[i].l)addit(node[i].l,l-1,1);
if(r>node[i].r)addit(node[i].r+1,r,-1);
if(r<node[i].r)addit(r+1,node[i].r,1);
l=node[i].l;r=node[i].r;
pf("%d\n",now);
ans[node[i].id]+=node[i].v*now;
}
rep(i,1,m){
pf("%d\n",ans[i]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: