首页 > 其他分享 >2023年多校联训NOIP层测试3+「SFCOI-3」Sadness Fan Club Round 3

2023年多校联训NOIP层测试3+「SFCOI-3」Sadness Fan Club Round 3

时间:2023-08-05 09:45:16浏览次数:37  
标签:... frac NOIP Club sum long int 联训 define

2023年多校联训NOIP层测试3

T1 数列变换 \(10pts\)

  • 考虑暴力,发现 \(f\) 数列进行一次变换 \(A\) ,再进行一次变换 \(B\) 后,恢复成了原数列; \(f\) 数列进行一次变换 \(B\) ,再进行一次变换 \(A\) 后,也恢复成了原数列。即变换 \(A\) 可以和变换 \(B\) 相互抵消。
    • 本质是差分是前缀和的逆运算(讲树状数组的时候顺带讲了,没认真听,现在才想起来,祭)。
  • 直接暴力,数据有点弱,时间复杂度 \(O(n×|sumA-sumB|)\) 。
  • 这个数据卡负数的取模也真是醉了,在这里挂了 \(30pts\) ,这里推荐两篇讲解负数取模的博客。link1 link2
  • 赛场上前缀和打错了,挂了 \(60pts\) 。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sort stable_sort
#define endl '\n'
ll f[1000],sum[1000];
int main()
{
    ll n,m,i,j,k,num=0;
    char pd;
    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
        cin>>f[i];
        sum[i]=(sum[i-1]+f[i])%998244353;
    }
    for(i=1;i<=m;i++)
    {
        cin>>pd>>k;
        if(pd=='A')
        {
            num+=k;
        }
        if(pd=='B')
        {
            num-=k;
        }
    }
    if(num>0)
    {
        for(i=1;i<=num;i++)//直接暴力
        {
            for(j=2;j<=n;j++)
            {
                f[j]=(f[j]+f[j-1]+998244353)%998244353;
            }
        }
        for(i=1;i<=n;i++)
        {
            cout<<f[i]%998244353<<" ";
        }
    }
    if(num==0)
    {
        for(i=1;i<=n;i++)
        {
            cout<<f[i]%998244353<<" ";
        }
    }
    if(num<0)
    {
        for(i=1;i<=-num;i++)//直接暴力
        {
            for(j=n;j>=2;j--)
            {
                f[j]=(f[j]-f[j-1]+998244353)%998244353;
            }
        }
        for(i=1;i<=n;i++)
        {
            cout<<f[i]%998244353<<" ";
        }
    }    
    return 0;
}

T2 超级质数 \(0pts\)

  • 部分分( \(40pts\) ):筛法求素数+暴力枚举

  • 这题卡空间 \(64MB\) ,结果赛场上把筛素数数组大小改成了 \(5e7\) ,但筛的范围是 \(7e7\) ,挂了40pts。

  • 考虑打表,打表发现太大了,压缩不下,但是得到从 \(1\) ~ \(4×10^7\)的超级质数个数为 \(76488\) 。- 隔壁 wkh分段打表貌似没我暴力多。

  • 正解:线性筛出所有超级质数,二分查找回答答案,复杂度主要在线性筛上,略带卡常,请使用 \(scanf,printf\) or关闭 \(cin,cout\) 同步流。

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long 
    #define sort stable_sort 
    #define endl '\n'
    int prime[4000001],cjprime[80001],sum[10],len=0,cjlen=0;
    bool vis[40000100];//某人(我)写成char,但没有报错
    bool check(int x)
    {
        sum[0]=sum[1]=sum[1]=sum[2]=sum[3]=sum[4]=sum[5]=sum[6]=sum[7]=sum[8]=sum[9]=0;
        while(x>0)
        {
            sum[x%10]++;
            if(sum[x%10]>=2)
            {
                return false;
            }
            x/=10;
        }
        return true;
    }
    void isprime(int n)
    {
        int i,j;
        memset(vis,false,sizeof(vis));
        for(i=2;i<=n;i++)
        {
            if(vis[i]==false)
            {
                len++;
                prime[len]=i;
                if(check(i)==true)
                {
                    cjlen++;
                    cjprime[cjlen]=i;
                }           
            }
            for(j=1;j<=len&&i*prime[j]<=n;j++)
            {
                vis[i*prime[j]]=true;
                if(i%prime[j]==0)
                {
                    break;
                }
            }
        }
    }
    int main()
    {
        int n,i,l,r,fl,fr;
        scanf("%d",&n);
        isprime(40000000);
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&l,&r);
            fl=upper_bound(cjprime+1,cjprime+1+cjlen,l-1)-cjprime-1;//记得是l-1
            fr=upper_bound(cjprime+1,cjprime+1+cjlen,r)-cjprime-1;//第一个大于r的数字的下标减一就是第一个小于等于r的数字的下标
            printf("%d\n",fr-fl);
        }
        return 0;
    }
    
  • 花絮:请从下往上阅读,\(Accoders\) 的测评机太老了,“运行错误”不一定是 \(RE\) ,还可能是空间炸了(出题人为什么要卡空间啊,喂)。

