HDU 5213 Lucky 莫隊 容斥

2021-07-05 08:16:05 字數 1407 閱讀 2799

題意:n個數,m個詢問,每個詢問給出兩個區間,問從兩個區間內各取乙個數加起來和為k的方案數。

範圍: n,m<=3w

解法: 3w考慮根號n解法,發現單個區間可以莫隊,兩個區間內各取可以容斥求。

**:

#include#include#include#include#include#include#include#include#include#include#include#pragma comment(linker, "/stack:1024000000,1024000000")

template bool scanff(t &ret)

while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;

ret*=sgn;

return 1;

}#define inf 1073741823

#define llinf 4611686018427387903ll

#define pi acos(-1.0)

#define lth (th<<1)

#define rth (th<<1|1)

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define drep(i,a,b) for(int i=a;i>=b;i--)

#define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next)

#define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++)

#define mem(x,val) memset(x,val,sizeof(x))

#define mkp(a,b) make_pair(a,b)

#define findx(x) lower_bound(b+1,b+1+bn,x)-b

#define pb(x) push_back(x)

using namespace std;

typedef __int64 ll;

const int nn = 30300;

int n,m,k,qn;

int a[nn];

int cot[nn],ans[nn],block[nn],bnum,sum;

struct query

query(int lx,int rx,int idxx,bool isaddx):l(lx),r(rx),idx(idxx),isadd(isaddx){}

}q[nn*4];

bool cmp(query x,query y)

rep(i,1,m)printf("%d\n",ans[i]);

}int main()

}

HDU5213 Lucky 容斥 莫隊

hdu5213 lucky 給出 n 個數和 k 有 m 次詢問,每次詢問區間 l1,r1 和區間 l2,r2 中分別取乙個數能相加得到 k 的方案數 可以考慮容斥把兩個區間的問題轉化成四個單區間的問題,對於原問題給的區間 l1,r1 和 l2,r2 我們記 f l,r 為區間 l,r 內能相加得到...

hdu 5213 莫隊 容斥

題意 n個數,乙個k,m個詢問,每個詢問有 l1,r1 l2,r2 兩個區間,l1,r1 中取x l2,r2 中取y,使得x y k l1 r1 l2 r2 分析 根據容斥,f l1,r1,l2,r2 f l1,r2 f r1 1,r2 f l1,l2 1 f r1 1,l2 1 記錄下加減。這樣可...

HDU 5213 分塊 容斥

給出n個數,給出m個詢問,詢問 區間 l,r u,v 在兩個區間內分別取乙個數,兩個的和為k的對數數量。k 2 n n 30000 發現可以容斥簡化乙個詢問。乙個詢問的答案為 l,v r,u l,u r,v 那麼我們離線詢問,將乙個詢問分成四個,分塊暴力就行了。然後就是注意細節,不要發生越界,訪問錯...