礼物

题目大意

数据范围


题解

这题有意思啊($md$卡常

直接做怎么做?

随便上个什么东西,维护一下矩阵乘和插入,比如说常数还算小的$KD-Tree$(反正我是没见人过过

我们漏掉了一个条件,就是所有二元组都是随机的。

这个条件很好,它几乎就保证了,任选一个区间的话,优秀二元组只有$log$个。

这是为什么呢?

其实区间内,优秀二元组的个数,就相当于把区间按照$x$排序后,$y$值是前缀最大值的期望个数。

因为二元组是随机的,所以$x$排序后,$y$仍然是随机的。

就是给定一个随机数列,求前缀最大值的期望个数。

这是调和级数的。

所以,我们就开一棵线段树,线段树上每个节点维护一个数组,存这个节点管辖区间内的优秀二元组。

合并用归并,复杂度是$O(log)$的。

所以每次查询的复杂度是$O(log^2n)$的。

总复杂度是$O(nlog^2n)$的,有点小卡常,加了输出优化才过(读入优化是必备。

代码

#include <bits/stdc++.h>

#define ls p << 1

#define rs p << 1 | 1

#define N 200010 

using namespace std;

const int mod = 1000000007 ;

typedef long long ll;

char *p1, *p2, buf[100000];

#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )

int rd() {
int x = 0;
char c = nc();
while (c < 48) {
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x;
} char pbuf[100000],*pp=pbuf;
void push(const char c) {
if(pp-pbuf==100000) fwrite(pbuf,1,100000,stdout),pp=pbuf;
*pp++=c;
}
void write(int x) {
static int sta[35];
int top=0;
do{sta[top++]=x%10,x/=10;}while(x);
while(top) push(sta[--top]+'0');
push('\n');
} struct Node {
int x, y;
friend bool operator < (const Node &a, const Node &b) {
return a.x == b.x ? a.y < b.y : a.x < b.x;
}
}num[N]; Node q[60]; struct Mode {
Node v[30];
int len;
int sum;
Mode() { len = 0, sum = 1; }
}a[N << 2]; inline Mode operator + (const Mode &a, const Mode &b) {
Mode re;
int cnt = 0;
int j = 1;
for (int i = 1; i <= a.len; i ++ ) {
while ((j <= b.len) && (a.v[i] < b.v[j])) {
q[ ++ cnt] = b.v[j];
j ++ ;
}
q[ ++ cnt] = a.v[i];
}
while (j <= b.len) {
q[ ++ cnt] = b.v[j];
j ++ ;
}
// int i = 1, j = 1;
// while (i <= a.len && j <= b.len) {
// if (a.v[i] < b.v[j]) {
// q[ ++ cnt] = a.v[i];
// i ++ ;
// }
// else {
// q[ ++ cnt] = b.v[j];
// j ++ ;
// }
// }
// while (i <= a.len) {
// q[ ++ cnt] = a.v[i];
// i ++ ;
// }
// while (j <= b.len) {
// q[ ++ cnt] = b.v[j];
// j ++ ;
// }
// for (int i = 1; i <= a.len; i ++ ) {
// q[ ++ cnt] = a.v[i];
// }
// for (int i = 1; i <= b.len; i ++ ) {
// q[ ++ cnt] = b.v[i];
// }
// sort(q + 1, q + cnt + 1);
int mx = 0;
for (int i = 1; i <= cnt; i ++ ) {
if (q[i].y > mx) {
re.v[ ++ re.len] = q[i];
re.sum = (ll)re.sum * (q[i].x ^ q[i].y % mod) % mod;
mx = q[i].y;
}
}
// reverse(re.v + 1, re.v + re.len + 1);
return re;
} void build(int l, int r, int p) {
if (l == r) {
a[p].v[ ++ a[p].len] = num[l];
a[p].sum = (num[l].x ^ num[l].y) % mod;
return;
}
int mid = (l + r) >> 1;
build(l, mid, ls);
build(mid + 1, r, rs);
a[p] = a[ls] + a[rs];
} Mode query(int x, int y, int l, int r, int p) {
if (x <= l && r <= y) {
return a[p];
}
int mid = (l + r) >> 1;
if (mid < x)
return query(x, y, mid + 1, r, rs);
else if(y <= mid)
return query(x, y, l, mid, ls);
else
return query(x, y, l, mid, ls) + query(x, y, mid + 1, r, rs);
} int main() {
int n = rd();
for (int i = 1; i <= n; i ++ ) {
num[i].x = rd();
num[i].y = rd();
}
build(1, n, 1);
int q = rd();
while(q -- ) {
int x = rd(), y = rd();
Mode now = query(x, y, 1, n, 1);
write(now.sum);
}
fwrite(pbuf,1,pp-pbuf,stdout);
return 0;
}

小结:这种期望的题还是要自己证才行,不然结论根本记不过来。

[计蒜客T2238]礼物_线段树_归并排序_概率期望的更多相关文章

  1. 【原创】tyvj1038 忠诚 & 计蒜客 管家的忠诚 & 线段树(单点更新,区间查询)

    最简单的线段树之一,中文题目,不翻译.... 注释讲的比较少,这已经是最简单的线段树,如果看不懂真的说明最基础的理论没明白 推荐一篇文章http://www.cnblogs.com/liwenchi/ ...

  2. [计蒜客] 矿石采集【记搜、Tarjan缩点+期望Dp】

    Online Judge:计蒜客信息学3月提高组模拟赛 Label:记搜,TarJan缩点,树状数组,期望Dp 题解 整个题目由毫无关联的两个问题组合成: part1 问题:对于每个询问的起点终点,求 ...

  3. 计蒜客 28315.Excellent Engineers-线段树(单点更新、区间最值) (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 E)

    先写这几道题,比赛的时候有事就只签了个到. 题目传送门 E. Excellent Engineers 传送门 这个题的意思就是如果一个人的r1,r2,r3中的某一个比已存在的人中的小,就把这个人添加到 ...

  4. 计蒜客 38228. Max answer-线段树维护单调栈(The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer 南昌邀请赛网络赛) 2019ICPC南昌邀请赛网络赛

    Max answer Alice has a magic array. She suggests that the value of a interval is equal to the sum of ...

  5. 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)

    query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...

  6. 计蒜客 Prefix Free Code(字典树+树状数组)

    Consider n initial strings of lower case letters, where no initial string is a prefix of any other i ...

  7. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  8. 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)

    ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...

  9. 计蒜客 A1607 UVALive 8512 [ACM-ICPC 2017 Asia Xi'an]XOR

    ICPC官网题面假的,要下载PDF,点了提交还找不到结果在哪看(我没找到),用VJ交还直接return 0;也能AC 计蒜客题面 这个好 Time limit 3000 ms OS Linux 题目来 ...

随机推荐

  1. WebUI自动化之Java语言讲解

    Java学习网站:  default是兜底逻辑,以上条件都不符合时,如何处理.  break是终止循环,continue是终止本次循环:

  2. PHP mysqli_fetch_field() 函数

    返回结果集中下一字段(列),然后输出每个字段名称.表格和最大长度: <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect ...

  3. BZOJ 4712 洪水 动态dp(LCT+矩阵乘法)

    把之前写的版本改了一下,这个版本的更好理解一些. 特地在一个链的最底端特判了一下. code: #include <bits/stdc++.h> #define N 200005 #def ...

  4. Educational Codeforces Round 13 D. Iterated Linear Function 逆元+公式+费马小定理

    D. Iterated Linear Function time limit per test 1 second memory limit per test 256 megabytes input s ...

  5. Casual Literary Notes

    写在前面的话: 人生中总会有一些惊喜,它会给予坚守的人们以奖励,提醒着人们,生命中不光是辛劳和付出. 很多收获,最后看来,往往都是因为当初的那一点坚持. -- 雷宇<现场> 1.18 上午 ...

  6. 计算(calc.cpp) 这题我搞了2晚上qwq

    终于会了!可喜可贺!可喜可贺!   计算(calc.cpp) [问题描述] 小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)” ...

  7. 【java设计模式】-04单例模式

    单例模式 定义: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 类型: 创建类模式 类图: 单例模式特点 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单 ...

  8. find命令计算代码行数

    [anonymous@localhost ~/lvs/ipvsadm- -regex '.*Makefile.*' -o -regex '.*\.[ch]' -exec cat {} \; | wc ...

  9. Asyncio之EventLoop笔记

    使用事件循环 Python3.4 采用了一个强大的框架来支持代码的并发执行: asyncio.这个框架使用事件循环来编排回调和异步任务. 事件循环位于事件循环策略的上下文中-这是 asyncio 所特 ...

  10. FileZilla 客户端连接vsftp无法访问 Received unexpected end-of-file from SFTP server 解决之路

    首先在win通过ftp连接centos过程中,出现了2个问题,现在对此记录一下,方便后人遇到问题进行查阅 1.由于加密协议不同,需要在ftp客户端设置一下,支持ssh模式,具体自行百度: 2.在设置完 ...