题目描述:
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 7309 Accepted Submission(s): 3160
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 55000; const int inf = 0x3f3f3f3f; #define ls(x) x<<1 #define rs(x) x<<1|1 #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r int last[maxn << 2], tag[maxn << 2]; //剩余位置数量和懒标记 int n, m; void build(int rt, int l, int r) { last[rt] = (r - l + 1); tag[rt] = -1; if (l == r) { return; } int mid = (l + r) >> 1; build(lson); build(rson); } void push_up(int rt) { last[rt] = last[ls(rt)] + last[rs(rt)]; } void push_down(int rt,int l,int r) { if (l == r)return; int m = r - l + 1; if (tag[rt] != -1) {//如果需要下推 last[ls(rt)] = tag[rt] * ((m + 1) / 2); last[rs(rt)] = tag[rt] * (m / 2); tag[ls(rt)] = tag[rt]; tag[rs(rt)] = tag[rt]; tag[rt] = -1; } } int qurrry(int rt, int l, int r, int L, int R) { if (L <= l && r <= R) { return last[rt]; } push_down(rt, l, r); int mid = (l + r) >> 1; int ans = 0; if (L <= mid) { ans += qurrry(lson, L, R); } if (R > mid) { ans += qurrry(rson, L, R); } return ans; } int update(int rt, int l, int r, int L, int R,int f) { if (L <= l && r <= R) { int ans = r - l + 1 - last[rt]; if (f==1) { last[rt] = r - l + 1; tag[rt] =1 ; } else { last[rt] = 0; tag[rt] = 0; } return ans; } push_down(rt, l, r); int mid = (l + r) >> 1; int ans = 0; if (L <= mid) { ans += update(lson, L, R,f); } if (R > mid) { ans += update(rson, L, R,f); } push_up(rt); return ans; } int bin_serch(int x, int num) {//二分查找从x位置开始第num个空位的位置 int l = x, r = n,ans=0; while (l <= r) { int mid = (l + r) >> 1; if (qurrry(1, 1, n, x, mid) >= num) { ans = mid;//x-mid中是满足num个数的,更新ans r = mid - 1; } else { l = mid + 1; } } return ans; } int main() { //freopen("test.txt", "r", stdin); int t; scanf("%d", &t); while (t--) { scanf("%d%d", &n, &m); build(1, 1, n); int cmd, a, b; while (m--) { scanf("%d", &cmd); if (cmd == 1) { int a, k; scanf("%d%d", &a, &k); a++; int cnt = qurrry(1, 1, n, a, n); if (cnt==0) { printf("Can not put any one.\n"); continue; } int lpos = bin_serch(a, 1); int rpos = bin_serch(a, min(cnt, k)); update(1, 1, n, lpos, rpos, 0); printf("%d %d\n", lpos-1, rpos-1); } else { int a, b; scanf("%d%d", &a, &b); printf("%d\n", update(1, 1, n, a+1, b+1, 1)); } } printf("\n"); } return 0; }
hdu4614Vases and Flowers(线段树+二分)
原文:https://www.cnblogs.com/MYMYACMer/p/14586066.html