WLD is always very lucky.His secret is a lucky number . is a fixed odd number. Now he meets a stranger with numbers:.The stranger asks him questions.Each question is like this:Given two ranges and ,you can choose two numbers and to make .The you can choose is between and and the you can choose is between and .How many pairs of numbers you can choose?

If WLD can answer all the questions correctly,he'll be the luckiest man in the world.Can you help him?

Input

There are multiple cases.(At MOST )

For each case:

The first line contains an integer .

The following line contains an integer ,WLD's lucky number.K is odd.

The following line contains integers .

The following line contains an integer ,the sum of the questions WLD has to answer.

The following lines,the i-th line contains numbers ,describing the i-th question the stranger asks.

Output

For each case:

Print the total of pairs WLD can choose for each question.

Sample Input

5

3

1 2 1 2 3

1

1 2 3 5

Sample Output

2

Hint

a1+a4=a2+a3=3=K.

So we have two pairs of numbers (1,4) and (2,3).

Good luck!

题意:



给你一个长度为n的数组a,以及一个整数k,和m个询问。

每一个询问给你两个区间分别是 lr,uv,

问你有多少对 x,y 满足 a[x]+a[y]=k 并且 l<=x<=r, u<=y<=v

思路:

由于题目的数据范围和支持离线做法,我们容易想到莫队算法

但是我们知道莫队算法只可以处理一个连续的区间问题,不能处理两段连续的区间。

那么我们来考虑能否将两段区间转化为一个连续区间的问题。

我们设F(i,j ) 为 在区间i~j中,x,y (x!=y)满足 a[x]+a[y]=k 的个数。

那么根据容斥定律,我们可以知道。、

F(l1,r1)+F(l2,r2) = F(l1,r2) - F(l1,l2-1 ) - F(r1+1,r2)+F(r1+1,l2-1)

那么我们就可以把问题转化为莫队经典的区间询问问题了。

我们把每一个询问分成上面等式右边的四个部分,同时对于每一个部分维护它对这个询问的贡献是加还是减。

多组输入,记得初始化即可。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2) { ans = ans * a % MOD; } a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int *p);
const int maxn = 1000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
ll ans[maxn];
ll Ans = 0ll;
int l = 1;
int r = 0;
struct node {
int l, r, id;
int op;
} a[maxn];
int pos[maxn];
int n, m;
int len;
bool cmp(node aa, node bb)
{
if (pos[aa.l] == pos[bb.l]) {
return aa.r < bb.r;
} else {
return pos[aa.l] < pos[bb.l];
}
}
int col[maxn];
int flag[maxn];
int k;
int cnt = 0;
void add(int x)
{
if ((k >= col[x])) {
Ans += flag[k - col[x]];
}
flag[col[x]]++;
} void del(int x)
{
flag[col[x]]--;
if((k>=col[x]))
Ans-=flag[k-col[x]];
}
int main()
{
//freopen("D:\\code\\text\\input.txt","r",stdin);
//freopen("D:\\code\\text\\output.txt","w",stdout);
while(~scanf("%d%d",&n,&k))
{ len = (int)(sqrt(n));
repd(i, 1, n) {
gg(col[i]);
}
gg(m);
repd(i,1,max(n,m))
{
ans[i]=0ll;
flag[i]=0ll;
}
cnt=0;
int l1, l2, r1, r2;
repd(i, 1, m) {
pos[i] = i / len;
gg(l1); gg(r1); gg(l2); gg(r2);
a[++cnt].l = l1; a[cnt].r = r2; a[cnt].op = 1;a[cnt].id = i;
a[++cnt].l = l1; a[cnt].r = l2-1; a[cnt].op = -1;a[cnt].id = i;
a[++cnt].l = r1+1; a[cnt].r = r2; a[cnt].op = -1;a[cnt].id = i;
a[++cnt].l = r1+1; a[cnt].r = l2-1; a[cnt].op = 1;a[cnt].id = i;
}
sort(a + 1, a + 1 + cnt, cmp);
repd(i, 1, cnt) {
while (l > a[i].l) {
l--;
add(l);
}
while (r < a[i].r) {
r++;
add(r);
}
while (l < a[i].l) {
del(l);
l++;
}
while (r > a[i].r) {
del(r);
r--;
}
// cout<<a[i].l<<" "<<a[i].r<<" "<<Ans<<" "<<a[i].op<<endl;
ans[a[i].id] += Ans * a[i].op;
}
repd(i, 1, m) {
printf("%lld\n", ans[i]);
}
} return 0;
} inline void getInt(int *p)
{
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
} else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}

