2023NOIP A层联测26 T2 competition

tjm 的做法,很抽象。

考场思路

考虑每道题被做过多少次肯定不现实,那么考虑每一道题有多少次没有做出来。

假设某一次可以做出来题 \(x\) 的人是 \(i\),而 \(i\) 下一个人可以做出这道题的人是 \(j\),于是题 \(x\) 有 \(C_{j-i}^2\) 次不会被做出来(区间可以是 \([k,k]\))。

这样的 \(i,j\) 有多个,设 \(f_{x,i}\) 为第 \(i\) 个可以做出题 \(x\) 的人的编号(显然 \(f_x\) 具有单调性),于是 \(x\) 做不出来的次数 \(cnt_x\) 有:

\[cnt_i=\sum_{i=1}^{t_x-1} C_{f_{x,i+1}-f_{x,i}}^2
\]

\(t_x\) 为可以做出题 \(x\) 的人数。

于是最终答案为:

\[ans=m\times C_{n+1}^2-\sum_{i=1}^n cnt_i
\]

但这样做会 \(O(nm)\),于是 tjm 有更好的做法。

可以建一个坐标系,\(x\) 轴是题目,\(y\) 轴是第 \(i\) 个人。

那么每个人的做题情况都可以用一条水平的线段来表示。

回到答案式,实际上我们不需要求出 \(cnt_i\) 我们只需要知道 \(\sum_{i=1}^n cnt_i\) 的值就好了。

那么我们可以把每次加入一个人的操作看做是在坐标系上加入一条线段。

对于每一道题目肯定都被一条线段覆盖,那么对于连续的一段题目,我们记录覆盖他们最后的线段的左右端点,然后将新加入的线段与有交集的旧线段求贡献(求在这之间会减小多少)。注意,首尾处的旧线段可能无法完全覆盖,需要拆成两条。

#include<bits/stdc++.h>
using namespace std; #define ll long long const ll mod=1e9+7; int n; ll m,ans; struct node
{
ll x,y,w;
friend bool operator<(node a,node b){return a.y<b.y;}
}; vector<node>vec; ll ksm(ll x,ll y)
{
ll sum=1;
for(;y;y/=2,x=x*x%mod) if(y&1) sum=sum*x%mod;
return sum;
} ll gt(ll a){return a*(a+1)/2%mod;}
void pt(ll x,ll y,ll w)
{
auto it=lower_bound(vec.begin(),vec.end(),(node){0,x,0});
node vl=(node){0,0,-1},vr=(node){0,0,-1};
while((*it).x<=y)
{
if((*it).x<x) vl=(node){(*it).x,x-1,(*it).w};
if((*it).y>y) vr=(node){y+1,(*it).y,(*it).w};
ll vx=max(x,(*it).x),vy=min(y,(*it).y);
ans=(ans-(vy-vx+1)%mod*gt(w-(*it).w-1)%mod+mod)%mod;
vec.erase(it);
}
int vt=it-vec.begin();
if(vr.w!=-1) vec.insert(vec.begin()+vt,vr);
vec.insert(vec.begin()+vt,(node){x,y,w});
if(vl.w!=-1) vec.insert(vec.begin()+vt,vl);
} int main()
{
scanf("%d%lld",&n,&m);
ans=m%mod*gt(n)%mod;
vec.push_back((node){1,m,0});
vec.push_back((node){m+1,m+1,0});
for(int i=1;i<=n;i++)
{
ll x,y;
scanf("%lld%lld",&x,&y);
pt(x,y,i);
}
pt(1,m,n+1);
printf("%lld",ans*ksm(gt(n),mod-2)%mod);
}

