wxy 3.10 牛客练习赛56 重现

v>

wxy 3.10 牛客练习赛56 重现 4841 B 考虑一条边,从左边过去和从右边过来经过的分别为两个子树的大小和人数乘积的和的两倍,想到有点 类似于换根DP和树形DP,但是LL要和lld相匹配要注意。 C 朴素做法是n^2*k的,考虑到转移的时候是前缀和,前缀和==区间和,想到树状数组,f [ q ] [ j ] ,到q这 个数长度为j的严格递增子序个数。首先预处理一下a数组,用a[i]是第几大的数代替a[i]本身,开10棵树 状数组,对每一个数cpy=bin[j-1].sum(a[i]-1)加到f[a[i]] [j]的值,现在的a[i]是第几大,那么在a[i]之前的 都是比他小的那么是可以转移的,并在之后bit[j].add(a[i],cpy)树状数组和f数组同步更新。 最后遍历一 遍f[i] [k]累加,即为以每个数结尾的长度为k的子序列的个数。f[a[i]] [k]会重复。 # include <bits/stdc++.h> using namespace std; const int MAXN=5e5+100; const int mod=998244353; int a[MAXN],b[MAXN],cpy[20],f[MAXN][20]; int lowbit(int x){ return x&(-x); } int n,k; struct Bit{ int c[MAXN]; void add(int x,int y) //x更新位置 y为更新后的数 { for(int i=x;i<=n;i+=lowbit(i)) c[i]=(c[i]+y)%mod; } int sum(int x) //1-x 求和 { int ans=0; for(int i=x;i;i-=lowbit(i)) ans=(ans+c[i])%mod; return ans; } }bit[20]; int main() { for (int i=0;i<=10;i++) memset(bit[i].c,0,sizeof(bit[i].c)); scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); b[i]=a[i]; } sort(b+1,b+n+1); int len=unique(b+1,b+n+1)-(b+1); for(int i=1;i<=n;i++){ a[i]=lower_bound(b+1,b+len+1,a[i])-b; }D 可以考虑枚举在那个点取到最小值,(预处理,开始覆盖每个区间左端点的那个点的是哪几个区间,到 那个位置区间右端点结束覆盖的是哪几个区间),用线段树维护区间最值,差即为答案的一个可能。查 到线段树的板子有点问题,又一遍深入理解了一下。 for(int i=1;i<=n;i++){ bit[1].add(a[i],1); for(int j=2;j<=k;j++){ cpy[j]=bit[j-1].sum(a[i]-1); f[a[i]][j]=(f[a[i]][j]+cpy[j])%mod; bit[j].add(a[i],cpy[j]); } } int ans=0; for(int i=1;i<=n;i++) ans=(ans+f[i][k])%mod; printf("%d\n",ans); return 0; } # include <bits/stdc++.h> using namespace std; typedef long long LL; const int MAXN=2e5+100; struct S_tree{ struct Node{ int l,r; LL maxx,minn,add_lazy; }a[MAXN<<2]; inline void Push_Up(int k) //向上更新 { if(a[k].l==a[k].r) return ; a[k].maxx=max(a[k<<1].maxx,a[k<<1|1].maxx); a[k].minn=min(a[k<<1].minn,a[k<<1|1].minn); } inline void Build(int k,int l,int r) //建树 { a[k].l=l; a[k].r=r; a[k].add_lazy=0; if(l==r){ //到达叶子节点 LL arr; scanf("%lld",&arr); a[k].maxx=a[k].minn=arr; return ; } int mid=(l+r)>>1; Build(k<<1,l,mid); Build(k<<1|1,mid+1,r); Push_Up(k); } inline void Push_Down(int k) //向下更新 { if(a[k].add_lazy) { a[k<<1].add_lazy+=a[k].add_lazy;a[k<<1|1].add_lazy+=a[k].add_lazy; a[k<<1].maxx+=a[k].add_lazy; a[k<<1|1].maxx+=a[k].add_lazy; a[k<<1].minn+=a[k].add_lazy; a[k<<1|1].minn+=a[k].add_lazy; a[k].add_lazy=0; } } inline void add_change(int k,int l,int r,LL val)//add { if(a[k].l==l&&a[k].r==r){ a[k].add_lazy+=val; a[k].maxx+=val; a[k].minn+=val; return ; } Push_Down(k); int mid=(a[k].l+a[k].r)>>1; if(r<=mid) add_change(k<<1,l,r,val); else if(l>mid) add_change(k<<1|1,l,r,val); else { add_change(k<<1,l,mid,val); add_change(k<<1|1,mid+1,r,val); } Push_Up(k); } inline LL max_q(int k,int l,int r) //max { if(a[k].l==l&&a[k].r==r) return a[k].maxx; Push_Down(k); int mid=(a[k].l+a[k].r)>>1; if(r<=mid) return max_q(k<<1,l,r); else if(l>mid) return max_q(k<<1|1,l,r); else return max(max_q(k<<1,l,mid),max_q(k<<1|1,mid+1,r)); } inline LL min_q(int k,int l,int r) //min { if(a[k].l==l&&a[k].r==r) return a[k].minn; Push_Down(k); int mid=(a[k].l+a[k].r)>>1; if(r<=mid) return min_q(k<<1,l,r); else if(l>mid) return min_q(k<<1|1,l,r); else return min(min_q(k<<1,l,mid),min_q(k<<1|1,mid+1,r)); } } S; int h[MAXN]; struct Ode{ int l,r; LL w; }node[MAXN]; int cmp(Ode a,Ode b) { if(a.l==b.l) return a.r<b.r; return a.l<b.l; } vector<int> L[MAXN],R[MAXN]; int main() {E 割边,求树的带权直径 F 马拉车,NTT int n,m; scanf("%d%d",&n,&m); S.Build(1,1,n); for(int i=1;i<=m;i++){ scanf("%d%d%lld",&node[i].l,&node[i].r,&node[i].w); } sort(node+1,node+m+1,cmp); for(int i=1;i<=m;i++){ L[node[i].l].push_back(i);//被l包含的是哪几个区间 R[node[i].r+1].push_back(i);//被r筛下的是哪几个区间 } LL ans=0; for(int i=1;i<=n;i++){ for(int j=0;j<L[i].size();j++){ S.add_change(1,node[L[i][j]].l,node[L[i][j]].r,-node[L[i][j]].w); } for(int j=0;j<R[i].size();j++){ S.add_change(1,node[R[i][j]].l,node[R[i][j]].r,node[R[i][j]].w); } LL Min,Max; Min=S.min_q(1,i,i); Max=S.max_q(1,1,n); //cout<<Max<<" "<<Min<<endl; ans=max(Max-Min,ans); } printf("%lld\n",ans); return 0; } /* 3 3 7 -2 -10 1 3 4 3 3 4 1 2 8 */

