zoukankan      html  css  js  c++  java
  • 【bzoj2161】布娃娃 权值线段树

    题目描述

    小时候的雨荨非常听话,是父母眼中的好孩子。在学校是老师的左右手,同学的好榜样。后来她成为艾利斯顿第二代考神,这和小时候培养的良好素质是分不开的。雨荨的妈妈也为有这么一个懂事的女儿感到高兴。一次期末考试,雨荨不知道第多少次,再次考了全年级第一名。雨荨的妈妈看到女儿100分的成绩单时,脸上又泛起了幸福的笑容,作为奖励,她给雨荨买了n个布娃娃。细心的雨荨发现,第i个布娃娃有一个耐心值P[i]以及一个魅力值C[i],并且还有能够忍受的耐心值的上限R[i]以及下限L[i]。当一个布娃娃j满足L[j]<=P[i]并且P[i]<=R[j],那么布娃娃j喜欢布娃娃i。雨荨还发现,一个布娃娃有可能喜欢它自己。每个布娃娃心中都有一个谜团,具体来说就是:第i个布娃娃想知道喜欢它的布娃娃中,魅力值第i大的布娃娃的魅力值是多少,并且称这个布娃娃的谜团答案为这个魅力值的大小,如果不存在,那么这个布娃娃的谜团答案为0。鉴于雨荨的上司栋栋不让题目的数据过大,下面给出数据的生成方法:给出16个参数:
    Padd, Pfirst, Pmod, Pprod, Cadd, Cfirst, Cmod, Cprod, Ladd, Lfirst, Lmod, Lprod, Radd, Rfirst, Rmod, Rprod。
    ----------------------------------------------------------------------------------------
    P[1] = Pfirst % Pmod, P[i] = (P[i-1]   Pprod + Padd + i) % Pmod (i > 1)。
    ----------------------------------------------------------------------------------------
    对于C、L、R数组也有类似的得到方式, %代表取余运算。注意:L和R数组生成完之后,如果某个布娃娃的忍耐度上限小于下限,那么交换它的上限和下限。当然,雨荨也不会让你告诉她每个布娃娃的谜团答案,因为那样会使输出数据很大。所以雨荨希望你告诉她,所有布娃娃谜团答案的和除以19921228的余数是多少。

    输入

    输入的第一行有一个整数n,代表布娃娃的个数。
    输入的第二行有16个用空格隔开的整数
    分别代表Padd,Pfirst,Pmod,Pprod,Cadd,Cfirst,Cmod,Cprod,Ladd,Lfirst,Lmod,Lprod,Radd,Rfirst,Rmod,Rprod。
    16个参数均为1到100,000,000中的整数。

    输出

    输出一个整数,代表所有布娃娃谜团答案的和除以19921228的余数。

    样例输入

    3
    2 3 4 3 1 4 5 2 3 6 9 1 1 2 3 4

    样例输出

    4


    题目大意

    给你若干个区间,每个区间有一个权值。现在对于若干个点,求所有包含该点的区间中权值第k大的是多少。

    题解

    权值线段树

    由于询问不是强制在线的,因此可以把所有位置排序,然后扫一遍。

    对于每段区间,把它看成两个点:$l$位置加入,$r$位置删除。把每个区间的两个点和询问点以坐标为关键字放到一起排序,坐标相同的按照加入、询问、删除的顺序排序,然后从左向右扫一遍,扫到加入就把权值加入到权值线段树中;扫到询问就在权值线段树中查询第k大;扫到删除就在权值线段树中删除。

    时间复杂度$O(nlog n)$。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define N 100010
    #define lson l , mid , x << 1
    #define rson mid + 1 , r , x << 1 | 1
    using namespace std;
    typedef long long ll;
    struct data
    {
    	int p , org , id;
    	data(int p0 = 0 , int org0 = 0 , int id0 = 0) {p = p0 , org = org0 , id = id0;}
    	bool operator<(const data &a)const {return p == a.p ? org > a.org : p < a.p;}
    }a[N * 3];
    int P[N] , C[N] , L[N] , R[N] , v[N] , si[N << 2];
    void update(int p , int a , int l , int r , int x)
    {
    	si[x] += a;
    	if(l == r) return;
    	int mid = (l + r) >> 1;
    	if(p <= mid) update(p , a , lson);
    	else update(p , a , rson);
    }
    int query(int k , int l , int r , int x)
    {
    	if(l == r) return l;
    	int mid = (l + r) >> 1;
    	if(k <= si[x << 1 | 1]) return query(k , rson);
    	else return query(k - si[x << 1 | 1] , lson);
    }
    int main()
    {
    	int n , Padd , Pfirst , Pmod , Pprod , Cadd , Cfirst , Cmod , Cprod , Ladd , Lfirst , Lmod , Lprod , Radd , Rfirst , Rmod , Rprod , i , ans = 0;
    	scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d" , &n , &Padd , &Pfirst , &Pmod , &Pprod , &Cadd , &Cfirst , &Cmod , &Cprod , &Ladd , &Lfirst , &Lmod , &Lprod , &Radd , &Rfirst , &Rmod , &Rprod);
    	P[1] = Pfirst % Pmod;
    	for(i = 2 ; i <= n ; i ++ ) P[i] = ((ll)P[i - 1] * Pprod + Padd + i) % Pmod;
    	C[1] = Cfirst % Cmod;
    	for(i = 2 ; i <= n ; i ++ ) C[i] = ((ll)C[i - 1] * Cprod + Cadd + i) % Cmod;
    	L[1] = Lfirst % Lmod;
    	for(i = 2 ; i <= n ; i ++ ) L[i] = ((ll)L[i - 1] * Lprod + Ladd + i) % Lmod;
    	R[1] = Rfirst % Rmod;
    	for(i = 2 ; i <= n ; i ++ ) R[i] = ((ll)R[i - 1] * Rprod + Radd + i) % Rmod;
    	for(i = 1 ; i <= n ; i ++ )
    	{
    		if(L[i] > R[i]) swap(L[i] , R[i]);
    		a[i * 3 - 2] = data(L[i] , 1 , i);
    		a[i * 3 - 1] = data(R[i] , -1 , i);
    		a[i * 3] = data(P[i] , 0 , i);
    		v[i] = C[i];
    	}
    	sort(v + 1 , v + n + 1);
    	for(i = 1 ; i <= n ; i ++ ) C[i] = lower_bound(v + 1 , v + n + 1 , C[i]) - v;
    	sort(a + 1 , a + 3 * n + 1);
    	for(i = 1 ; i <= 3 * n ; i ++ )
    	{
    		if(a[i].org) update(C[a[i].id] , a[i].org , 1 , n , 1);
    		else if(si[1] >= a[i].id) ans = (ans + v[query(a[i].id , 1 , n , 1)]) % 19921228;
    	}
    	printf("%d
    " , ans);
    	return 0;
    }
    

     

  • 相关阅读:
    02树莓派刷入系统
    Debian stretch更换国内源
    C#-WebForm-点击网页中的按钮后跳转到其他页面是怎么实现的?
    C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构
    C#-WebForm-表单元素
    C#-WebForm-ASP开发练习:从数据库中动态添加信息
    C#-WebForm-WebForm开发基础
    C#-WinForm-TextBox中只能输入数字的几种常用方法(C#)
    C#-和时间有关的计算代码、时间相减 得到天数、小时、分钟、秒差
    C#-WinForm-用户控件如何获取父级窗体
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/7481859.html
Copyright © 2011-2022 走看看