給出一個長度為??的數(shù)列??和一個長度為??的數(shù)列?,求??有多少個長度為??的連續(xù)子數(shù)列能與??匹配。
兩個數(shù)列可以匹配,當(dāng)且僅當(dāng)存在一種方案,使兩個數(shù)列中的數(shù)可以兩兩配對,兩個數(shù)可以配對當(dāng)且僅當(dāng)它們的和不小于?。
第一行三個數(shù)字?。
第二行有??個數(shù)字?。
第三行有??個數(shù)字?。
輸出一個數(shù)字,?有多少個長度為??的連續(xù)子數(shù)列能與??匹配。
樣例輸入 1
5 2 10
5 3
1 8 5 5 7
樣例輸出 1
2
樣例輸入 2
2 2 6
2 3
3 4
樣例輸出 2
1
樣例輸入 3
4 2 10
5 5
9 3 8 9
樣例輸出 3
1
對于??的數(shù)據(jù),;
對于??的數(shù)據(jù),;
對于??的數(shù)據(jù),;
對于??的數(shù)據(jù),。
SOLUTION: 用霍爾定理可以推出一個式子 對a的一個區(qū)間 用sum i 表示a中連接b i的點的個數(shù) 若對于每一個sum i 滿足 sum i>=i 則可以完美匹配 CODE: #include <bits/stdc++.h>#define REP(i, a, b) for (int i = a; i <= b; ++i)
typedef long long ll;using namespace std;void File() {freopen("loj6062.in", "r", stdin);freopen("loj6062.out", "w", stdout);
}const int maxn = 1.5e5 + 10;
int n, m, h, a[maxn], b[maxn], ans;struct Segment_Tree {
#define mid ((l + r) >> 1)
#define lc rt << 1
#define rc rt << 1 | 1
#define lson lc, l, mid
#define rson rc, mid + 1, rint Min[maxn << 2], tag[maxn << 2];void pushdown(int rt) {Min[lc] += tag[rt];tag[lc] += tag[rt];Min[rc] += tag[rt];tag[rc] += tag[rt];tag[rt] = 0;}void build(int rt, int l, int r) {if (l == r)Min[rt] = -l;else {build(lson);build(rson);Min[rt] = min(Min[lc], Min[rc]);}}void modify(int rt, int l, int r, int L, int R, int x) {if (L > R)return;if (L <= l && r <= R) {Min[rt] += x;tag[rt] += x;} else {if (tag[rt])pushdown(rt);if (L <= mid)modify(lson, L, R, x);if (R >= mid + 1)modify(rson, L, R, x);Min[rt] = min(Min[lc], Min[rc]);}}
} T;void init() {scanf("%d%d%d", &n, &m, &h);REP(i, 1, m) scanf("%d", &b[i]);sort(b + 1, b + m + 1);REP(i, 1, n) {scanf("%d", &a[i]);a[i] = lower_bound(b + 1, b + m + 1, h - a[i]) - b;}T.build(1, 1, m);REP(i, 1, m - 1) T.modify(1, 1, m, a[i], m, 1);
}int main() {// File();init();REP(i, m, n) {T.modify(1, 1, m, a[i], m, 1);ans += (T.Min[1] >= 0);T.modify(1, 1, m, a[i - m + 1], m, -1);}printf("%d\n", ans);return 0;
}
轉(zhuǎn)載于:https://www.cnblogs.com/zhangbuang/p/11270793.html
總結(jié)
以上是生活随笔為你收集整理的「2017 山东一轮集训 Day2」Pair (霍尔定理+线段树)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。