【学习笔记】HDU 6317 Segment

news/2024/10/28 0:21:51/

要是一眼看出来就不用写博客了

感觉可以用简单的容斥得到答案。即考虑每个区间对答案的贡献。这是唯一可行的路径

但是这题难就难在不能一眼看出式子。不妨先考虑较为简单的情形,如果最终线段树上存在节点 [ L , r ] [L,r] [L,r],那么概率为 1 r − L + 1 \frac{1}{r-L+1} rL+11,这是非常容易看出来的。如果存在节点 [ l , r ] [l,r] [l,r]呢?条件概率嘛,两端点应该比中间的点先被选上,概率是 2 ( r − l + 2 ) ( r − l + 1 ) \frac{2}{(r-l+2)(r-l+1)} (rl+2)(rl+1)2

然后就容斥呗。考虑区间 [ l , r ] [l,r] [l,r]对答案的贡献。那么 [ l , r ] [l,r] [l,r]有贡献的条件是, [ l , r ] ∩ [ q l , q r ] ≠ ∅ [l,r]\cap [ql,qr]\ne \empty [l,r][ql,qr]=,并且其父节点 [ l ′ , r ′ ] ⊈ [ q l , q r ] [l',r']\nsubseteq [ql,qr] [l,r][ql,qr],很显然这两个部分是独立的,因此第二种情况只需减去 [ l ′ , r ′ ] ⊆ [ q l , q r ] [l',r']\subseteq [ql,qr] [l,r][ql,qr]时子结点的数目,显然用 [ l ′ , r ′ ] [l',r'] [l,r]出现的概率乘 2 2 2即可完成计算。第一种情况也很好处理,简单容斥一下就完了。

加了快读都过不了,你 h d u hdu hdu的题还是那么恶心。

#include<bits/stdc++.h>
#define getchar() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?EOF:*S++)
#define ll long long
#define fi first
#define se second
using namespace std;
const int mod=998244353;
const int N=1e6+5;
int n,Q,ql,qr;
ll res,f[N],sumf[N],inv[N],suminv[N];
char B[1<<15],*S=B,*T=B;
inline int read()
{char c(getchar());int x(0);while(!isdigit(c))c=getchar();while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();return x;
}
void write(ll a)
{if(a>9)write(a/10);putchar(a%10+48);
}
ll getsum(int l,int r){if(l>r)return 0;return suminv[r]-suminv[l-1];
}
ll solve(int l,int r){if(l>r)return 0;int len=r-l+1;return sumf[len];
}
ll solve2(int l,int r){if(l>r)return 0;return r-l+1;
}
void add(ll &x,ll y){x=(x+y)%mod;
}
int main(){n=read(),Q=read();inv[1]=suminv[1]=1;for(int i=2;i<=n+1;i++)inv[i]=(-inv[mod%i]*(mod/i)%mod+mod)%mod,suminv[i]=(suminv[i-1]+inv[i])%mod;for(int i=1;i<=n;i++)f[i]=(f[i-1]+2*inv[i]*inv[i+1])%mod;for(int i=1;i<=n;i++)sumf[i]=(sumf[i-1]+f[i])%mod;while(Q--){ql=read(),qr=read();res=0;if(ql==1&&qr==n){printf("1\n");continue;}add(res,getsum(ql,n-1)+getsum(n-qr+1,n-1)+solve(2,n-1)-solve(2,ql-1)-solve(qr+1,n-1));if(ql==1)add(res,-getsum(2,qr)*2);if(qr==n)add(res,-getsum(2,n-ql+1)*2);add(res,solve2(max(2,ql),min(qr,n-1))*2-solve(max(2,ql),min(qr,n-1))*2+1);write((res+mod)%mod);printf("\n");}
}

http://www.ppmy.cn/news/103865.html

相关文章

CSS入门学习笔记+案例【一】

目录 一、CSS 是什么 二、引入方式 2.2 行内样式表 2.3 外部样式 三、 代码风格 3.1 样式格式 3.2 样式大小写 3.3 空格规范 四、 选择器 4.1 选择器的功能 4.2 选择器的种类 复合选择器小结 看完这篇博客 你将 掌握 CSS 基本语法规范和代码书写风格 掌握 CSS 选择…

设计模式之美-实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?

领域驱动设计&#xff08;Domain Driven Design&#xff0c;简称DDD&#xff09;盛行之后&#xff0c;这种基于贫血模型的传统的开发模式就更加被人诟病。而基于充血模型的DDD开发模式越来越被人提倡。所以&#xff0c;我打算用两节课的时间&#xff0c;结合一个虚拟钱包系统的…

前端食堂技术周刊第 84 期:第 96 届 TC39 会议、Deno 五周年、JavaScript 安全最佳实践、2023 Node.js 性能现状

By Midjournery 美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;葡萄冰萃美式 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 第 96 届 TC39 会议Deno 五周年JavaScript 安全最佳…

在服务器间传输文件

标题scp&#xff08;secure copy&#xff09;安全拷贝 scp&#xff08;secure copy&#xff09;安全拷贝可以灵活的使用&#xff0c;能够在服务器间传输文件&#xff0c;语法如下&#xff1a; scp -r $pdir/$fname $user$host:$pdir/$fname 命令 递归 要拷贝的文件路径/名称 …

进程控制与进程调度 —— 时间片轮转调度算法(C++版)

目录 实验一 进程控制与进程调度 一、实验目的 二、实验内容 三、数据结构及符号说明 四、运行环境说明 五、代码段 六、 效果展示 实验一 进程控制与进程调度 备注&#xff1a;大二&#xff08;下&#xff09;操作系统实验一 一、实验目的 掌握进程状态的转变、…

电子科技大学编译原理复习笔记(五):词法分析

目录 前言 重点一览 词法分析概述 词法分析的功能 词法分析器的输出形式 词法分析器的结构 状态转换图 状态转换图的构造 词法分析器的设计 基本结构 内容 符号表 目的 组成 在词法分析中的作用 符号表的一般形式 常用的符号表结构 总结与补充 为何分离词法…

Linux— 网络编程套接字

目录 预备知识 认识端口号 理解源端口号和目的端口号 认识TCP协议 认识UDP协议 网络字节序 socket编程接口 socket 常见API sockaddr结构 sockaddr 结构​编辑 sockaddr_in 结构 in_addr结构 地址转换函数 简单的UDP网络程序 实现一个简单的英译汉的功能 简易的远程…

【Linux】信号的处理

信号篇终章 文章目录 前言一、信号的处理 1.可重入函数 2.volatile关键字 3.SIGCHLD信号总结 前言 在前两篇linux文章中我们详细的讲解了信号的产生和信号的保存&#xff0c;今天来到最后一个重点信号的处理&#xff0c;对于信号的处理我们会重新引入进程…