首页 > 其他分享 >普及模拟1

普及模拟1

时间:2023-08-16 17:22:50浏览次数:48  
标签:sort 普及 ll 400001 cnt long 模拟 define

普及模拟1

T1 Past \(0pts\)

  • 部分分:
    • \(O(n^3)\) 暴力枚举:\(TLE\) \(50pts\)
    • \(O(n^2+n \times log_2(n))\)
      • 线段树维护极差:\(TLE\) \(50pts\)
      • \(ST\) 表维护极差:\(MLE+TLE\) \(40pts\)
        • \(ST\) 表数组开太大了,全部 \(MLE\) 挂了 \(40pts\)。
  • 正解:
    • \(d=1\) 时,打表发现第 \(i\) 个数对答案产生的贡献为 \(a_i \times i \times (n-i+1)\) 。
      • 证明:
    • \(d=2\) 时,比AT_agc005_b [AGC005B] Minimum Sum多维护一个最大值,差别不大。
    • \(d=3\) 时,

T2 Present \(100pts\)

  • luogu B3656 【模板】双端队列 1 变形,用数组模拟或 \(deque\) 维护数列,考虑开一个 \(bool\) 类型的 \(flag\) 记录是否进行颠倒。
    • 每次颠倒时,将 \(flag\) 取反即可。
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long 
    #define sort stable_sort 
    #define endl '\n'
    deque<ll>q;
    int main()
    {
        freopen("prs.in","r",stdin);
        freopen("prs.out","w",stdout);
        ll n,id,pd,x,i;
        bool flag=false;
        scanf("%lld%lld",&n,&id);
        for(i=1;i<=n;i++)
        {
            scanf("%lld",&pd);
            if(pd==0)
            {
                scanf("%lld",&x);
                if(flag==false)
                {
                    q.push_front(x);
                }
                else
                {
                    q.push_back(x);
                }
            }
            if(pd==1)
            {
                if(q.empty()==0)
                {
                    if(flag==false)
                    {
                        printf("%lld\n",q.front());
                        q.pop_front();
                    }
                    else
                    {
                        printf("%lld\n",q.back());
                        q.pop_back();
                    }
                }
                else
                {
                    printf("0\n");
                }
            }
            if(pd==2)
            {
                scanf("%lld",&x);
                if(flag==false)
                {
                    q.push_back(x);
                }
                else
                {
                    q.push_front(x);
                }
            }
            if(pd==3)
            {
                if(q.empty()==0)
                {
                    if(flag==false)
                    {
                        printf("%lld\n",q.back());
                        q.pop_back();
                    }
                    else
                    {
                        printf("%lld\n",q.front());
                        q.pop_front();
                    }
                }
                else
                {
                    printf("0\n");
                }
            }
            if(pd==4)
            {
                flag=(!flag);
            }
        }
        return 0;
    }  
    
  • 貌似是首A。

T3 Future \(100pts\)

  • 类似luogu P1807 最长路 ,但本题是一棵树,跑 树形 \(DP\) , \(SPFA\) , 拓扑优化 \(DP\) 求最长路 等做法皆可。
    • 树形 \(DP\) 的一种做法,令 \(dp[i]\) 表示以 \(i\) 为终点时,所得到的收获值,则有状态转移方程 \(dp[i]=dp[f[i]]+w[i]\) 。
  • 坑:点权有负数,输出结果应初始化为 \(-\infty\) 。
    • 最后 \(40min\) 检查时才发现,差点挂了 \(10pts\) 。
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long 
    #define sort stable_sort 
    #define endl '\n'
    struct node
    {
        ll nxt,to;
    }e[400001];
    ll w[400001],f[400001],head[400001],dout[400001],cnt=0;//注意与上文数组定义不同
    void add(ll u,ll v)
    {
        cnt++;
        e[cnt].nxt=head[u];
        e[cnt].to=v;
        head[u]=cnt;
    }
    void dfs(ll x,ll fa)
    {
        f[x]=f[fa]+w[x];
        for(ll i=head[x];i!=0;i=e[i].nxt)
        {
            if(e[i].to!=fa)
            {
                dfs(e[i].to,x);
            }
        }
    }
    int main()
    {
        freopen("ftr.in","r",stdin);
        freopen("ftr.out","w",stdout);
        ll n,i,u,ans=-0x7f7f7f7f;
        scanf("%lld",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%lld",&w[i]);
        }
        for(i=1;i<=n;i++)
        {
            scanf("%lld",&u);
            add(u,i);
            dout[u]++;//统计出度,为了找到终点
        }
        dfs(1,0);
        for(i=1;i<=n;i++)
        {
            if(dout[i]==0)
            {
                ans=max(ans,f[i]);
            }
        }
        printf("%lld\n",ans);
        return 0;
    }  
    

