[BZOJ2161]布娃娃(扫描线+线段树)

原创 2016年05月30日 21:51:49

题意:若干个点,对每个点求能覆盖住它的线段的权值的第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].rch
struct 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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

BZOJ 4059 Cerc2012 Non-boring sequences 线段树+扫描线

题目大意:定义一个序列为【不无聊的】当且仅当这个序列的任意一个区间都存在一个数只出现过一次,给定一个序列,要求判断这个序列是否是【不无聊的】 定义lastilast_i表示第ii个元素上一次出现的位...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年06月05日 18:28
  • 1223

【BZOJ2584】memory,扫描线+拓扑图+骗

!
  • xym_CSDN
  • xym_CSDN
  • 2016年10月16日 16:16
  • 491

[BZOJ 2731][HNOI 2012]三角形覆盖问题(计算几何+扫描线暴力)

题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=2731思路裸的三角形求面积并问题,计算几何问题中这类求面积并的问题的通法就是对事件点做扫描线,...
  • qpswwww
  • qpswwww
  • 2015年03月10日 19:22
  • 1083

jzoj4996&&bzoj4561 关于扫描线

最近好忙啊……导致说好的KOI题解没写+弹弹堂那篇文章没写完……这些估计要回家才能补了…… 昨天一场纪中的测试赛,1h拿了大众分,剩下3h弃疗……= = 其实大概是被题目恶心到了……好端端的题目偏...
  • orzGEOTCBRL
  • orzGEOTCBRL
  • 2017年03月02日 22:37
  • 316

hdu 1542 矩形面积并(扫描线+线段树)

【题目链接】 http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=14795 【解题报告】 七月的时候做过扫描线线段树,那个时...
  • gungnir0711
  • gungnir0711
  • 2015年12月16日 07:46
  • 463

BZOJ 1818 线段树+扫描线

思路: 可以把题目转化成 给你一些沿坐标轴方向的线段 让你求交点个数 然后就线段树+扫描线 搞一搞 (线段不包含断点 最后+n 这种方式 比线段包含断点+各种特判要好写得多)//By Si...
  • qq_31785871
  • qq_31785871
  • 2017年02月01日 10:46
  • 402

【BZOJ】【P2584】【Wc2012】【memory】【题解】【线段树+扫描线+拓扑排序】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2584 首先考虑第二问 显然只向一个方向移动一定有解 假设向上 显然构成了一个DAG图,...
  • u012732945
  • u012732945
  • 2014年12月26日 07:17
  • 1296

【BZOJ2758】Blinker的噩梦,扫描线+splay+链剖

.
  • xym_CSDN
  • xym_CSDN
  • 2016年10月19日 14:33
  • 363

BZOJ 1845 [Cqoi2005] 三角形面积并 计算几何扫描线

BZOJ 1845 [Cqoi2005] 三角形面积并 计算几何扫描线
  • wzq_QwQ
  • wzq_QwQ
  • 2015年09月08日 12:44
  • 1257

hdu 1542 扫描线+线段树求矩阵面积并

这几天想啃啃树,无意中找到了这个题,一方面练习一下线段树,另一方面学习一下离散化和扫描线的技巧。       首先,离散化是必要的,因为x,y       显然,离散化的数据不会有重复,这里要介绍...
  • EzCUfST
  • EzCUfST
  • 2015年08月01日 19:54
  • 873
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[BZOJ2161]布娃娃(扫描线+线段树)
举报原因:
原因补充:

(最多只允许输入30个字)