T3 区间加和 \(45pts\)

  • 部分分( \(45pts\) ):\(O(n×max(k))\)的离线暴力即可

T4 距离序列 \(6pts\)

  • 部分分( \(6pts\) ):输出 \(1\)

「SFCOI-3」Sadness Fan Club Round 3

这场比赛和luogu上的比赛时间重了,然后就 \(4h\) 打两场比赛,两场比赛都挂分了

T1 P9492 「SFCOI-3」进行一个拆的解 \(30pts\)

  • 部分分( \(30pts\) ):
    • Subtask \(0\) ( \(15pts\) ):序列内全部相等公共时输出 No
    • Subtask \(1\) ( \(15pts\) ):输出 YES

      不,可以,总司令

  • 正解:
    • 考虑一个贪心的思想(不会证明):
      • 当 \(n\) 为偶数时,将序列 \(a_1...a_n\) 分成\(a_1...a_{\frac{n}{2}}\) 和\(a_{\frac{n}{2}+1}...a_n\) 一定是最优方案。
      • 当 \(n\) 为奇数时,将序列分成如下两种情况一定是最优方案。
        • \(a_1...a_{\frac{n-1}{2}}\) 和\(a_{\frac{n-1}{2}+1}...a_n\)
        • \(a_1...a_{\frac{n+1}{2}}\) 和\(a_{\frac{n+1}{2}+1}...a_n\)
    • 分别处理,进行模拟即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define sort stable_sort 
#define endl '\n'
int a[1000010];
int main()
{
    int t,n,i,j,flag,mid;
    cin>>t;
    for(i=1;i<=t;i++)
    {
        cin>>n;
        flag=0;//多测不请客,爆零两行泪
        for(j=1;j<=n;j++)
        {
            cin>>a[j];
        }
        for(j=1;j<=n-1;j++)
        {
        	if(a[j]!=a[j+1])//特判全部相等的情况
        	{
        		flag=1;
        		break;
        	}
        }
        if(flag==0)
        {
            cout<<"NO"<<endl;
        }
        else
        {
            flag=0;
            if(n%2==0)
            {
                for(j=1;j<=n/2;j++)
                {
                    if(a[j]!=a[j+n/2])//若前后两个序列有不同的数字,则一定可以满足题意
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag==1)
                {
                    cout<<"YES"<<endl;
                }
                else
                {
                    cout<<"NO"<<endl;
                }
            }
            else
            {
                mid=n/2+1;
                for(j=1;j<=n/2;j++)//1~(n-1)/2和(n-1)/2+1~n 
                {
                    while(a[j]!=a[mid]&&mid<=n)
                    {
                        mid++;
                    }
                    mid++;
                }
                if(mid>=n+2)
                {
                    cout<<"YES"<<endl;
                }
                else
                {
                    mid=1;
                    for(j=n/2+2;j<=n;j++)//1~(n+1)/2和(n+1)/2+1~n 
                    {
                        while(a[j]!=a[mid]&&mid<=n)
                        {
                            mid++;
                        }
                        mid++;
                    }
                    if(mid>=n/2+3)
                    {
                        cout<<"YES"<<endl;
                    }
                    else
                    {
                        cout<<"NO"<<endl;
                    }
                }
            }
        }
    }
    return 0;
}

标签:...,frac,NOIP,Club,sum,long,int,联训,define
From: https://www.cnblogs.com/The-Shadow-Dragon/p/17605932.html