T4 Beyond \(0pts\)

  • \(2 \le n \le 20\)
  • 部分分:
    • \(10pts\) :输出 0
  • 正解:考虑爆搜(明显的暗示,其实是 \(meet\) \(in\) \(middle\) ),分别从 \((1,1),(n,n)\) 进行爆搜,当到达绿色区域(当下)时,将所得到的值分别用两个 \(map\) 进行存储,又因为在绿色区域(当下)可以进行传送至另一个绿色区域(当下),然后利用加法原理和乘法原理求解。
    • 对于每个 \(past\) 在 \(future\) 中用 \(map\) 的 \(.find()\) 或其他方式寻找 \(past+fate\) 出现的次数,即可进行求解。
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long 
    #define sort stable_sort 
    #define endl '\n'
    ll c[21][21],f[21][21],dil[2][2]={{1,0},{0,1}},dir[2][2]={{-1,0},{0,-1}};
    map<ll,ll>l,r;
    map<ll,ll>::iterator it,val;
    void dfs1(ll x,ll y,ll n,ll num)
    {
        if(y==n-x+1)
        {
            l[num]++;
        }
        else
        {
            ll i,nx,ny;
            for(ll i=0;i<=1;i++)
            {
                nx=x+dil[i][0];
                ny=y+dil[i][1];
                if(1<=nx&&nx<=n&&1<=ny&&ny<=n)
                {
                    dfs1(nx,ny,n,num^c[nx][ny]);
                }
                
            }
        }
    }
    void dfs2(ll x,ll y,ll n,ll num)
    {
        if(y==n-x+1)
        {
            r[num]++;
        }
        else
        {
            ll i,nx,ny;
            for(ll i=0;i<=1;i++)
            {
                nx=x+dir[i][0];
                ny=y+dir[i][1];
                if(1<=nx&&nx<=n&&1<=ny&&ny<=n)
                {
                    dfs2(nx,ny,n,num^c[nx][ny]);
                }
            }
        }
    }
    int main()
    {
        freopen("byd.in","r",stdin);
        freopen("byd.out","w",stdout);
        ll n,fate,i,j,ans=0,sum;
        scanf("%lld%lld",&n,&fate);
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                scanf("%lld",&c[i][j]);
            }
        }
        dfs1(1,1,n,0);
        dfs2(n,n,n,0);
        for(it=l.begin();it!=l.end();it++)
        {
            val=r.find(it->first+fate);
            if(val!=r.end())
            {
                ans+=(it->second)*(val->second);//将两个数出现的次数相乘
            }
        }
        printf("%lld\n",ans);
        return 0;
    }  
    

总结

  • 十年 \(OI\) 一场空,不开 \(long\) \(long\) 见祖宗。
  • 本次开题顺序: \((T2,T3,T1,T4)\) ,在这里没有掉进出题人的坑里。

  • \(T4\) 没有再认真想想,如果想到爆搜的话可能分数再高点(?)。
  • 注意文件输入输出

后记

标签:sort,普及,ll,400001,cnt,long,模拟,define
From: https://www.cnblogs.com/The-Shadow-Dragon/p/17635690.html

