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