原文地址:https://www.cnblogs.com/fengzlj/p/15941277.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于nodejs...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs怎么实现目录不存在自动创建”文章能帮助大...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs如何实现定时删除文件”文章能帮助大家解决疑惑...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
本篇内容主要讲解“怎么安装Node.js的旧版本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎...
这篇“node中的Express框架怎么安装使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要介绍“nodejs如何实现搜索引擎”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs如何实现搜索引擎...
这篇文章主要介绍“nodejs中间层如何设置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs中间层如何设置”文...
这篇文章主要介绍“nodejs多线程怎么实现”,在日常操作中,相信很多人在nodejs多线程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
这篇文章主要讲解了“nodejs怎么分布式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs怎么分布式”...
本篇内容介绍了“nodejs字符串怎么转换为数组”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
这篇文章主要介绍了nodejs如何运行在php服务器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nodejs如何运行在php服务器文章都...
本篇内容主要讲解“nodejs单线程如何处理事件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“nodejs单线程如何...
这篇文章主要介绍“nodejs怎么安装ws模块”,在日常操作中,相信很多人在nodejs怎么安装ws模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
本篇内容介绍了“怎么打包nodejs代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!
本文小编为大家详细介绍“nodejs接收到的汉字乱码怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs接收到的汉字乱码怎么解决”文章能帮助大家解...
这篇“nodejs怎么同步删除文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇...
今天小编给大家分享一下nodejs怎么设置淘宝镜像的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希