相关文章

  • Autodesk Navisworks Manage 2024 (建筑工程项目模拟和协作软件)中文永久使用
    AutodeskNavisworksManage2024是一款强大的协同项目管理软件,旨在帮助建筑、工程和施工行业的专业人士更高效地进行项目协调和冲突检测。下面将详细介绍NavisworksManage2024的功能和特点。点击获取AutodeskNavisworksManage2024 模拟和可视化:NavisworksManage......
  • ThingsKit物联网平台模拟网关+子设备MQTT接入
    准备工作MQTTX设备模拟工具下载MQTTX是由EMQ开发的一款开源跨平台MQTT5.0桌面客户端,它兼容macOS,Linux以及Windows系统。MQTTX的用户界面UI采用聊天式设计,使得操作逻辑更加简明直观。它支持用户快速创建和保存多个MQTT连接,便于测试MQTT/MQTTS连接,以及MQTT消息的订阅和发布。M......
  • ThingsKit物联网平台模拟HTTP设备接入
    准备工作POSTMAN设备模拟工具下载POSTMAN是一款支持HTTP协议的接口调试与测试工具,其主要特点就是功能强大,使用简单且易用性好。无论是开发人员进行接口调试,还是测试人员做接口测试,POSTMAN都是首选工具之一。Postman平台创建虚拟设备创建直连测试产品:::info......
  • ThingsKit物联网平台模拟TCP设备接入
    准备工作TCP设备模拟工具下载NetAssist网络调试助手,是Windows平台下开发的TCP/IP网络调试工具,集TCP/UDP服务端及客户端于一体,是网络应用开发及调试工作必备的专业工具之一,可以帮助网络应用设计、开发、测试人员检查所开发的网络应用软/硬件的数据收发状况,提高开发速度,简化开发......
  • ThingsKit物联网平台模拟直连设备MQTT接入
    准备工作MQTTX设备模拟工具下载MQTTX是由EMQ开发的一款开源跨平台MQTT5.0桌面客户端,它兼容macOS,Linux以及Windows系统。MQTTX的用户界面UI采用聊天式设计,使得操作逻辑更加简明直观。它支持用户快速创建和保存多个MQTT连接,便于测试MQTT/MQTTS连接,以及MQTT消息的订阅和发布。M......
  • CSP模拟21
    CSP模拟21T1GetP5999把跳的顺序转换为填数。对于一个位置,两边填的数都要小于或都大于它才符合题意。我们按照从小到大的顺序插入数字,这样保证填的位置左右都小于它。设\(dp_{i,j}\)表示填了\(i\)个数,分成了\(j\)个块的方案数。考虑添加一个数,我们有三种情况。\(i\)......
  • Windows上使用FFmpeg实现本地视频推送模拟海康协议rtsp视频流
    场景Nginx搭建RTMP服务器+FFmpeg实现海康威视摄像头预览:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/121202130上面记录的是使用FFmpeg拉取海康协议摄像头的rtsp流并推流到流媒体服务器。如果在其它业务场景下需要本地的视频文件模拟海康的rtsp流协议格式进行......
  • 模拟集成电路设计系列博客——1.1.1 基本电流镜
    1.1.1基本电流镜基本电流镜的结构如下图所示,两个晶体管都工作于饱和区,假设晶体管\(Q_1\)和\(Q_2\)完全匹配,并忽略晶体管有限输出阻抗的影响,那么\(Q_1\)和\(Q_2\)将会因为相同的栅压\(V_{gs}\)而输出相同的电流。然而如果考虑晶体管有限的输出阻抗,那么有着更大漏源电压的晶体管将......
  • 模拟修改客户端访问服务器时的IP方法
    产品需求有时候需要区分白名单城市和非白名单城市,例如:北上广深访问页面A,返回一套数据B,其他城市访问页面A,返回另一套数据C。这时候我们就需要通过一定的方法才能测试覆盖到这个场景。两个方法:1、使用第三方网络代理,代理到其他城市的网络环境(这里就不细说了,缺点就是网速不稳定,可......
  • 晚上切模拟122行祭
    #include<bits/stdc++.h>#definelllonglong#defineullunsignedlonglong#defineldlongdouble#definegcd(a,b)__gcd(a,b)usingnamespacestd;constintINF=INT_MAX;intn,m,g;map<int,int>region[1005];structNode{ intr; intcnt; ma......