首页 > 其他分享 >初三奥赛模拟测试4

初三奥赛模拟测试4

时间:2024-04-06 15:45:25浏览次数:24  
标签:rt le 奥赛 ll tree pd 初三 sum 模拟

初三奥赛模拟测试4

\(T1\) 最后一课 \(100pts\)

  • 简化题意:给定 \(k,x_{1},y_{1},x_{2},y_{2}\) ,求 \(\min \{ (x-x_{1})^2+(k-y_{1})^2+(x-x_{2})^2+(k-y_{2})^2 \}\) 。

  • 正解

    点击查看代码
    ll work(ll x1,ll y1,ll x2,ll y2)
    {
        return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
    }
    int main()
    {
        ll k,x1,x2,y1,y2;
        cin>>k>>x1>>y1>>x2>>y2;
        if(y1>y2)
        {
            swap(x1,x2);
            swap(y1,y2);
        }
        if(y1==k&&y2==k)
        {
            cout<<work(x1,y1,x2,y2)<<endl;
        }
        else
        {
            if(k<y1)
            {
                cout<<work(x1,y1-2*(y1-k),x2,y2)<<endl;
            }
            else
            {
                if(y1<k&&k<y2)
                {
                    cout<<work(x1,y1,x2,y2)<<endl;
                }
                else
                {
                    cout<<work(x1,y1+2*(k-y1),x2,y2)<<endl;	
                }
            }
        }
        return 0;	
    }
    

\(T2\) 日常 \(60pts\)

  • 正解

    • 排序后二分模拟即可。
    点击查看代码
    struct node
    {
        ll l,x,y,r;
    }a[100010];
    ll vis[100010];
    bool cmp(node a,node b)
    {
        return a.r<b.r;
    }
    bool check(ll mid,ll w)
    {
        return a[mid].l<=w;
    }
    int main()
    {
        ll n,m,k,minl=0x7f7f7f7f,l,r,mid,ans,w,i;
        cin>>n>>m>>k;
        for(i=1;i<=n;i++)
        {
            cin>>a[i].l>>a[i].x>>a[i].y>>a[i].r;
            minl=min(minl,a[i].l);
        }
        sort(a+1,a+1+n,cmp);
        for(i=1;i<=k;i++)
        {
            cin>>w;
            if(w<minl||w>m)
            {
                cout<<"Failed"<<endl;
            }
            else
            {
                l=1;
                r=n;
                ans=0;
                while(l<=r)
                {
                    mid=(l+r)/2;
                    if(check(mid,w)==true)
                    {
                        l=mid+1;
                        ans=mid;
                    }
                    else
                    {
                        r=mid-1;
                    }
                }
                if(w<=a[ans].r)
                {
                    if(vis[ans]==1)
                    {
                        cout<<"Again"<<endl;
                    }
                    else
                    {
                        vis[ans]=1;
                        if(a[ans].x<=w&&w<=a[ans].y)
                        {
                            cout<<"Perfect"<<endl;
                        }
                        else
                        {
                            cout<<"Normal"<<endl;
                        }
                    }
                }
                else
                {
                    cout<<"Failed"<<endl;
                }
            }
        }
        return 0;
    }
    

