首页 > 其他分享 >2023NOIP A层联测26 T2 competition

2023NOIP A层联测26 T2 competition

时间:2023-11-09 09:33:55浏览次数:37  
标签:node 26 ll T2 线段 vec sum 2023NOIP mod

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} f_{x,i+1}-f_{x,i} \]

\(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);
}

标签:node,26,ll,T2,线段,vec,sum,2023NOIP,mod
From: https://www.cnblogs.com/binbinbjl/p/17818995.html

相关文章

  • 2023NOIP A层联测26 T3 tour
    2023NOIPA层联测26T3tour有意思的树上主席树。思路首先考虑一个点\(p\)能计入答案的情况,就是\(dis(x,p)-a_p\gea_p\)。我们把\(x\toy\)的路径拆成\(x\tolca,lca\toy\)两条。记录一个点\(x\)到根路径上的前缀和为\(s_x\),对于两条路径,我们分类讨论:第一......
  • 2609
    给你一个仅由 0 和 1 组成的二进制字符串 s 。  如果子字符串中 所有的 0 都在 1 之前 且其中 0 的数量等于 1 的数量,则认为 s 的这个子字符串是平衡子字符串。请注意,空子字符串也视作平衡子字符串。 返回  s 中最长的平衡子字符串长度。子字符串是字......
  • D - ABC Puzzle -- ATCODER ABC 326
    D-ABCPuzzlehttps://atcoder.jp/contests/abc326/tasks/abc326_dSampleInput1Copy5ABCBCACAABSampleOutput1CopyYesAC..B.BA.CC.BA.BA.C...CBA思路充分利用约束条件,构造算法,避免穷举所有情况,然后再根据约束条件判断情况的合法性。 如下代码,优......
  • springboot2 springboot 的引导类
    SpringBoot工程提供引导类用来启动程序,SpringBoot工程启动后创建并初始化Spring容器 packagecom.itheima;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context......
  • 2609. 最长平衡子字符串
    给你一个仅由 0 和 1 组成的二进制字符串 s 。  如果子字符串中 所有的 0 都在 1 之前 且其中 0 的数量等于 1 的数量,则认为 s 的这个子字符串是平衡子字符串。请注意,空子字符串也视作平衡子字符串。 返回  s 中最长的平衡子字符串长度。子字符串是字......
  • 实验三_OOP_张文瑞_202213260018
    任务1源代码:11#pragmaonce2233#include<iostream>44usingstd::cout;55usingstd::endl;6677classPoint{88public:99Point(intx0=0,inty0=0);1010~Point()=default;11111212intget_x()......
  • H.26x中SEI信息解读(转)
    原文:https://www.jianshu.com/p/23d9ab930b49作者:Li_Xianglin来源:简书H.264SEIhttp://www.itu.int/rec/T-REC-H.264 NALheader起始码(暗红底色)"0x00000001"分割出来的比特流即是NALunit,起始码紧跟的第一个字节(墨绿底色)是NALheader。上图“NALheader”一共出现了......
  • H265 NALU类型详细解析(转)
    原文:https://blog.csdn.net/u014470361/article/details/89541544作者:夜风~来源:CSDN前言在海思自hi3516a带的开发固件中,有H265编码的实例,在SAMPLE_VENC_1080P_CLASSIC(HI_VOID)应用实例中有涉及,那么本文将对H265的nal头和nalu的类型进行相关解析。h265Nalu类型解析 FF:......
  • [BZOJ2603] [POI2003] Motorways
    本题解思路类似kczno1在[POI2010]KOL-Railway的题解。如果\(l_i<l_j<r_i<r_j\)则连边\((i,j)\),题目转化为判断该图是否是二分图,如果是则给出染色方案。不妨先找出一个生成森林,然后染色并判断所有同颜色的点是否没有边相连。把所有\((l_i,r_i)\)按\(l\)从小......
  • NOIP 模拟13(NOIP A层联测26)
    100+100+20+17,T3按理说应该想到考虑两部分分别的贡献的,明明这个套路很常见。5k:就喜欢这种数据结构专场,多来点。A.origen先前缀和,以下\(p_i\)表示前缀异或和。考虑将一个数\(k\)二进制差分,假设拆成\(2^a+2^b+2^c\),则\(k^2=(2^a+2^b+2^c)\times(2^a+2^b+2^c)\),也就是指数......