首页 > 其他分享 >『模拟赛』暑假集训CSP提高模拟22

『模拟赛』暑假集训CSP提高模拟22

时间:2024-08-16 20:26:28浏览次数:11  
标签:qr 22 ed st ch else CSP 模拟 op

Rank

非常好重测,使我 Rank--

image

A. 法阵

原[CF1503E] 2-Coloring

出题人注:原题 3100,张口放 T1

一眼高难度题,于是果断开始暴力打表,但我的打表程序十分暴力,跑 \(n=6,m=9\) 的点就已经开始硬控了,遂只拿到 30pts。

打表就不用放了吧,等我咕咕正解。

B. 连通块

同[yLCPC2024] F. PANDORA PARADOXXX

真正的 T1。

赛时由于 T1 的搞心态以及极冷的室内环境,让我几乎没有办法去想暴力以外的东西。考虑对于每次询问,对询问的该点进行 bfs,删边的话只需要在建边的时候加个序号记一下就行,可以过 50pts;然后对于链的情况,我直接用线段树维护每个区段所属的连通块序号,以及每个联通块的左右边界,实现了 \(\mathcal{O(1)}\) 查询,\(\mathcal{O(\log n)}\) 修改,再过 10pts。

正解是倒过来做,删边操作变成建边操作,每次建边相当于一次树上启发式合并,维护树上直径信息就行了。

点击查看代码

求 LCA 用的倍增,常数较大,酌情参考。

#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)=(y);(x)>=(z);(x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
	char ch=getchar();lx x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
const int Ratio=0;
const int N=2e5+5;
const int mod=998244353;
int n,m;
int hh[N],to[N<<1],ne[N<<1],cnt;
int dfn[N],dep[N],tot,fx[N][20],ans[N],ttot;
bool yz[N];
struct edge{int u,v;}e[N];
struct OP{int op,x;}p[N];
struct rmm{int fx,l,r,dis;}fa[N];
namespace Wisadel
{
    int Wfind(int x)
    {
        if(x==fa[x].fx) return x;
        return fa[x].fx=Wfind(fa[x].fx);
    }
    void Wadd(int u,int v)
    {
        to[++cnt]=v;
        ne[cnt]=hh[u];
        hh[u]=cnt;
    }
    void Wdfs(int u,int fa)
    {
        fx[u][0]=fa,dfn[u]=++tot,dep[u]=dep[fa]+1;
        fo(i,1,18) fx[u][i]=fx[fx[u][i-1]][i-1];
        for(int i=hh[u];i!=-1;i=ne[i])
        {
            int v=to[i];
            if(v==fa) continue;
            Wdfs(v,u);
        }
    }
    int Wlca(int x,int y)
    {
        if(dep[x]<dep[y]) swap(x,y);
        fu(i,18,0) if((1<<i)<=dep[x]-dep[y]) x=fx[x][i];
        if(x==y) return x;
        fu(i,18,0) if(fx[x][i]!=fx[y][i]) x=fx[x][i],y=fx[y][i];
        return fx[x][0];
    }
    int Wgdis(int u,int v)
    {
        if(u==v) return 0;
        return dep[u]+dep[v]-2*dep[Wlca(u,v)];
    }
    void Wmerge(int i)
    {
        int u=Wfind(e[i].u),v=Wfind(e[i].v);
        fa[u].fx=v;
        int maxx=max(Wgdis(fa[u].l,fa[v].l),Wgdis(fa[u].l,fa[v].r));
        maxx=max(maxx,max(Wgdis(fa[u].r,fa[v].l),Wgdis(fa[u].r,fa[v].r)));
        maxx=max(maxx,max(fa[u].dis,fa[v].dis));
        if(Wgdis(fa[u].l,fa[v].l)==maxx){
            fa[v].dis=Wgdis(fa[u].l,fa[v].l),
            fa[v].r=fa[u].l;
            return;
        }
        if(Wgdis(fa[u].r,fa[v].l)==maxx){
            fa[v].dis=Wgdis(fa[u].r,fa[v].l),
            fa[v].r=fa[u].r;
            return;
        }
        if(Wgdis(fa[u].l,fa[v].r)==maxx){
            fa[v].dis=Wgdis(fa[u].l,fa[v].r),
            fa[v].l=fa[u].l;
            return;
        }
        if(Wgdis(fa[u].r,fa[v].r)==maxx){
            fa[v].dis=Wgdis(fa[u].r,fa[v].r),
            fa[v].l=fa[u].r;
            return;
        }
        if(fa[u].dis==maxx){
            fa[v].dis=fa[u].dis,
            fa[v].l=fa[u].l,fa[v].r=fa[u].r;
            return;
        }
    }
    short main()
    {
        freopen("block.in","r",stdin),freopen("block.out","w",stdout);
        n=qr,m=qr;
        memset(hh,-1,sizeof hh);
        fo(i,1,n)fa[i]={i,i,i,0};
        fo(i,1,n-1)
            e[i].u=qr,e[i].v=qr,Wadd(e[i].u,e[i].v),Wadd(e[i].v,e[i].u);
        Wdfs(1,0);
        fo(i,1,m)
        {
            p[i].op=qr,p[i].x=qr;
            if(p[i].op==1) yz[p[i].x]=1;
        }
        fo(i,1,n-1) if(!yz[i]) Wmerge(i);
        fu(i,m,1)
            if(p[i].op==1) Wmerge(p[i].x);
            else
            {
                int _=p[i].x,__=Wfind(_);
                ans[++ttot]=max(Wgdis(fa[__].l,_),Wgdis(fa[__].r,_));
            }
        fu(i,ttot,1) printf("%d\n",ans[i]);
        return Ratio;
    }
}
int main(){return Wisadel::main();}

