题目来源: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. NTP学习路线

    NTP了解路线 基础 ntp配置中的tinker参数? ntp的同步方式slew step的区别? restrict含义?restrict -6 default ignore含义? fudge 127 ...

  2. 【转】H5 input search 提交事件

    欲实现一个文字搜索的功能,要求输入时,键盘回车按钮提示显示为“搜索”.效果如下: 开始~ input type=text并不能达到这种效果,google了一下,HTML5 增加的type=search ...

  3. windows 查看端口号被占用

    1.netstat  -ano 2.tasklist | findstr xxx 3.进程管理杀掉

  4. Django安装部署

    MVC模式说明 Model:是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据 View: 是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的 Controlle ...

  5. asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值

    asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...

  6. servlet3.0理解

    1.servlet是用Java编写的服务器端程序,服务器端程序,服务器端程序. 2.Servlet运行于支持Java的应用服务器中.spring mvc有自己的实现servlet 从原理上讲,Serv ...

  7. DynaActionForm(动态ActionForm)的使用

    在struts中利用DynaActionForm(动态ActionForm)可以节省代码的编写. 1.在struts-config.xml中配置DynaActionForm:加入这个Form中有三个属 ...

  8. HDU 3507

    斜率DP入门题.推荐看看这篇http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 看过之后,自己思考,发现有些不妥之处就是,其 ...

  9. How to remove focus without setting focus to another control?

    How to remove focus without setting focus to another control? Ask Question up vote 67 down vote favo ...

  10. 【SDOI 2016】 排列计数

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4517 [算法] 有m个数在原来的位置上,说明有(n-m)个数不再原来的位置上 那么, ...