2023NOIP A层联测26 T2 competition

2023NOIP A层联测26 T2 competition

tjm 的做法,很抽象。

考场思路

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

假设某一次可以做出来题 x 的人是 i,而 i 下一个人可以做出这道题的人是 j,于是题 xCji2 次不会被做出来(区间可以是 [k,k])。

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

cnti=i=1tx1Cfx,i+1fx,i2

tx 为可以做出题 x 的人数。

于是最终答案为:

ans=m×Cn+12i=1ncnti

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

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

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

回到答案式,实际上我们不需要求出 cnti 我们只需要知道 i=1ncnti 的值就好了。

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

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

#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);
}
posted @   彬彬冰激凌  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示