\(T3\) 渡尘 \(70pts\)

  • 简化题意:给定一个长度为 \(n(n \le 2 \times 10^{5})\) 的序列 \(a\) , \(m(m \le 3 \times 10^{6})\) 组询问,每次询问给定 \(l,r\) 求 \(\max\limits_{l \le l_{1} \le r_{1} \le r} \{ |\sum\limits_{i=l_{1}}^{r_{1}}a_{i}| \}\) 。
  • 部分分
    • \(70pts\)
      • 考虑把绝对值拆开,有 \(\max\limits_{l \le l_{1} \le r_{1} \le r} \{ |\sum\limits_{i=l_{1}}^{r_{1}}a_{i}| \}=\max\limits_{l \le l_{1} \le r_{1} \le r} \{ \sum\limits_{i=l_{1}}^{r_{1}}a_{i},\sum\limits_{i=l_{1}}^{r_{1}}-a_{i} \}\) 。

      • \(\max\limits_{l \le l_{1} \le r_{1} \le r} \{ \sum\limits_{i=l_{1}}^{r_{1}}a_{i} \}\) 可用线段树维护,记录每个区间的最大前缀和、最大后缀和、最大子段和、区间和,然后合并即可。

      • 复杂度为 \(O(m \log_{2}{n})\) ,因线段树的巨大常数巨大所以只能得到 \(70pts\) 。

        点击查看代码
        ll a[800010];
        struct SegmentTree
        {
            ll l,r,maxl[2],maxr[2],sum[2],ans[2];
        }tree[800010];
        ll lson(ll l)
        {
            return l*2;
        }
        ll rson(ll l)
        {
            return l*2+1;
        }
        void pushup(ll rt,ll pd)
        {
            tree[rt].sum[pd]=tree[lson(rt)].sum[pd]+tree[rson(rt)].sum[pd];
            tree[rt].maxl[pd]=max(tree[lson(rt)].sum[pd]+tree[rson(rt)].maxl[pd],tree[lson(rt)].maxl[pd]);
            tree[rt].maxr[pd]=max(tree[rson(rt)].sum[pd]+tree[lson(rt)].maxr[pd],tree[rson(rt)].maxr[pd]);
            tree[rt].ans[pd]=max(max(tree[lson(rt)].ans[pd],tree[rson(rt)].ans[pd]),tree[lson(rt)].maxr[pd]+tree[rson(rt)].maxl[pd]);
        }
        void build(ll rt,ll l,ll r,ll pd,ll a[])
        {
            tree[rt].l=l;
            tree[rt].r=r;
            if(l==r)
            {
                tree[rt].sum[pd]=tree[rt].ans[pd]=tree[rt].maxl[pd]=tree[rt].maxr[pd]=a[l];
                return;
            }
            ll mid=(l+r)/2;
            build(lson(rt),l,mid,pd,a);
            build(rson(rt),mid+1,r,pd,a);
            pushup(rt,pd);
        }
        SegmentTree query(ll rt,ll l,ll r,ll pd)
        {
            if(l<=tree[rt].l&&tree[rt].r<=r)
            {
                return tree[rt];
            }
            ll mid=(tree[rt].l+tree[rt].r)/2;
            if(r<=mid)
            {
                return query(lson(rt),l,r,pd);
            }
            else
            {
                if(l>mid)
                {
                    return query(rson(rt),l,r,pd);
                }
                else
                {
                    SegmentTree p=query(lson(rt),l,r,pd),q=query(rson(rt),l,r,pd),num;
                    num.sum[pd]=p.sum[pd]+q.sum[pd];
                    num.maxl[pd]=max(p.sum[pd]+q.maxl[pd],p.maxl[pd]);
                    num.maxr[pd]=max(q.sum[pd]+p.maxr[pd],q.maxr[pd]);
                    num.ans[pd]=max(max(p.ans[pd],q.ans[pd]),p.maxr[pd]+q.maxl[pd]);
                    return num;
                }
            }
        }
        int main()
        {
            ll n,m,i,l,r;
            scanf("%lld%lld",&n,&m);
            for(i=1;i<=n;i++)
            {
                scanf("%lld",&a[i]);
            }
            build(1,1,n,0,a);
            for(i=1;i<=n;i++)
            {
                a[i]=-a[i];
            }
            build(1,1,n,1,a);
            for(i=1;i<=m;i++)
            {
                scanf("%lld%lld",&l,&r);
                printf("%lld\n",max(query(1,l,r,0).ans[0],query(1,l,r,1).ans[1]));
            }
            return 0;
        }
        
  • 正解
    • \(ST\) 表
      • 考虑把绝对值拆开,有 \(\max\limits_{l \le l_{1} \le r_{1} \le r} \{ |\sum\limits_{i=l_{1}}^{r_{1}}a_{i}| \}=\max\limits_{l \le l_{1} \le r_{1} \le r} \{ \sum\limits_{i=1}^{r_{1}+1}a_{i}-\sum\limits_{i=1}^{l_{1}}a_{i},\sum\limits_{i=1}^{l_{1}}a_{i}-\sum\limits_{i=1}^{r_{1}+1}a_{i} \}=\max\limits_{r_{1}=l}^{r+1} \{ \sum\limits_{i=1}^{r_{1}}a_{i} \}-\min\limits_{l_{1}=l}^{r+1} \{ \sum\limits_{i=1}^{l_{1}}a_{i} \}\) ,使用 \(ST\) 表维护即可。

        点击查看代码
        //快读快写已省略
        #define cin Fast_IO::fin
        #define cout Fast_IO::fout
        ll a[200010],sum[200010],fmaxx[200010][25],fminn[200010][25];
        void init(ll n,ll a[])
        {
            memset(fminn,0x3f,sizeof(fminn));
            for(ll i=1;i<=n;i++)
            {
                fminn[i][0]=fmaxx[i][0]=a[i];
            }
            for(ll j=1;j<=log2(n);j++)
            {
                for(ll i=1;i<=n-(1<<j)+1;i++)
                {
                    fmaxx[i][j]=max(fmaxx[i][j-1],fmaxx[i+(1<<(j-1))][j-1]);
                    fminn[i][j]=min(fminn[i][j-1],fminn[i+(1<<(j-1))][j-1]);
                }
            }
        }
        ll query_max(ll l,ll r)
        {
            ll t=log2(r-l+1);
            return max(fmaxx[l][t],fmaxx[r-(1<<t)+1][t]);
        }
        ll query_min(ll l,ll r)
        {
            ll t=log2(r-l+1);
            return min(fminn[l][t],fminn[r-(1<<t)+1][t]);
        }
        int main()
        {
            ll n,m,l,r,i;
            cin(n,m);
            for(i=1;i<=n;i++)
            {
                cin(a[i]);
                sum[i+1]=sum[i]+a[i];
            }
            init(n+1,sum);
            for(i=1;i<=m;i++)
            {
                cin(l,r);
                r++;
                cout(query_max(l,r)-query_min(l,r),'\n');
            }
            return 0;
        }
        
    • 猫树
    • “四毛子”算法

