题目来源:noi2019模拟测试赛(一)

题意:

题解:

这场三道神仙概率期望题……orzzzy

这题暴力$O(n^2)$有30分,但貌似比正解更难想……(其实正解挺好想的)

注意到一次操作实际上就是在一段区间里乘上了一个形如$px+(1-p)$的多项式,设把所有多项式合并得到一个多项式$F(x)$,那么我们要求的答案实际上就是:

$$[x^k]F(x)$$

那么可以先离散化坐标,然后开一棵线段树,用vector维护每个点(即最小不可再分的区间)上要乘的多项式,最后dfs一遍线段树,用分治NTT合并每个点自身的多项式,再合并子树的多项式即可。

时间复杂度$O(nlog^3n)$

口胡起来很简单但是写起来很恶心……

代码:

NTT写的挫,人傻自带大常数,跑了4.3s

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
#define mod 998244353
#define G 3
using namespace std;
typedef long long ll;
typedef double db;
struct task{
int l,r,p;
}t[];
struct node{
int l,r;
}tr[];
int n,k,cnt=,tn=,nw[],tmp[],lsh[],ans[][];
vector<int>v[];
namespace Poly{
namespace NTT{
int bit,bitnum,rev[],W[][];
int fastpow(int x,int y){
int ret=;
for(;y;y>>=,x=(ll)x*x%mod){
if(y&)ret=(ll)ret*x%mod;
}
return ret;
}
void pre(){
int rG=fastpow(G,mod-);
for(int i=;i<=;i++){
W[<<i][]=fastpow(G,(mod-)/(<<i));
W[<<i][]=fastpow(rG,(mod-)/(<<i));
}
}
void getr(int l){
for(bit=,bitnum=;bit<l;bit<<=,bitnum++);
for(int i=;i<bit;i++){
rev[i]=(rev[i>>]>>)|((i&)<<(bitnum-));
}
}
void ntt(int *s,int op){
for(int i=;i<bit;i++){
if(i<rev[i])swap(s[i],s[rev[i]]);
}
for(int i=;i<bit;i<<=){
int w=W[i<<][op==-];
for(int p=i<<,j=;j<bit;j+=p){
int wk=;
for(int k=j;k<i+j;k++,wk=(ll)wk*w%mod){
int x=s[k],y=(ll)s[k+i]*wk%mod;
s[k]=(x+y)%mod;
s[k+i]=(x-y+mod)%mod;
}
}
}
if(op==-){
int rb=fastpow(bit,mod-);
for(int i=;i<bit;i++){
s[i]=(ll)s[i]*rb%mod;
}
}
}
}
int A[],B[];
void getmul(int *s,int *a,int *b,int len1,int len2){
for(int i=;i<=len1;i++)A[i]=a[i];
for(int i=;i<=len2;i++)B[i]=b[i];
NTT::getr((len1+len2)*);
for(int i=len1+;i<NTT::bit;i++)A[i]=;
for(int i=len2+;i<NTT::bit;i++)B[i]=;
NTT::ntt(A,);
NTT::ntt(B,);
for(int i=;i<NTT::bit;i++){
s[i]=(ll)A[i]*B[i]%mod;
}
NTT::ntt(s,-);
}
void mul(int l,int r,int nw,int *s){
if(l==r){
s[]=(mod-v[nw][l]+);
s[]=v[nw][l];
return;
}
int mid=(l+r)/;
mul(l,mid,nw,s);
mul(mid+,r,nw,s+mid-l+);
getmul(s,s,s+mid-l+,mid-l+,r-mid);
}
}
void updata(int l,int r,int u,int L,int R,int p){
if(L<=tr[l].l&&tr[r].r<=R){
v[u].push_back(p);
return;
}
int mid=(l+r)/;
if(L<=tr[mid].r)updata(l,mid,u*,L,R,p);
if(tr[mid+].l<=R)updata(mid+,r,u*+,L,R,p);
}
int dfs(int l,int r,int u,int x){
int mid=(l+r)/,L,R,mx;
if(l<r){
L=dfs(l,mid,u*,x);
R=dfs(mid+,r,u*+,x+);
mx=max(L,R);
}
if(v[u].size()){
Poly::mul(,v[u].size()-,u,tmp);
}else tmp[]=;
if(l==r){
nw[]=(tr[l].r-tr[l].l+);
Poly::getmul(ans[x],nw,tmp,,v[u].size());
return v[u].size();
}
for(int i=L+;i<=mx;i++)ans[x][i]=;
for(int i=R+;i<=mx;i++)ans[x+][i]=;
for(int i=;i<=mx;i++){
ans[x][i]=(ans[x][i]+ans[x+][i])%mod;
}
Poly::getmul(ans[x],ans[x],tmp,mx,v[u].size());
return v[u].size()+mx;
}
int main(){
scanf("%d",&n);
Poly::NTT::pre();
for(int i=;i<=n;i++){
scanf("%d%d%d",&t[i].l,&t[i].r,&t[i].p);
lsh[++cnt]=t[i].l;
lsh[++cnt]=t[i].r+;
}
scanf("%d",&k);
lsh[++cnt]=;
lsh[++cnt]=;
sort(lsh+,lsh+cnt+);
cnt=unique(lsh+,lsh+cnt+)-lsh-;
for(int i=;i<=cnt;i++){
tr[++tn].l=lsh[i-];
tr[tn].r=lsh[i]-;
}
for(int i=;i<=n;i++){
updata(,tn,,t[i].l,t[i].r,t[i].p);
}
dfs(,tn,,);
printf("%d",ans[][k]);
return ;
}

