hdu 5213 莫隊 容斥

2021-07-23 09:11:11 字數 940 閱讀 5141

題意:

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)。   記錄下加減。

這樣可以把兩個不相干的區間分成四個區間,然後就可以用莫隊了。

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define inf 0x3f3f3f3f

using namespace std;

const int maxn = 2e5+10;

const ll mod = 1000000007;

const double eps = 1e-10;

const double pi = acos(-1.0);

struct nodeq[maxn];

ll ans[maxn];

int a[maxn],num[maxn];

int unit;

bool cmp(node a,node b)

while(r > q[i].r)

while(l < q[i].l)

while(l > q[i].l)

ans[q[i].id] += temp*q[i].f;

}for(int i = 0; i < m; i++) printf("%lld\n",ans[i]);

}return 0;

}

HDU 5213 Lucky 莫隊 容斥

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

HDU5213 Lucky 容斥 莫隊

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

HDU 5213 分塊 容斥

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