bzoj2161: 布娃娃

Description

小时候的雨荨非常听话,是父母眼中的好孩子。在学校是老师的左右手,同学的好榜样。后来她成为艾利斯顿第二

代考神,这和小时候培养的良好素质是分不开的。雨荨的妈妈也为有这么一个懂事的女儿感到高兴。一次期末考试

,雨荨不知道第多少次,再次考了全年级第一名。雨荨的妈妈看到女儿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的余数是多少。

Input

输入的第一行有一个整数n,代表布娃娃的个数。

输入的第二行有16个用空格隔开的整数

分别代表Padd,Pfirst,Pmod,Pprod,Cadd,Cfirst,Cmod,Cprod,Ladd,Lfirst,Lmod,Lprod,Radd,Rfirst,Rmod,Rprod。

16个参数均为1到100,000,000中的整数。

Output

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

Sample Input

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

Sample Output

4

题解:

  题意等价于求能覆盖某个点的所有区间中第K大的值,这个就可以用扫描线+splay去求

code:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 char ch; bool ok;
 8 void read(int &x){
 9     for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch==‘-‘) ok=1;
10     for (x=0;isdigit(ch);x=x*10+ch-‘0‘,ch=getchar());
11     if (ok) x=-x;
12 }
13 const int maxn=100005;
14 const int inf=0x3f3f3f3f;
15 const int MOD=19921228;
16 int add,first,mod,prod,tmp[4][maxn];
17 int n,idx,ans;
18 struct Data{
19     int x,id,op;
20 }list[maxn*3];
21 bool operator<(const Data &a,const Data &b){
22     if (a.x!=b.x) return a.x<b.x;
23     return a.op<b.op;
24 }
25 struct Splay{
26     #define ls son[x][0]
27     #define rs son[x][1]
28     int root,fa[maxn],son[maxn][2],siz[maxn],val[maxn];
29     void init(){
30         root=n+1,siz[n+1]=2,val[n+1]=inf,son[n+1][1]=n+2;
31         siz[n+2]=1,val[n+2]=-inf,fa[n+2]=n+1;
32     }
33     int which(int x){return son[fa[x]][1]==x;}
34     void updata(int x){siz[x]=siz[ls]+1+siz[rs];}
35     void rotate(int x){
36         int y=fa[x],z=fa[y],d=which(x),dd=which(y);
37         fa[son[x][d^1]]=y,son[y][d]=son[x][d^1],fa[x]=z;
38         if (z) son[z][dd]=x;
39         son[x][d^1]=y,fa[y]=x,updata(y);
40     }
41     void splay(int x){
42         while (fa[x]){
43             if (!fa[fa[x]]) rotate(x);
44             else if (which(fa[x])==which(x)) rotate(fa[x]),rotate(x);
45             else rotate(x),rotate(x);
46         }
47         updata(x),root=x;
48     }
49     void insert(int x,int v){
50         fa[x]=son[x][0]=son[x][1]=0,siz[x]=1,val[x]=v;
51         int f,t;
52         for (f=t=root;t;f=t,t=son[t][v<val[t]]);
53         fa[x]=f,son[f][v<val[f]]=x,splay(x);
54     }
55     int find_left(int x){for (;son[x][0];x=son[x][0]);return x;}
56     void _delete(int x){
57         splay(x);
58         int y=find_left(son[x][1]);
59         fa[ls]=fa[rs]=0,splay(y),fa[ls]=y,son[y][0]=ls,updata(y);
60     }
61     int find_kth(int x,int k){
62         if (!x) return 0;
63         if (siz[ls]>=k) return find_kth(ls,k);
64         if (siz[ls]+1==k) return x;
65         return find_kth(rs,k-siz[ls]-1);
66     }
67     int query(int k){
68         int x=find_kth(root,k+1);
69         if (1<=x&&x<=n) return val[x];
70         return 0;
71     }
72 }T;
73 int main(){
74     read(n);
75     for (int op=0;op<4;op++){
76         read(add),read(first),read(mod),read(prod);
77         tmp[op][1]=first%mod;
78         for (int i=2;i<=n;i++) tmp[op][i]=(1LL*tmp[op][i-1]*prod+add+i)%mod;
79     }
80     for (int i=1;i<=n;i++) if (tmp[2][i]>tmp[3][i]) swap(tmp[2][i],tmp[3][i]);
81     for (int i=1;i<=n;i++) list[++idx]=(Data){tmp[2][i],i,0};
82     for (int i=1;i<=n;i++) list[++idx]=(Data){tmp[0][i],i,1};
83     for (int i=1;i<=n;i++) list[++idx]=(Data){tmp[3][i],i,2};
84     sort(list+1,list+idx+1),T.init();
85     for (int i=1;i<=idx;i++){
86         int id=list[i].id,op=list[i].op;
87         if (op==0) T.insert(id,tmp[1][id]);
88         else if (op==1) ans+=T.query(id),ans%=MOD;
89         else if (op==2) T._delete(id);
90     }
91     printf("%d\n",ans);
92     return 0;
93 }
时间: 2025-01-02 15:03:04

