CCPC 2023 北京市赛 G.【模板】线段树(线段树区间合并20次多项式)

2024-01-16 07:36

本文主要是介绍CCPC 2023 北京市赛 G.【模板】线段树(线段树区间合并20次多项式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

思路来源

lyw

题解

洛谷高仿题目P4247

(ai+x)(ai+x)(ai+x)注意到当x有超过20项时,20个2相乘,对2的20次方取模就为0

所以,维护0次项到19次项乘积的和,向上合并时,是两个多项式卷积,这里暴力相乘即可

下推标记,当下放一个区间加x的标记时,a_{i}+=a_{j}*x^{j-i}*C_{j}^{j-i},其中,i<j<20

复杂度O(nlogn*20*20),比较卡常

经典卡常技巧:将取模改成unsigned int自然溢出即可

代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef unsigned int ui;
typedef double db;
typedef pair<ll,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define scll(a) scanf("%lld",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=2e5+10,M=25,mod=(1<<20)-1;
int n,q;
ui b[N],C[M][M];
void add(ui &x,ui y){x+=y;
}
struct node{int l,r;ui c,p,a[21];node(){memset(a,0,sizeof a);c=0;}
}e[N*4];
struct segment{int n;#define l(x) e[x].l#define r(x) e[x].r#define c(x) e[x].cnode mer2(node &x,node &y){int ls=x.r-x.l+1,rs=y.r-y.l+1;node z;int w=min(ls+rs,20);z.a[w]=1;z.l=x.l,z.r=y.r;rep(i,0,ls){rep(j,0,rs){if(i+j>=w)break;ui v=x.a[i]*y.a[j];add(z.a[i+j],v);}}return z;}void up(int p){e[p]=mer2(e[p<<1],e[p<<1|1]);}void psd2(node &x,ui v){int len=x.r-x.l+1,sz=min(20,len);vector<ui>pw(sz+1,1);rep(i,1,sz)pw[i]=pw[i-1]*v;rep(i,0,sz-1){rep(j,i+1,sz){ui v=x.a[j]*pw[j-i]*C[j][j-i];add(x.a[i],v);}}}void psd(int p){if(c(p)){psd2(e[p<<1],c(p));add(c(p<<1),c(p));psd2(e[p<<1|1],c(p));add(c(p<<1|1),c(p));c(p)=0;}}void bld(int p,int l,int r){l(p)=l,r(p)=r,c(p)=0;if(l==r){e[p].a[0]=b[l];e[p].a[1]=1;return;}int mid=(l+r)/2;bld(p<<1,l,mid);bld(p<<1|1,mid+1,r);up(p);}void init(int _n){n=_n;bld(1,1,n);}void upd(int p,int ql,int qr,ui x){if(ql<=l(p) && r(p)<=qr){psd2(e[p],x);add(c(p),x);return;}psd(p);int mid=(l(p)+r(p))/2;if(ql<=mid)upd(p<<1,ql,qr,x);if(qr>mid)upd(p<<1|1,ql,qr,x);up(p);}node ask(int p,int ql,int qr){if(ql<=l(p) && r(p)<=qr){return e[p];}psd(p);int mid=(l(p)+r(p))/2;if(ql<=mid && qr>mid){node L=ask(p<<1,ql,qr);node R=ask(p<<1|1,ql,qr);node res=mer2(L,R);return res;	}else if(ql<=mid){node L=ask(p<<1,ql,qr);return L;}else{node R=ask(p<<1|1,ql,qr);return R;}}
}seg;
void init(){C[0][0]=1;int up=21;rep(i,1,up){C[i][0]=C[i][i]=1;rep(j,1,i-1){C[i][j]=(C[i-1][j]+C[i-1][j-1]);}}
}
int op,l,r;
ui x;
int main(){init();sci(n),sci(q);rep(i,1,n)scanf("%u",&b[i]);seg.init(n);rep(i,1,q){scanf("%d%d%d",&op,&l,&r);if(op==1){scanf("%u",&x);seg.upd(1,l,r,x);}else{printf("%u\n",seg.ask(1,l,r).a[0]&mod);}}return 0;
}

这篇关于CCPC 2023 北京市赛 G.【模板】线段树(线段树区间合并20次多项式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/611770

相关文章

C++的模板(八):子系统

平常所见的大部分模板代码,模板所传的参数类型,到了模板里面,或实例化为对象,或嵌入模板内部结构中,或在模板内又派生了子类。不管怎样,最终他们在模板内,直接或间接,都实例化成对象了。 但这不是唯一的用法。试想一下。如果在模板内限制调用参数类型的构造函数会发生什么?参数类的对象在模板内无法构造。他们只能从模板的成员函数传入。模板不保存这些对象或者只保存他们的指针。因为构造函数被分离,这些指针在模板外

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

据阿谱尔APO Research调研显示,2023年全球髓内钉市场销售额约为4.7亿美元

根据阿谱尔 (APO Research)的统计及预测,2023年全球髓内钉市场销售额约为4.7亿美元,预计在2024-2030年预测期内将以超过3.82%的CAGR(年复合增长率)增长。 髓内钉市场是指涉及髓内钉制造、分销和销售的行业。髓内钉是一种用于整形外科手术的医疗器械,用于稳定长骨骨折,特别是股骨、胫骨和肱骨。髓内钉通常由不銹钢或钛等材料制成,并插入骨的髓管中,以在愈合过程中提供结构支

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共

PAT-1039 到底买不买(20)(字符串的使用)

题目描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以

C++标准模板库STL介绍

STL的六大组成部分 STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,提供了丰富的通用数据结构和算法,使得 C++ 编程变得更加高效和方便。STL 包括了 6 大类组件,分别是算法(Algorithm)、容器(Container)、空间分配器(Allocator)、迭代器(Iterator)、函数对象(Functor)、适配器(Adapter)

HTML5文旅文化旅游网站模板源码

文章目录 1.设计来源文旅宣传1.1 登录界面演示1.2 注册界面演示1.3 首页界面演示1.4 文旅之行界面演示1.5 文旅之行文章内容界面演示1.6 关于我们界面演示1.7 文旅博客界面演示1.8 文旅博客文章内容界面演示1.9 联系我们界面演示 2.效果和源码2.1 动态效果2.2 源代码2.3 源码目录 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh

静态文件及模板

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501 1  静态文件 动态Web应用也会需要静态文件,通常是CSS和JavaScript文件。Flask可以向已经配置好的Web服务器提供静态文件,只要在包或模块所在的目录中创建一个名为s

HTML(20)——定位

定位 作用:灵活的改变盒子在网页中的位置 实现: 定位模式:position边偏移:设置盒子的位置 leftrighttopbottom 相对定位 position:relative 改变位置的参照物是自己原来的位置,并且不脱标占位,标签显示模式特点不变 绝对定位 position:absolute 使用场景:子级绝对定位,父级相对定位  脱标不占位参照物:先找最近的已经

周末设计高端企业_集团官网主题Discuz模板

风格名称: 周末设计_高端企业_集团官网 适用版本: Discuz! X3.0、X3.1、X3.2、X3.3、F1.0 风格编码: 使用语言包结构,适合全部编码 周末设计高端企业_集团官网主题Discuz模板