首页 > 其他分享 >The 2024 ICPC Asia EC Regionals Online Contest (II) - Problem H. Points Selection

The 2024 ICPC Asia EC Regionals Online Contest (II) - Problem H. Points Selection

时间:2024-09-21 23:24:34浏览次数:11  
标签:geq Selection const log Contest int text II query

注意到如果 $\text{query}(a,b,c)$ 为真,那么 $\text{query}(\geq a,\geq b,c)$ 一定为真。

从小到大枚举询问中 $a$ 的值,按横坐标从小到大依次加入每个点,维护 $f_c$ 表示最小的 $b$ 满足 $\text{query}(a,b,c)$ 为真。

假设当前正在加入点 $(x,y,w)$,有 $f_{(c+w)\bmod n}=\min(f_{(c+w)\bmod n},\max(f_c,y))$。

观察状态转移方程可知,如果 $y\geq f_{(c+w)\bmod n}$,那么就没有更新的必要。令 $m=\max(f_0,f_1,\dots,f_{n-1})$,那么如果 $y\geq m$,则这个点是完全无用的,可以直接跳过。

由于数据随机,可以近似地认为加入 $k$ 个点后,所有 $2^k$ 个子集和模 $n$ 的结果在 $[0,n)$ 等概率均匀分布。可以看作 $2^k$ 个小球随机放入 $n$ 个洞之中,填满所有 $n$ 个洞所需的期望球数是 $O(n\log n)$,因此 $k=O(\log n)$ 时期望可以填满整个 $f$ 数组。这说明,$f$ 数组的最大值的期望值等于所有已经加入的点的纵坐标的第 $O(\log n)$ 小值,即 $O(\frac{n\log n}{k})$。

于是,加入的第 $k$ 个点的纵坐标 $y<m$ 的概率为 $O(\frac{\log n}{k})$,期望只需要更新 $O(\sum_{k=1}^n\frac{\log n}{k})=O(\log^2n)$ 遍 $f$ 数组。由于这个值并不大,每次暴力 $O(n)$ 更新整个数组即可。有了 $f$ 数组就可以很容易地求出最终的答案。

时间复杂度 $O(n\log^2n)$。

 

#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;
}

  

标签:geq,Selection,const,log,Contest,int,text,II,query
From: https://www.cnblogs.com/clrs97/p/18424676

相关文章

  • The 2024 ICPC Asia EC Regionals Online Contest (II) - Problem B. Mountain Bookin
    从$1$到$m$依次考虑每个日期。假设当前正在考虑第$i$天,那么只有第$i$天来访的游客以及指定第$i$天的查询是有用的。将这些游客和查询都提取出来,通过Kruskal重构树可以很方便地在$O(n\logn)$的时间内计算出这些查询的答案。不幸的是,本题还有加边删边操作,无法轻易地......
  • IIS8.0无法加载asp.net程序的解决方案
    1.更改系统文件machine.config文件,它位于C:\WINNT\Microsoft.NET\下面<configProtectedDatadefaultProvider="RsaProtectedConfigurationProvider">    <providers>      <addname="RsaProtectedConfigurationProvider"type="......
  • Atcoder Beginner Contest 372
    AtcoderBeginnerContest372A模拟即可。#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;voidsolve(){charch;while(cin>>ch){if(ch!='.'){cout<<ch;}}}......
  • AtCoder Beginner Contest 372
    省流版A.暴力即可B.转换3进制即可C.考虑答案的组成,仅修改发生变化的部分即可D.维护答案数组\(ans_i\),考虑枚举\(j\)对哪些\(i\)有贡献,通过单调栈找到对应的区间\(i\),通过差分维护区间加法即可E.并查集维护连通块,\(set\)维护点标号大小,合并\(set\)时启发式合并,查询......
  • The 2024 ICPC Asia EC Regionals Online Contest (II)
    目录写在前面F签到A枚举J贪心I构造,二进制L数学,三分G数学,辗转相除E结论,最短路写在最后写在前面补题地址:https://codeforces.com/gym/105358。以下按个人向难度排序。妈的7题秒完剩下的题感觉没一个能做的。F签到#include<bits/stdc++.h>#definelllonglongcon......
  • UNIQUE VISION Programming Contest 2024 Autumn (AtCoder Beginner Contest 372)
    总结(我的塘人局):单调栈是忘得差不多了 A-delete.题意:输出删除所有'.'的字符串思路:遍历输出不是'.'复杂度:O(n) Code:#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;usingi64=int64_t;voidsolve(){strings;cin......
  • iis服务器帝国cms7.5编辑器不能使用解决办法
    在IIS服务器上使用帝国CMS7.5时,如果编辑器不能正常使用,可能涉及多个方面的问题,包括文件权限、配置文件、依赖库等。下面是一些具体的解决办法:1.检查文件和目录权限确保帝国CMS的所有必要文件和目录具有正确的权限。步骤:检查e/data目录及其子目录:使用IISManager或其他工......
  • JAVA学习-练习试用Java实现“不同的二叉搜索树 II”
    问题:给定一个整数n,请生成并返回所有由n个节点组成且节点值从1到n互不相同的不同二叉搜索树。可以按任意顺序返回答案。示例1:输入:n=3输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]示例2:输入:n=1输出:[[1]]提示:1<=n......
  • leetcode刷题day22|回溯算法Part01( 77. 组合 、216. 组合总和 III、17.电话号码的字母
    前言:回溯是递归的副产品,只要有递归就会有回溯,回溯函数也就是递归函数。回溯是暴力穷举解法,效率并不高。但一些问题只能使用回溯来解决。回溯法,一般可以解决如下几种问题:组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一......
  • leetcode刷题day23|回溯算法Part02(39. 组合总和 、40.组合总和II、131.分割回文串)
    39.组合总和思路:这个题与77.组合的差异在于元素可以无限制重复被选取,那么只需要更改startIndex即可,每一层递归都可以从头选用元素。回溯三部曲与77.组合基本一致。代码如下:classSolution{List<List<Integer>>result=newArrayList<>();List<Integer>pa......