C. 军队

题面挺抽象的。

大概就是划分成两个问题,一是需要 \(\mathcal{O(n)}\) 求出各队的性别情况,要用到扫描线,二是对于询问求最大值,相比而言第二步较简单些。

赛时没想到扫描线,只会 \(\mathcal{O(n^3)}\) 处理性别,遂只打暴力 20pts。

正解咕咕咕。

D. 棋盘

逆天要 4 个栈。

一眼简单,再一眼困难。

可恶啊赛时没想到过河卒(忘得挺彻底的,遂只打暴力 bfs,只过 \(n=2\) 的 10pts。

用过河卒的方法每次清空 dp 数组可以拿到 30pts 的暴力分。

40pts 代码
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)=(y);(x)>=(z);(x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
	char ch=getchar();lx x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
const int Ratio=0;
const int N=1e5+5;
const int mod=998244353;
int n,q,to,ans;
int dh[N][22],st=1,ed;
int yz[N][22],f[N][22];
namespace Wistask
{
    void Wdfs(int nowh,int nowl)
    {
        if(nowh==ed)
        {
            if(nowl==to) ans=(ans+1)%mod;
            return;
        }
        if(nowl==1)
        {
            if(dh[nowh+2][2]!=1) Wdfs(nowh+2,2);
            return;
        }
        else
        {
            if(dh[nowh+2][1]!=1) Wdfs(nowh+2,1);
            return;
        }
    }
    short main()
    {
        while(q--)
        {
            string op,s;cin>>op;
            if(op=="Add")
            {
                cin>>s;ed++;
                fo(i,0,n-1) dh[ed][i+1]=(s[i]=='#');
            }
            else if(op=="Del") st++;
            else
            {
                int a=qr;to=qr;ans=0;
                if(st>ed||(ed-st)&1||dh[st][a]==1){printf("0\n");continue;}
                Wdfs(st,a);
                printf("%d\n",ans);
            }
        }
        return Ratio;
    }
}
namespace Wisadel
{
    short main()
    {
        // freopen(".in","r",stdin),freopen(".out","w",stdout);
        freopen("chess.in","r",stdin),freopen("chess.out","w",stdout);
        n=qr,q=qr;
        // printf("%lf\n",1.0*sizeof(dh)/1024/1024);
        if(n==1)
        {
            while(q--)
            {
                string op,s;cin>>op;int a,b;
                if(op=="Add") cin>>s;
                else if(op=="Del") continue;
                else a=qr,b=qr,printf("0\n");
            }
            return Ratio;
        }
        if(n==2) return Wistask::main();
        while(q--)
        {
            string op,s;cin>>op;
            if(op=="Add")
            {
                cin>>s;ed++;
                fo(i,0,n-1) dh[ed][i+1]=(s[i]=='#');
            }
            else if(op=="Del") st++;
            else
            {
                int a=qr;to=qr;ans=0;
                memset(f,0,sizeof f);
                if(dh[st][a]!=1) f[st][a]=1;
                else {printf("0\n");continue;}
                fo(i,st+1,ed) fo(j,1,n)
                {
                    if(dh[i][j]) continue;
                    if(i-st>=2)
                    {
                        if(j>1) f[i][j]=(f[i][j]+f[i-2][j-1])%mod;
                        if(j+1<=n) f[i][j]=(f[i][j]+f[i-2][j+1])%mod;
                    }
                    if(i-st>=1)
                    {
                        if(j>2) f[i][j]=(f[i][j]+f[i-1][j-2])%mod;
                        if(j+2<=n) f[i][j]=(f[i][j]+f[i-1][j+2])%mod;
                    }
                }
                printf("%d\n",f[ed][to]);
            }
        }
        return Ratio;
    }
}
int main(){return Wisadel::main();}

直接从 CSP 模拟晋升到 NOIP 模拟,难度直线上升。

看到 pdf 就觉得不对劲了,不是牛犇外校大佬出题就是逆天私题,果然被薄纱了。

打暴力手法还有欠缺,不过好在今天学到了新(确信 东西——树上连通块转移直径,不算荒了。

越来越冷了,虽然空调不直对着我(要真直对着估计早寄了,感觉这样下去过几天就也感冒发烧了,悲。


完结撒花~

标签:qr,22,ed,st,ch,else,CSP,模拟,op
From: https://www.cnblogs.com/Ratio-Yinyue1007/p/18363585

相关文章

  • 热血江湖:发布网www.SouFu6.cn,新开热血江湖来袭!22
           热血江湖:发布网www.SouFu6.cn,新开热血江湖来袭!141       私服SF有着许多独特的品质,使其与正版游戏区别开来。首先,私服SF通常会提供大量的游戏元素和功能,比如新增的职业、装备、地图等,让玩家能够体验到更丰富的游戏内容。其次,私服SF还通常会......
  • 在macOS上运行SQL Server 2022进行数据库开发
    有很多工具可用于在macOS上使用SQL进行开发,包括VSCode的mssql扩展和独立但舒适的AzureDataStudio。作为一名开发人员,您可能听说过AzureSQL数据库模拟器,并且您肯定听说过在容器中部署SQL。最近,在arm64(M1/M2)Mac上本地运行SQL容器的新选项变得可用,它使运行完整的SQLServer映......
  • 暑假集训csp提高模拟22
    赛时rank24,T120,T266,T30,T410T1*3100,T2逆天trick,T3抽象题面,T4也挺抽象反正是暴力专场T1、T3、T4太抽象了,不会,直接挂的官方题解可能模拟赛难度为强紫+弱紫/强蓝+紫+紫?调了一个最简单的T2,学习一下这个trick。我树套树还没写玩呢T1法阵2-Coloring原题3100,张口放......
  • day22 Java基础——方法(干货)
    day22Java基础——方法在Java中,方法是一段组织好的、可重复使用的代码块,用于执行一个特定的操作。方法提供了一种封装代码的方式,使得代码模块化,便于管理和重用。以下是关于Java中方法的一些基本介绍:文章目录day22Java基础——方法1.方法的定义2.方法的调用2.1方法......
  • 反悔贪心 & 模拟费用流
    反悔贪心&模拟费用流参考资料来源cyt前言很多找到一种可行的方案,匹配(选择)某些东西,使价值最优化的问题可以建出费用流模型。但是直接跑费用流的复杂度是不对的。我们又想到可以用简单的贪心思路解决这些问题,然而一般的贪心都假掉了。于是我们考虑模拟费用流的退流操作来做......
  • Ubuntu22.04 安装及卸载 Docker --需自行找加速站
    Ubuntu22.04DockerEngine的安装及卸载如果没有合适的docker镜像加速站,本文就不太重要了。当前时间2024.8.16参照Docker官网描述的Ubuntu安装方式。文中所有shell均来自官网,并进行了本地化修改。当前操作适用于:UbuntuNoble24.04(LTS)UbuntuJammy22.04(LTS)......
  • AGC022E Median Replace
    传送门题意:给定长度为奇数的01?串,问多少种填法使得串可以变成\(1\)。一次操作定义为把连续三个数变成它们的中位数。这种计数题可以先考虑怎么判定一个串是否可以变成\(1\),称作合法。根据人类智慧,可以想到\(000S\)合法\(\iff\)\(0S\)合法,进而启示我们考虑串\(S\)的......
  • win10安装wsl+Ubuntu22.04+docker记录
    1.安装wsl2.0,开启hyper-V虚拟化2.在微软商店下载Ubuntu22.04并进行安装打开命令提示符或PowerShell作为管理员//设置WSL默认版本wsl--set-default-version2//查看状态名称wsl-l-v//停止wsl--terminateUbuntu-22.04//启动wsl-dUbuntu-22.04wsl运行一段时......
  • A-CSPO课程概念澄清和实操:假定(Assumptions)、实验(Experiments)、假设(Hypotheses)
    “确保你把这当作一个实验。”“我们的工作假设是客户想要这个。”这些场景熟悉吗?你的团队(或整个组织)可能会经常混淆假定(Assumptions)、实验(Experiments)和假设(Hypotheses)等术语,这会造成混乱。让我们澄清一下每一个术语的含义。假定是关于我们认为某个想法的正确性的陈述......
  • 【网络工程师模拟面试题】(1)ARP、MAC与Trunk
    一、二层交换机和三层交换机的区别这道面试题主要考验以下几个方面的知识点:网络基础知识对数据链路层和网络层的理解,包括这两层的功能、作用和相关协议。交换机工作原理深入了解二层交换机和三层交换机分别如何处理数据帧和数据包的转发。网络架构和规划考查面试......