Lucky HDU - 5213 (莫队,容斥)的更多相关文章

  1. HDU 5213 Lucky 莫队+容斥

    Lucky Problem Description WLD is always very lucky.His secret is a lucky number K.k is a fixed odd n ...

  2. Hdu 5213-Lucky 莫队,容斥原理,分块

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5213 Lucky Time Limit: 6000/3000 MS (Java/Others)    Me ...

  3. C - Visible Trees HDU - 2841 -莫比乌斯函数-容斥

    C - Visible Trees HDU - 2841 思路 :被挡住的那些点(x , y)肯定是 x 与 y不互质.能够由其他坐标的倍数表示,所以就转化成了求那些点 x,y互质 也就是在 1 - ...

  4. HDU 5297 Y sequence 容斥 迭代

    Y sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5297 Description Yellowstar likes integer ...

  5. hdu 6053 trick gcd 容斥

    http://acm.hdu.edu.cn/showproblem.php?pid=6053 题意:给定一个数组,我们定义一个新的数组b满足bi<ai 求满足gcd(b1,b2....bn)&g ...

  6. Harvest of Apples (HDU多校第四场 B) (HDU 6333 ) 莫队 + 组合数 + 逆元

    题意大致是有n个苹果,问你最多拿走m个苹果有多少种拿法.题目非常简单,就是求C(n,0)+...+C(n,m)的组合数的和,但是询问足足有1e5个,然后n,m都是1e5的范围,直接暴力的话肯定时间炸到 ...

  7. HDU 4358 莫队算法+dfs序+离散化

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others)T ...

  8. HDU 4609 3-idiots FFT+容斥

    一点吐槽:我看网上很多分析,都是在分析这个题的时候,讲了半天的FFT,其实我感觉更多的把FFT当工具用就好了 分析:这个题如果数据小,统计两个相加为 x 的个数这一步骤(这个步骤其实就是求卷积啊),完 ...

  9. HDU 4336 Card Collector(容斥)

    题意:要收集n种卡片,每种卡片能收集到的概率位pi,求收集完这n种卡片的期望.其中sigma{pi} <=1; 思路:容斥原理.就是一加一减,那么如何算期望呢.如果用二进制表示,0表示未收集到, ...

随机推荐

  1. 只含有一个Excel模板的工程发布问题

    遇到这样一个问题,某个项目不是dynamic web project,也不是java工程,里面只有一个Excel模板,这样的话,不能打成war包和jar包,不能通过eclipse发布至Tomcat,但 ...

  2. logging.basicConfig函数各参数:

    import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(line ...

  3. javascript原生知识点

    1. 基本类型有哪几种?null 是对象吗?基本数据类型和复杂数据类型存储有什么区别? 基本类型有6种,分别是undefined,null,bool,string,number,symbol(ES6新 ...

  4. docker命令大全与资源汇总

    容器生命周期管理 run  //创建一个新的容器并运行一个命令 start/stop/restart  //启动一个或多个已经被停止的容器:停止一个运行中的容器:重启容器 kill  //杀掉一个运行 ...

  5. 机器学习实战笔记——KNN约会网站

    ''' 机器学习实战——KNN约会网站优化 ''' import operator import numpy as np from numpy import * from matplotlib.fon ...

  6. 强化学习应用于游戏Tic-Tac-Toe

    Tic-Tac-Toe游戏为3*3格子里轮流下棋,一方先有3子成直线的为赢家. 参考代码如下,我只删除了几个没用的地方: ####################################### ...

  7. Laravel 查询&数据库&模型

    1.with()与load区别: 都称为 延迟预加载,不同点在于 load()是在已经查询出来的模型上调用,而 with() 则是在 ORM 查询构造器上调用. Order::query()-> ...

  8. PTA(Advanced Level)1036.Boys vs Girls

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  9. python函数 -- 作用域,异常处理

    1.def语句和参数 python定义函数的关键词为def,格式如下: def 函数名([变元],[变元],....)          #保存在变元中的值,在函数返回后该变元就会被销毁了. 2.返回 ...

  10. ETL初探

    初识ETL 概念 ETL即Extract-Transform-Load.目的是将分散.凌乱.异质的数据整合在一起,为决策提供分析数据,是BI项目(Business Intellifence)项目中重要 ...