bzoj2161: 布娃娃的相关文章

整体二分浅谈

整体二分浅谈 一.前置知识 在学习整体二分之前,要学会二分,以及二分的分治思想. 二.整体二分浅谈及例题 例题:bzoj2527: [Poi2011]Meteors 对于这道题是整体二分的经典例题,我们先抛开整体二分,思考二分怎么做.对于一个询问,因为答案有单调性,如果$x$时刻为最小可以时刻,则比$x$小的时刻都不可以,比$x$大的时刻都可以,所以我们可以进行二分答案,并加以验证.先不说怎样验证,就单是时间复杂度就不能接受,$O(nmlog_2^n)$. 如果一个一个进行二分时间复杂度不允许,

【bzoj2161】布娃娃 权值线段树

题目描述 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二代考神,这和小时候培养的良好素质是分不开的.雨荨的妈妈也为有这么一个懂事的女儿感到高兴.一次期末考试,雨荨不知道第多少次,再次考了全年级第一名.雨荨的妈妈看到女儿100分的成绩单时,脸上又泛起了幸福的笑容,作为奖励,她给雨荨买了n个布娃娃.细心的雨荨发现,第i个布娃娃有一个耐心值P[i]以及一个魅力值C[i],并且还有能够忍受的耐心值的上限R[i]以及下限L[i].当一个布娃娃j满足L[

两分钟学会Unity3D布娃娃的使用

在RPG游戏中,为了让人物的死亡更加真实,unity创建布娃娃系统,搞的跟真的一样,尼玛我差点就相信那是真的了. 1.首先打开unity,创建地形,导入已经准备好的人物模块. 2.project下选中该模型,再为该模型添加布娃娃属性:GameObject->Create Other->RagDoll 3.在弹出的框中将布娃娃的各个结点设置进去 4.一定要去掉该人物的Box Collider属性,运行程序,就可以看到人物的死亡效果啦. 两分钟学会Unity3D布娃娃的使用,布布扣,bubuko.

Unity3d 布娃娃系统

选中带骨骼的3d模型 GameObject->Create Other->Ragdoll... 点开发现弹出了一个Create Ragdoll的窗体 前面的基础transform把骨骼拖进去就可以 root 脖子 right Hips(右屁股)用右大腿根即可 right knee 右小腿 right foot 右脚 right arm右大臂根部 right elbow 右小臂 left就是right的左側 middle spine 胯骨 head 头部 strength 强度 total ma

Chapter 3 Phenomenon&mdash;&mdash;6

A low oath made me aware that someone was with me, and the voice was impossible not to recognize. 某人低声的咒骂让我醒了过来,这个声音我是不可能辨认不出的. 一声低咒让我意识到有人和我在一起,而这个声音,我绝对不会认错. Two long, white hands shot out protective lyin front of me, and the van shuddered to a sto

【CSS】使用盒模型

盒子是CSS中的基础概念,我们需要使用它来配置元素的外观以及文档的整体布局. 1. 为元素应用内边距 应用内边距会在元素内容和边距之间添加空白.我们可以为内容盒的每个边界单独设置内边距,或者使用 padding 简写属性在一条声明中设置所有的值. 如果使用百分数值指定内边距,百分数总是根包含块的宽度相关,高度不考虑在内.下面代码展示了如何为元素应用内边距. <!DOCTYPE html> <html lang="en"> <head> <met

【CSS】使用边框和背景

1. 应用边框样式 先从控制边框样式的属性开始.简单边框有三个关键属性:border-width.border-style 和 border-color . <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Example</title> <style type="text/css"

【温故而知新-Javascript】使用 Document 对象

Document 对象时通往DOM功能的入口,它向你提供了当前文档的信息,以及一组可供探索.导航.搜索或操作结构与内容的功能. 我们通过全局变量document访问Document对象,它是浏览器为我们创建的关键对象之一.Document对象提供了文档的整体信息,并让你能够访问模型里的各个对象.简单示例如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>

【温故而知新-Javascript】理解 DOM

DOM(Document Object Model,文档对象模型)允许我们用 JavaScript 来探查和操作 HTML 文档里的内容.它对于创建丰富性内容而言是必不可少的一组功能. 1. 理解文档对象模型 DOM 是一组对象的集合,这些对象代表了HTML文档里的各个元素.顾名思义,DOM就像一个模型,它由代表文档的众多对象组成. 先来个简单的HTML文档的例子: <!DOCTYPE html> <html> <head> <meta name="au