P5469 [NOI2019] 机器人(拉格朗日插值、区间dp)

解析

打表可得,有效状态大概只有 O(m)=O(nlog⁡n)O(m)=O(n\log n)O(m)=O(nlogn) 种。
枚举最靠右的最大值位置,不难得到 O(mV)O(mV)O(mV) 的做法。
期望得分 505050 分。

考虑如何做 l=0,r=109l=0,r=10^9l=0,r=109。,发现前缀和后所有的 dpi,i,x=xdp_{i,i,x}=xdpi,i,x=x,可以看成一个 111 次多项式。
归纳的,dpl,rdp_{l,r}dpl,r 转移的时候从 dpl,i−1∗dpi+1,rdp_{l,i-1}*dp_{i+1,r}dpl,i1dpi+1,r 得到,是一个 r−lr-lrl 次多项式,再前缀和后,又变成了 r−l+1r-l+1rl+1 次的多项式。
直接插值即可。

那么当值域不相同时,离散化后变成了 O(n)O(n)O(n) 段,对每段单独做时,小于当前段的影响就变成了常数,所以还是可以插值的。

每段复杂度 O(nm)O(nm)O(nm),故总复杂度 O(n2m)O(n^2m)O(n2m)
需要一定卡常。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("ok\n")inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
bool mem1;const int N=305;
const int S=2250;
const int mod=1e9+7;inline ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res;
}#define add(x,y)  ((((x)+=(y))>=mod)&&((x)-=mod))int n,m;int id[N][N],tot;
int dp[S][N],le[S],ri[S];
int a[N],b[N],q[N<<1],cnt;
void init(int l,int r){if(l>r){//dp[tot][0]=1;//jd[tot]=1;return;    }if(id[l][r]) return;  //printf("(%d %d)  id=%d\n",l,r,id[l][r]);for(int i=l;i<=r;i++){if(abs((i-l)-(r-i))<=2){init(l,i-1);init(i+1,r);}}id[l][r]=++tot;le[tot]=l;ri[tot]=r;return;
}
int now,p;
int jc[N],ni[N],pre[N],suf[N],pi[N];
#define calc(i) (1ll*w[i]*pi[i])
inline int lagrange(int *w,int l,int r,int x){int ans(0),ans1(0),ans2(0),ans3(0),ans4(0),ans5(0),ans6(0),ans7(0),ans8(0),i=1;for(;i+8<=r-l+1;i+=8){if((r-l+1-i)&1){add(ans1,mod-calc(i)%mod);add(ans3,mod-calc(i+2)%mod);add(ans5,mod-calc(i+4)%mod);add(ans7,mod-calc(i+6)%mod);ans2=(ans2+calc(i+1))%mod;ans4=(ans4+calc(i+3))%mod;ans6=(ans6+calc(i+5))%mod;ans8=(ans8+calc(i+7))%mod;}else{add(ans2,mod-calc(i+1)%mod);add(ans4,mod-calc(i+3)%mod);add(ans6,mod-calc(i+5)%mod);add(ans8,mod-calc(i+7)%mod);ans1=(ans1+calc(i))%mod;ans3=(ans3+calc(i+2))%mod;ans5=(ans5+calc(i+4))%mod;ans7=(ans7+calc(i+6))%mod;}}for(;i<=r-l+1;i++){//if((r-l+1-i)&1) add(ans1,mod-calc(i));//else add(ans1,calc(i));if((r-l+1-i)&1) add(ans,mod-calc(i)%mod);else ans=(ans+calc(i))%mod;}add(ans,ans1);add(ans,ans2);add(ans,ans3);add(ans,ans4);add(ans,ans5);add(ans,ans6);add(ans,ans7);add(ans,ans8);//for(int i=1;i<=r-l+1;i++) printf("    i=%d w=%lld\n",i,w[i]);//printf("  x=%d ans=%lld\n",x,ans);return ans;
}
void work(int len){now=min(len,n+1);for(int i=0;i<=now;i++) dp[0][i]=1;for(int x=1;x<=tot;x++){int l=le[x],r=ri[x];if((r-l+1)%2){for(int i=max(l,(l+r)/2-1);i<=min(r,(l+r)/2+1);i++){//solve(l,i-1);//solve(i+1,r);if(a[i]<=p&&p<b[i]){//printf("  i=%d\n",i);int j=1;for(;j+4<=now;j+=4){dp[x][j]=(dp[x][j]+1ll*dp[id[l][i-1]][j]*dp[id[i+1][r]][j-1])%mod;dp[x][j+1]=(dp[x][j+1]+1ll*dp[id[l][i-1]][j+1]*dp[id[i+1][r]][j+1-1])%mod;dp[x][j+2]=(dp[x][j+2]+1ll*dp[id[l][i-1]][j+2]*dp[id[i+1][r]][j+2-1])%mod;dp[x][j+3]=(dp[x][j+3]+1ll*dp[id[l][i-1]][j+3]*dp[id[i+1][r]][j+3-1])%mod;}for(;j<=now;j++){	  //add(dp[x][j],1ll*dp[id[l][i-1]][j]*dp[id[i+1][r]][j-1]%mod);dp[x][j]=(dp[x][j]+1ll*dp[id[l][i-1]][j]*dp[id[i+1][r]][j-1])%mod;}}}}else{for(int i=(l+r)/2;i<=(l+r)/2+1;i++){//solve(l,i-1);//solve(i+1,r);if(a[i]<=p&&p<b[i]){//printf("  i=%d\n",i);int j=1;for(;j+4<=now;j+=4){add(dp[x][j],1ll*dp[id[l][i-1]][j]*dp[id[i+1][r]][j-1]%mod);add(dp[x][j+1],1ll*dp[id[l][i-1]][j+1]*dp[id[i+1][r]][j+1-1]%mod);add(dp[x][j+2],1ll*dp[id[l][i-1]][j+2]*dp[id[i+1][r]][j+2-1]%mod);add(dp[x][j+3],1ll*dp[id[l][i-1]][j+3]*dp[id[i+1][r]][j+3-1]%mod);}for(;j<=now;j++){	  add(dp[x][j],1ll*dp[id[l][i-1]][j]*dp[id[i+1][r]][j-1]%mod);}}}}for(int i=1;i<=now;i++){add(dp[x][i],dp[x][i-1]);}}if(len>n+1){int x=q[p+1]-1,l=q[p],r=q[p]+now-1;pre[0]=1;for(int i=1;i<=r-l+1;i++) pre[i]=1ll*pre[i-1]*(x-(l+i-1))%mod;suf[r-l+1+1]=1;for(int i=r-l+1;i>=1;i--){suf[i]=1ll*suf[i+1]*(x-(l+i-1))%mod;pi[i]=1ll*pre[i-1]%mod*suf[i+1]%mod*ni[i-1]%mod*ni[r-l+1-(i)]%mod;}}for(int i=1;i<=tot;i++){if(len<=n+1) dp[i][0]=dp[i][now];else{      dp[i][0]=lagrange(dp[i],q[p],q[p]+now-1,q[p+1]-1);}//printf("  i=%d dp=%lld\n",i,dp[i][0]);//for(int j=1;j<=now;j++) dp[i][j]=0;memset(dp[i]+1,0,sizeof(int)*(now));}return;
}bool mem2;
signed main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifdebug("mem=%.2lf\n",abs(&mem2-&mem1)/1024./1024);n=read();jc[0]=1;for(int i=1;i<=n;i++) jc[i]=1ll*jc[i-1]*i%mod;ni[n]=ksm(jc[n],mod-2);for(int i=n-1;i>=0;i--) ni[i]=1ll*ni[i+1]*(i+1)%mod;for(int i=1;i<=n;i++){q[++cnt]=a[i]=read();q[++cnt]=b[i]=read()+1;    }sort(q+1,q+1+cnt);cnt=unique(q+1,q+1+cnt)-q-1;for(int i=1;i<=n;i++){a[i]=lower_bound(q+1,q+1+cnt,a[i])-q;b[i]=lower_bound(q+1,q+1+cnt,b[i])-q;}init(1,n);debug("tot=%d\n",tot);for(int i=1;i<cnt;i++){p=i;//printf("\np=%d [%d %d)\n",p,q[i],q[i+1]);work(q[i+1]-q[i]);}printf("%d\n",dp[id[1][n]][0]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Math(牛客多校第三场)

Math 题意&#xff1a; 问你有多少对(x,y),1<x<y<n,满足(x2 y2)%(xy1) 0 题解&#xff1a; 这种题。。。直接打表芜湖~ 通过打表发现&#xff1a;满足情况的为(i,i * i * i),但是也有不和谐的声音出现&#xff1a;当x8时&#xff0c;会出现两个&#xff0c;一个…

[NewLife.XCode]增删改查入门

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

P5472 [NOI2019] 斗主地(期望、数学)

前言 我咋连表都没打啊。 too vegetable。 解析 题目给出的洗牌形式看着并不好看&#xff0c;合理猜测可以发现&#xff0c;这其实就等价于所有可能情况等概率出现。 然后就不会了 打表可以发现&#xff1a;当 tp1 时&#xff0c;dp 数组是一个等差数列。当 tp2 时&#xff…

[HNOI2012]集合选数(思维构造 + 状压dp)

problem 题目链接 solution 从最小一个数 xxx 开始&#xff0c;将其 2x,3x2x,3x2x,3x 放入&#xff0c;再将 2(2x),3(2x),2(3x),3(3x)2(2x),3(2x),2(3x),3(3x)2(2x),3(2x),2(3x),3(3x) 放入&#xff0c;以此类推 …\dots… 将其合并为一个集合。重复又找一个最小未进入集合的…

在实际项目中使用LiteDB NoSQL数据库

LiteDB 是一个 NoSQL 数据库&#xff0c;特点是 MongoDB like 和 0 配置。100% 原汁原味的 C# 开发, Release 只有一个 DLL&#xff0c;官方有一下适用场景&#xff1a;移动App&#xff0c;桌面小应用程序&#xff0c;特有的文件格式&#xff0c;小型的 Web 应用&#xff0c;需…

2021牛客暑期多校训练营3

2021牛客暑期多校训练营3 题号题目知识点AGuess and liesBBlack and whiteCMinimum grid二分图匹配DCountEMath数论打表找规律F24dian模拟GYu Ling(Ling YueZheng) and Colorful TreeHLing Qiu, Luna and Triple BackpackIKuriyama Mirai and Exclusive OrJCounting Triangles…

P4769 [NOI2018] 冒泡排序(组合数学)

前言 这里是线性做法。 在题解里几句话说清楚的性质愣是推了一上午。 too vegetable 解析 考虑怎样的排列是不合法的。 一个排列如果不合法&#xff0c;也就是在某次交换时其中一个元素距离目标的距离没有减少反而增大了&#xff0c;那么以后这个数一定会再换回来&#xff0…

[骗分技巧——随机化Ⅰ]CodeChef-Milestones,CF364D-Ghd

文章目录CodeChef-MilestonesproblemsolutioncodeCF364D-Ghdproblemsolutioncode设随机化一次的正确率为 ppp&#xff0c;一次的复杂度为 O(f(n))O(f(n))O(f(n))。则随机的期望次数 kkk&#xff1a;k∑i1∞p(1−p)i−1i(1)(1−p)k∑i1∞p(1−p)ii∑i2∞p(1−p)i−1(i−1)(2)(1)…

初探奥尔良(Orleans)

由于工作上关系目前经常被各种并发数据问题搞得焦头烂额&#xff0c;要么要性能舍弃数据上得一致性&#xff0c;要么要一致性但是却得到了特别糟糕的响应。难道鱼和熊掌真的无法兼得吗&#xff1f;然后找到了类似奥尔良这种基于Actor模型的kuangjia首先本人因为是C#系的所以暂不…

2021杭电多校1

题号题目知识点AMod, Or and Everything思维数论BRocket landCPuzzle loopDAnother thief in a ShopEMinimum spanning tree推结论欧拉筛FXor sum01字典树GPass!HMaximal submatrix单调栈IKD-GraphJzotoKNecklace of Beads

P4775 [NOI2018] 情报中心(线段树合并)

前言 似乎也没有那么难&#xff1f; 但确实也不太好想。 解析 对于两条有交路径 (u1,v1,c1),(u2,v2,c2)(u_1,v_1,c_1),(u_2,v_2,c_2)(u1​,v1​,c1​),(u2​,v2​,c2​)&#xff0c;设 tlca(u1,u1)tlca(u_1,u_1)tlca(u1​,u1​) 为四个 lca 中最深的&#xff0c;那么代价的二…

[骗分技巧——随机化Ⅱ] [Poi2014]Couriers,CodeChef - TKCONVEX

文章目录[Poi2014]CouriersproblemsolutioncodeCodeChef - TKCONVEXproblemsolutioncode随机算法的典型套路&#xff1a;枚举太花时&#xff0c;转化为随机一个数。然后通过对正确率的分析&#xff0c;选择一个随机的次数来卡。前提是要保证每一次检验随机是否为答案的时间复杂…

[NewLife.XCode]功能设置

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代表作有百亿级大数据实时计算项…

I love max and multiply HDU - 6971(详细解答)

I love max and multiply HDU - 6971 题意&#xff1a; 数组a和b&#xff0c;现在构造一个数组c&#xff0c;使得c[k]max(a[i] * b[j]) , i&j>k 求数组c的和 题解&#xff1a; 我们可以考虑求出所有Dkmax(Ai * Bj)并满足i&jk&#xff0c;然后再从后向前取&#…

[NewLife.XCode]数据模型文件

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

[HNOI2013]数列(差分)

[HNOI2013]数列 problem 洛谷链接 solution 假设每天的股价为 a[i]a[i]a[i]。则需满足 ∀i<ka[i1]−a[i]≤m\forall_{i<k}a[i1]-a[i]\le m∀i<k​a[i1]−a[i]≤m。又有参数满足 m(k−1)<nm(k-1)<nm(k−1)<n。 也就是说每天的股价都可以取到上限&#xf…

24dian(牛客多校第三场)

24dian(牛客多校第三场) 题意&#xff1a; 给你n张牌&#xff0c;每张牌的大小为1 ~ 13&#xff0c;问这些牌与加减乘除任意组合(可以使用括号)&#xff0c;且但所有的有效解在计算过程中都涉及到分数&#xff0c;即非整数&#xff0c;能否组成答案m&#xff0c;如果可以&…

[NewLife.XCode]高级增删改

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

[AtCoder Grand Contest 048] D - Pocky Game(区间dp + 博弈)

problem AtCoder solution 注意&#xff1a;本题不是平等博弈&#xff0c;因为先手只能取最左边&#xff0c;后手只能取最右边。 设 f[l][r][k]:f[l][r][k]:f[l][r][k]: 只剩下区间 [l,r][l,r][l,r] 等待操作&#xff0c;第 lll 堆石子数量为 kkk 的时候&#xff0c;先手是…

P4147 玉蟾宫

P4147 玉蟾宫 题意&#xff1a; 给你一个n * m的矩阵&#xff0c;矩阵每个值有F或R&#xff0c;求最大的全为F的矩阵&#xff0c;输出面积 * 3 题解&#xff1a; 很明显&#xff0c;求最大01矩阵&#xff0c;悬线法或者单调栈 对于模板除了要记熟还要知道原理&#xff0c;不…