【XSY3306】alpha - 线段树+分治NTT的更多相关文章

  1. loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)

    题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...

  2. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  3. BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)

    BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...

  4. 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)

    LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...

  5. bzoj4025二分图(线段树分治 并查集)

    /* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...

  6. BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)

    Description Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connec ...

  7. 【luogu3733】【HAOI2017】 八纵八横 (线段树分治+线性基)

    Descroption 原题链接 给你一个\(n\)个点的图,有重边有自环保证连通,最开始有\(m\)条固定的边,要求你支持加边删边改边(均不涉及最初的\(m\)条边),每一次操作都求出图中经过\(1 ...

  8. 【Luogu3733】[HAOI2017]八纵八横(线性基,线段树分治)

    [Luogu3733][HAOI2017]八纵八横(线性基,线段树分治) 题面 洛谷 题解 看到求异或最大值显然就是线性基了,所以只需要把所有环给找出来丢进线性基里就行了. 然后线性基不资磁撤销?线段 ...

  9. 2019.02.26 bzoj4311: 向量(线段树分治+凸包)

    传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...

随机推荐

  1. C语言基础 (11) 结构体 ,共用体 枚举 typedef

    1 课堂回顾 作用域与生命周期 2 static 局部变量 2 打字游戏 3 内存分区代码分析 4 结构体基本操作 (复合类型[自定义类型 #include <stdio.h> #incl ...

  2. Django 连接MySQL 通过pymysql 库

    ython3 如何安装pymysql 库,在此不再做多的讲解,如果有想知道如何安装的朋友,请求参考下面的连接地址: 第一步:应用setting.py 文件设置mysql 数据库连接相关属性.   DA ...

  3. hive 自定义函数(udf)

    1.解压hive的压缩包 2.新建java项目,将hive压缩包里面lib文件夹的jar包导入新建的项目 3.编写java程序 package udfdemo; import org.apache.h ...

  4. 基于【SpringBoot】的微服务【Jenkins】自动化部署

    最近,也是抽空整理了一些在工作中积累的经验,通过博客记录下来分享给大家,希望能对大家有所帮助: 一.关于自动化部署 关于自动化部署的优点,我就不在这里赘述了:只要想想手工打包.上传.部署.重启的种种, ...

  5. knockout.validation.js 异步校验

    self.forDealPwd.extend({ required:{ params:true, message:'请输入验证码!' }, minLength:{ params:4, message: ...

  6. BA--步进电机工作原理

    步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动 ...

  7. Android安全攻防战,反编译与混淆技术全然解析(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/50451259 在上一篇文章其中,我们学习了Android程序反编译方面的知识,包括 ...

  8. dnscat使用——整体感觉这个工具不完善,失败率很高,传文件时候没有完整性校验,我自己测试时通过域名转发失败,可能是其特征过于明显导致

    git clone https://github.com/iagox86/nbtool make 然后就可以按照下面的官方说明进行操作了. 我的感受:整体感觉这个工具不完善,失败率很高,传文件时候没有 ...

  9. ES failed to notify ClusterStateListener java.lang.IllegalStateException: environment is not locked

    ES出现异常: failed to notify ClusterStateListenerjava.lang.IllegalStateException: environment is not loc ...

  10. Python学习历程之模块浅识

    # =============================操作系统模块=======================# import os# 待续# ======================= ...