The 2024 ICPC Asia EC Regionals Online Contest (II) - Problem H. Points Selection
注意到如果 为真,那么 一定为真。
从小到大枚举询问中 的值,按横坐标从小到大依次加入每个点,维护 表示最小的 满足 为真。
假设当前正在加入点 ,有 。
观察状态转移方程可知,如果 ,那么就没有更新的必要。令 ,那么如果 ,则这个点是完全无用的,可以直接跳过。
由于数据随机,可以近似地认为加入 个点后,所有 个子集和模 的结果在 等概率均匀分布。可以看作 个小球随机放入 个洞之中,填满所有 个洞所需的期望球数是 ,因此 时期望可以填满整个 数组。这说明, 数组的最大值的期望值等于所有已经加入的点的纵坐标的第 小值,即 。
于是,加入的第 个点的纵坐标 的概率为 ,期望只需要更新 遍 数组。由于这个值并不大,每次暴力 更新整个数组即可。有了 数组就可以很容易地求出最终的答案。
时间复杂度 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include<iostream> #include<algorithm> using namespace std; typedef unsigned long long ull; const int N=500005; int n,i,j,mx,f[N],g[N];ull suf[N],sum,ans; struct E{ int x,y,v;}e[N]; inline bool cmp( const E&a, const E&b){ return a.x<b.x;} inline void insert( int y, int v){ if (y>=mx||v==n) return ; for ( int i=0;i<n;i++)g[i]=f[i]; for ( int i=0,j=v;i<n;){ int tmp=max(f[i],y); if (tmp<g[j])g[j]=tmp; i++; j++; if (j==n)j=0; } mx=0; sum=0; for ( int i=0;i<n;i++){ f[i]=g[i]; sum+=i*suf[f[i]]; if (f[i]>mx)mx=f[i]; } } int main(){ ios_base::sync_with_stdio(0);cin.tie(0); cin>>n; for (i=1;i<=n;i++)cin>>e[i].x>>e[i].y>>e[i].v; sort(e+1,e+n+1,cmp); for (i=n;i;i--)suf[i]=suf[i+1]+i; for (i=0;i<n;i++)f[i]=n+1; f[0]=0; mx=n+1; for (i=j=1;i<=n;i++){ while (j<=n&&e[j].x<=i){ insert(e[j].y,e[j].v); j++; } ans+=sum*i; } cout<<ans; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2016-09-21 BZOJ1931 : [Shoi2007]Permutation 有序的计数
2016-09-21 BZOJ3654 : 图样图森破