2023NOIP A层联测26 T2 competition的更多相关文章

  1. ASP.NET MVC4入门到精通系列目录汇总

    序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,We ...

  2. python中的thread

    转载自: http://blog.sina.com.cn/s/blog_9f488855010198vn.html 正确与否未验证 python中得thread的一些机制和C/C++不同:在C/C++ ...

  3. X-Cart 学习笔记 完整目录

    如果有需要,可以直接联系博主,讨论学习 一.了解X-CART. 3 二.PHP环境搭建... 3 三.安装配置X-CART. 4 1.下载X-Cart并配置域名,映射地址... 4 2.配置X-Car ...

  4. 使用ajax实现无刷新改变页面内容

    如何使用ajax实现无刷新改变页面内容(也就是ajax异步请求刷新页面),下面通过一个小demo说明一下,前端页面代码如下所示 1 <%@ Page Language="C#" ...

  5. 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  6. 【转】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  7. SIFT特征提取分析(转载)

    转载自: http://blog.csdn.net/abcjennifer/article/details/7639681 SIFT(Scale-invariant feature transform ...

  8. [转]SIFT特征提取分析

    SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points) ...

  9. (六)6.17 Neurons Networks convolutional neural network(cnn)

    之前所讲的图像处理都是小 patchs ,比如28*28或者36*36之类,考虑如下情形,对于一副1000*1000的图像,即106,当隐层也有106节点时,那么W(1)的数量将达到1012级别,为了 ...

  10. 误差逆传播(error BackPropagation, BP)算法推导及向量化表示

    1.前言 看完讲卷积神经网络基础讲得非常好的cs231后总感觉不过瘾,主要原因在于虽然知道了卷积神经网络的计算过程和基本结构,但还是无法透彻理解卷积神经网络的学习过程.于是找来了进阶的教材Notes ...

随机推荐

  1. Python正则表达式提取车牌号

    在Python中使用正则表达式(Regular Expressions)来提取车牌号是一个常见的任务,尤其是在处理车辆信息或进行图像识别后的文本处理时.中国的车牌号格式多种多样,但通常包含省份简称.英 ...

  2. openstack硬盘扩容

    1.挂载好新硬盘后输入fdisk -l命令看当前磁盘信息2.用fdisk /dev/vda 进行分区3.进入fdisk命令,输入h可以看到该命令的帮助,按n进行分区4.这里输入e即分为逻辑分区,按p即 ...

  3. [postgres]使用pgbench进行基准测试

    前言 pgbench是一种在postgres上进行基准测试的简单程序,一般安装后就会自带.pgbench可以再并发的数据库绘画中一遍遍地进行相同序列的SQL语句,并且计算平均事务率. 测试准备 既然要 ...

  4. musl libc 与 glibc 在 .NET 应用程序中的兼容性

    musl Linux 和 glibc 是两种不同的 C 标准库实现,它们在多个方面存在显著差异. 历史和使用情况: glibc 是较早且广泛使用的 C 标准库实现,具有较长的开发历史和广泛的社区支持. ...

  5. TS中简单实现一下依赖注入

    依赖注入(Dependency Injection,DI)是一种设计模式,主要用于实现控制反转(Inversion of Control,IoC).它通过将对象的依赖关系从内部管理转移到外部容器来解耦 ...

  6. svg之viewbox缩放

    先看个示例 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  7. 小tips:vue2中broadcast和dispatch的实现

    /* * broadcast 事件广播 * @param {componentName} 组件名称 * @param {eventName} 事件名 * @param {params} 参数 * 遍历 ...

  8. tailwindcss 经验

    树摇时扫描的文件范围 根据 tailwindcss.config.js 中 content 的配置,跟打包软件加载的模块无关.即未使用的模块中的 class 也会被包含进来.

  9. oneforall配置环境,报错cannot import name 'sre_parse' from 're' 解决方法

    高版本python中re模块没有了sre_parse模块, 可以修改python中的exrex.py 代码,直接导入sre_parse模块

  10. 小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM

    小米 13T Pro 是一款性能卓越.设计精美的旗舰机型,具备多项领先配置,且在与前一代产品及友商机型的对比中优势明显,值得深入探讨. 性能提升 小米 13T Pro 搭载了最新的 天玑 9200+ ...