相关文章

  • 明白均线信号Forexclub的投资者就知道如何交易
    在Forexclub上的交易的投资者,都在使用5、25和50周期的均线来分析收盘价。其中,5周期的均线为红色,25和50周期的均线为黄色。同时使用抛物面SAR指标,保留其默认参数。开立多头头寸的条件是:5周期的红色均线从下方突破25和50周期的黄色均线,同时抛物面SAR指标在烛台下面。开设短期交易的条......
  • [Ynoi2012] NOIP2015 充满了希望(扫描线+线段树)
    题目传送门solution简单题。我们正着做扫描线。设\(t_i\)表示位置\(i\)最后一次进行二操作的时间,那么一操作就是交换\(t_x,t_y\),二操作就是区间复制。对于三操作,开一个树状数组,如果查询的位置的\(t_x=j\),就在\(j\)的位置上加一。查询就是查询后缀和。#include<bit......
  • P7116 [NOIP2020] 微信步数
    原题简化题意:有一个k维场地,第i维宽为wi,即第i维的合法坐标为1,2,···,wi。小C有一个长为n的行动序列,第i元素为二元组(ci,di),表示这次行动小C的坐标由(x1,x2,...,xci,...,xk)变为(x1,x2,...,xci+di,...,xk)。小C会将行动......
  • 【题解】Luogu[P5022] [NOIP2018 提高组] 旅行
    Link因为是道NOIP,那么我们不妨按照考场上的策略一点一点想。先看部分分,有一档有很明显的特征\(n=m-1\)这显然构成一棵树,对于一棵树,我们想把他按照题目的要求遍历完,一定是像dfs的遍历顺序一样,对于一个点,必然遍历完以它为根的子树,才能回到它的父亲节点,于是就有了一个很明显的贪......
  • 动量定理Forexclub总结的交易规则
    动量定理策略是一种趋势策略,基于周线图中的“三烛台”形态(上涨或下跌)进行交易。Forexclub总结的交易规则如下:1. 下一个烛台必须比上一个烛台大,以确认趋势存在。2. 多奇烛台(不带主体的烛台)不考虑在内。3. 止损设置在序列中第一根蜡烛线的收盘水平。4. 止盈是最后一个烛台的5......
  • 2023年多校联训NOIP层测试2
    2023年多校联训NOIP层测试2爆零了T1HDU4786FibonacciTree\(0pts\)@wangyunbiao:不可以,总司令我:不,可以,总司令T2期末考试\(0pts\)T3麻烦的工作\(0pts\)@wangyunbiao:不可以,总司令我:不,可以,总司令T4小X的Galgame\(0pts\)......
  • 【题解】Luogu[P2296] [NOIP2014 提高组] 寻找道路
    Link很简单的一道图论题。要在一个有向图上找一条\(s\)到\(t\)的最短路,要求这条路径上的所有点都满足:该点的所有出边所连点都能到达终点\(t\)。看上去很乱,我们简单分解一下,先在所有点中找到与终点有路径的点集\(A\)进行标记,再再所有点中找到其所有出边所连点都被打上标......
  • NOIP2014 D2T1 奶酪
    NOIP2014奶酪题面:NOIP2014提高组D2T1现有一块大奶酪,它的高度为\(h\),它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为\(z=0\),奶酪的上表面为\(z=h\)。现在,奶酪的下表面有一只小......
  • 【NOIP模拟题】我要的幸福 题解
    1.题意简述\(Zyh\)相信自己想要的幸福在不远处。然而,\(zyh\)想要得到这幸福,还需要很长的一段路。\(Zyh\)坚持认为整个人生可以抽象为一个\(n*m\)的棋盘。左上角的格子为\((1,1)\),右下角的格子为\((n,m)\)。整个棋盘上的格子都有不同的事件,因为生活的多姿多彩,事件的权值......
  • 2009NOIP普及组 题解
    第一题第二题\(一二题太简单就不在此处提了\)\(直接看到\)第三题细胞分裂题目大意\(有m1^{m2}个试管和n种细胞,第i种细胞初始有1个,每过1秒每一个会分裂成a_i个\)\(当有某种细胞可以平均分到试管中时开始实验,求开始实验的\)时间\((顺便说一下,我一开始没看到是时间,以为是求哪......