[BZOJ2161]布娃娃(扫描线+线段树)
来源:互联网 发布:淘宝客免费建站教程 编辑:程序博客网 时间:2024/04/30 06:44
题意:若干个点,对每个点求能覆盖住它的线段的权值的第k大。
强制在线的题做多了,作死写了个主席树套平衡树,两个log常数炸了,只得了40分暴力分。
正解显然扫描线+线段树,把每个线段拆成起点和终点,代表插入和删除,线段树维护第k大权值就好了。。
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#define rep(i,a,b) for(int i=a;i<=b;++i)#define erp(i,a,b) for(int i=a;i>=b;--i)using namespace std;const int MAXN = 100005;const int mo = 19921228;int N;int P[MAXN], C[MAXN], L[MAXN], R[MAXN];int dat[MAXN], dn;void genarr(int*a){int add, first, mod, prod;scanf("%d%d%d%d", &add, &first, &mod, &prod);a[1] = first % mod;rep(i, 2, N) a[i] = (1ll*a[i-1]*prod+add+i)%mod;}struct doll {int t, c, tp, k; //tp=0:insert tp=1:delete tp=1:query.doll () {}doll (int q,int w,int e,int f) : t(q),c(w),tp(e),k(f){}bool operator < (const doll&b) const {if (t^b.t) return t < b.t;return tp < b.tp;}} q[MAXN*3];int qn;#define lch(a) tr[a].lch#define rch(a) tr[a].rchstruct Node {int lch, rch, cnt;} tr[MAXN*4];int ncnt, root;void ins(int&x, int v, int l=1, int r=dn){if (!x) x = ++ncnt;tr[x].cnt ++;if (l==r) return;int mid = (l+r)>>1;if (v<=mid) ins(lch(x), v, l, mid);else ins(rch(x), v, mid+1, r);}void del(int x, int v, int l=1, int r=dn){tr[x].cnt --;if (l==r) return;int mid = (l+r)>>1;if (v<=mid) del(lch(x), v, l, mid);else del(rch(x), v, mid+1, r);}int getkth(int x, int k, int l=1, int r=dn){if (l==r) return l;int mid = (l+r)>>1;if (tr[rch(x)].cnt>=k) return getkth(rch(x), k, mid+1, r);return getkth(lch(x), k-tr[rch(x)].cnt, l, mid);}int solve(){sort(q+1, q+qn+1);int ans = 0;rep(i, 1, qn){if (q[i].tp==0) ins(root, q[i].c);else if (q[i].tp==1) del(root, q[i].c);else if (tr[root].cnt >= q[i].k) (ans+=dat[getkth(root, q[i].k)]%mo) %= mo;}return ans;}int main(){//freopen("doll.in","r",stdin);//freopen("doll.out","w",stdout);scanf("%d", &N);genarr(P), genarr(C), genarr(L), genarr(R);rep(i, 1, N) dat[i] = C[i];sort(dat+1, dat+N+1);dn = unique(dat+1, dat+N+1)-dat-1;rep(i, 1, N) C[i] = lower_bound(dat+1, dat+dn+1, C[i])-dat;rep(i, 1, N){if (L[i]>R[i]) swap(L[i], R[i]);q[++qn] = doll(L[i], C[i], 0, 0);q[++qn] = doll(P[i], 0, 2, i);q[++qn] = doll(R[i]+1, C[i], 1, 0);}int ans = solve();printf("%d\n", ans);return 0;}
0 0
- [BZOJ2161]布娃娃(扫描线+线段树)
- bzoj2161 布娃娃
- [BZOJ3161]布娃娃(扫描线+线段树)
- bzoj 2161: 布娃娃 (扫描线+线段树)
- [扫描线 线段树] BZOJ 2161 布娃娃
- [BZOJ]2161: 布娃娃 权值线段树
- 线段树[扫描线]
- 线段树+扫描线
- 线段树 扫描线
- 线段树扫描线
- 线段树-扫描线
- hdu1542 Atlantis (线段树+扫描线)
- 线段树扫描线(好)poj2482
- hdu5091(扫描线+线段树)
- poj1511 Atlantis(线段树+扫描线)
- HDU-1542(线段树+扫描线)
- hdu1542(线段树+扫描线)
- HDU1542(线段树+扫描线)
- 反转二叉树
- filter拦截器的简单使用
- Hotspot的三种GC算法
- 图的深度优先搜索及拓扑排序
- 使用rdpproxy和rdpy对RDP进行中间人攻击的总结
- [BZOJ2161]布娃娃(扫描线+线段树)
- 二维码生成
- QQ 聊天机器人小薇发布!
- 强悍的 Linux —— 文件系统
- useful-ffmpeg-commands
- Dubbo与Zookeeper、SpringMVC整合和使用
- 202. Happy Number
- java- 分布式- 一致性哈希算法(1)
- Maven笔记