HDU5213 Lucky 容斥 莫隊

2022-08-18 18:39:14 字數 1063 閱讀 4254

hdu5213 lucky

給出\(n\)個數和\(k\),有\(m\)次詢問,每次詢問區間\([l1,r1]\)和區間\([l2,r2]\)中分別取乙個數能相加得到\(k\)的方案數

可以考慮容斥把兩個區間的問題轉化成四個單區間的問題,對於原問題給的區間\([l1,r1]\)和\([l2,r2]\),我們記\(f(l,r)\)為區間\([l,r]\)內能相加得到\(k\)的有多少組合,那麼對於每次的詢問,可以簡化為:\(f(l1,r1)+f(r1+1,l2-1)-f(l1,l2-1)-f(r1+1,r2)\)

對於這個\(f(l,r)\),可以使用莫隊來解決

//#pragma gcc optimize("o3")

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

#includeusing namespace std;

function____ = ();

const int maxn = 1e5+7;

typedef long long int ll;

int n,k,m,a[maxn],q,tot,cnt[maxn];

ll ret[maxn],ans;

class queryq[maxn<<2];

void dec(int x)

void inc(int x)

void solve()

int sqt = sqrt(n);

sort(q+1,q+1+tot,[&sqt](const query &lhs, const query &rhs));

ans = 0;

memset(cnt,0,sizeof(cnt));

memset(ret,0,sizeof(ret));

int l = 1, r = 0;

for(int i = 1; i <= tot; i++)

for(int i = 1; i <= q; i++) printf("%i64d\n",ret[i]);

}int main()

HDU 5213 Lucky 莫隊 容斥

題意 n個數,m個詢問,每個詢問給出兩個區間,問從兩個區間內各取乙個數加起來和為k的方案數。範圍 n,m 3w 解法 3w考慮根號n解法,發現單個區間可以莫隊,兩個區間內各取可以容斥求。include include include include include include include i...

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 那麼我們離線詢問,將乙個詢問分成四個,分塊暴力就行了。然後就是注意細節,不要發生越界,訪問錯...