\(T4\) 罪人挽歌 \(0pts\)

  • 部分分
    • \(0pts\) :输出 No

总结

后记

标签:rt,le,奥赛,ll,tree,pd,初三,sum,模拟
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18117484

相关文章

  • 初三奥赛模拟测试4
    初三奥赛模拟测试4$T1$最后一课题目描述姬子正要去找Kiana,但在这之前,她还需要去一个地方。在平面直角坐标系上,有一条直线\(y=k\),还有两点\(P(x_1,y_1),Q(x_2,y_2)\)。姬子在点P处,Kiana在点Q处。姬子希望先走到直线\(y=k\)上,然后再去找Kiana。求姬子走到Ki......
  • 初三奥赛模拟测试4
    前言\(CSP-S\)模拟赛,确实比前几次简单多了。\(T1~100pts\):签到题。\(T2~100pts\):二分直接跑即可。\(T3~40pts\):首先他给的这个快读没法用。赛时joker了,打了个\(n^2~DP\),然后优化了\(50min\)换了个转移方程还是\(n^2\),复杂度打假了。因为赛时懒得跑线段......
  • 150行Python代码模拟太阳系行星运转
    今天我们用Python来模拟一下太阳系行星运动轨迹~先上成品图(运行效果含音乐的呦)想要实现这样的效果并不难准备材料首先我们需要准备这样一些材料宇宙背景图背景透明的行星图 编写代码代码分块详解导入需要的模块import pygame  import sys ......
  • c语言字符串函数(strlen strcpy strcat strcmp等使用及模拟)
    在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语⾔标准库中提供了一系列库函数,接下来我们就学习一下这些函数。目录1、strlen的使用及模拟实现。2、strcpy的使用及模拟实现。3、strcat的使用及模拟实现。4、strcmp的使用及模拟实现。5、strncpy的......
  • 【三十五】【算法分析与设计】综合练习(2),22。 括号生成,77。 组合,494。 目标和,模拟树递
    22.括号生成数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]提示:1<=n<=8【三十五】【算法分析与设计】综合练习(2),......
  • BNDS 2024/4/6模拟赛题解
    T1方程描述给出非负整数\(N\),统计不定方程\(X+Y^2+Z^3=N\)的非负整数解\((X,Y,Z)\)的数量。输入输入数据,包含一个非负整数\(N\)。输出输出数据,包含一个非负整数表示解的数量。数据范围40%的数据,\(N<=10000\)60%的数据,\(N<=10^8\)100%的数据,\(N<=10^{16}\)分析......
  • #线段树,模拟费用流#CF280D k-Maximum Subsequence Sum
    题目给定一个大小为\(n\)的序列,要求支持单点修改和查询区间内至多\(k\)个不交子区间之和的最大值(可以不取)分析考虑源点向每个点、每个点向汇点流流量1费用0的边,每个点向右边的点流流量1费用\(a_i\)的边,流量最大为\(k\),这样构建出一个费用流的模型。很显然,退流相当于给区......
  • 2024.2.18 模拟赛
    A.小学数学20分暴力即可。40分将询问拆为\(\leqt\)减去\(<s(\leqs-1)\)的两个问题,然后将询问排序后做前缀和即可。满分要求强制在线,将矩阵中所有元素排序,然后分成\(\sqrt{nm}\)个块,每个块记录二维前缀和(出现了多少次块内的数)。每次询问时先处理整块,对于整块外的数再单......
  • 2024.1.23 模拟赛
    郊游首先需要快速找到当前适配度最大的一对小朋友。容易发现\(a,b\)的适配度即为\(a,b\)二进制下最长公共后缀的长度,于是先翻转所有数的二进制串并插入到Trie中。那么\(a,b\)的适配度即为\(a,b\)所代表叶子节点的\(\rmLCA\)(最近公共祖先)深度。若Trie中以\(x\)......
  • 2024.3.17 模拟赛
    A贸易题目保证输入的边\(u<v\),说明题目中的图是一个有向无环图\(DAG\),但是不一定连通。可以记录\(f[i]\)表示到达\(i\)之前能遇到的最小的价格,使用拓扑排序进行\(dp\)转移。对于每一个点\(i\),如果其价格为\(a[i]\),就可以用\(a[i]-f[i]\)更新答案,取最大值即......