首页 > 其他分享 >暑假集训csp提高模拟22

暑假集训csp提高模拟22

时间:2024-08-16 19:05:23浏览次数:7  
标签:false 22 int long 集训 FILE ans using csp

赛时 rank24,T1 20,T2 66,T3 0,T4 10

T1 *3100,T2逆天trick,T3 抽象题面,T4 也挺抽象

反正是暴力专场

T1、T3、T4太抽象了,不会,直接挂的官方题解

可能模拟赛难度为强紫+弱紫/强蓝+紫+紫?

调了一个最简单的T2,学习一下这个trick。

我树套树还没写玩呢

T1 法阵

2-Coloring

原题3100,张口放T1

我会打暴力

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = infile("magic.in"),*OutFile = outfile("magic.out");
    //FILE *ErrFile = stderr;
#endif
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
const int N = 2010,mod = 998244353;
int n,m;
vector<int> ok;
int last[N],ans = 0;
void dfs(int now){
    if(now == n + 1){
        for(int i = 1;i <= m; ++i){
            bool flag = false,pd = false;
            int tot = 0;
            for(int j = 1;j <= n; ++j){
                bool _ = (last[j]>>(i-1))&1;
                if(!_ && pd && flag) return;
                pd = _;
                if(!_) flag = true;
                if(_) tot++;
            }
            if(tot == n) return;
        }
        ans++;
        return;
    }
    for(auto i : ok){
        last[now] = i;
        dfs(now+1);
    }
}
inline void solve(){
    cin>>n>>m;
    auto OO = [](int x) -> bool{
        bool flag = false,pd = false;
        while(x){
            bool _ = x&1;
            if(_ && !pd && flag) return false;
            pd = _;
            if(_) flag = true;
            x>>=1;
        }
        return true;
    };
    for(int i = 1;i < (1<<m); ++i){
        if(OO(i)) ok.push_back(i);
    }
    dfs(1);
    cout<<ans;
}
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
    solve();
}

image

image

T2 连通块

弱化版 : [yLCPC2024] F. PANDORA PARADOXXX

强化版 : [USACO18FEB] New Barns P

trick + 经典结论

trick :

将询问离线,从后往前,将删边转变为加边

经典结论 :

两个连通块合并后最远点对一定是在两个连通块最远点对中出现的

证明 :

假设两个连通块是通过\((x,y)\)相连的,两个连通块内的最远点对分别为\((a,b),(c,d)\)

若合并后的连通块的最远点对不经过\((x,y)\),则一定为\((a,b)\)或者\((c,d)\)

反之,我们有离\(x\)最远的一定为\(a,b\)中的一个,离\(y\)最远的一定有\(c,d\)中的一个,所以最远点对存在于\(\{a,b,c,d\}\)中

然后我们将所有操作离线下来。

对于询问,利用\(dis_{x\rightarrow y} = dis_{1\rightarrow x} + dis_{1\rightarrow y} - 2\times dis_{1\rightarrow LCA(x,y)}\),我们可以求\(x\)到所在连通块点对的距离取\(\max\)

对于修改,利用上述结论,维护最远点对即可,时间复杂度为\(O(\log n)\)的。

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = infile("block.in"),*OutFile = outfile("block.out");
    //FILE *ErrFile = stderr;
#endif
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
const int N = 2e5 + 10;
int n,m,u[N],v[N];
struct EDGE{int to,next;}edge[N<<1];
int head[N],cnt;
inline void add(int u,int v){
    edge[++cnt] = {v,head[u]};
    head[u] = cnt;
}
int dist[N],fa[N];
int get_fa(int x){return (x == fa[x]?x:fa[x] = get_fa(fa[x]));}
namespace TCS{
    int fa[N],dep[N],siz[N],son[N],top[N];
    void dfs1(int x){
        siz[x] = 1;
        dep[x] = dep[fa[x]] + 1;
        for(int i = head[x]; i;i = edge[i].next){
            int y = edge[i].to;
            if(y == fa[x]) continue;
            dist[y] = dist[x] + 1;
            fa[y] = x;dfs1(y);
            siz[x] += siz[y];
            if(siz[son[x]] < siz[y]) son[x] = y;
        }
    }
    void dfs2(int x,int t){
        top[x] = t;
        if(son[x]) dfs2(son[x],t);else return;
        for(int i = head[x]; i;i = edge[i].next){
            int y = edge[i].to;
            if(y == fa[x] || y == son[x]) continue;
            dfs2(y,y);
        }
    }
    inline int LCA(int x,int y){
        int fx = top[x],fy = top[y];
        while(fx != fy){
            if(dep[fx] < dep[fy]) swap(fx,fy),swap(x,y);
            x = fa[fx];
            fx = top[x];
        }
        if(dep[x] > dep[y]) swap(x,y);
        return x;
    }
}
using TCS::dfs1;using TCS::dfs2;using TCS::LCA;
int ver[N][3];
inline void Merge(int x,int y){
    x = get_fa(x),y = get_fa(y);
    vector<int> may;
    for(int i = 1;i <= 2; ++i) 
        may.emplace_back(ver[x][i]),
        may.emplace_back(ver[y][i]);
    int res = 0,ver1,ver2;
    for(int i = 0;i < 3; ++i){
        for(int j = i + 1;j < 4; ++j){
            int x = may[i],y = may[j];
            int dis = dist[x] + dist[y] - dist[LCA(x,y)]*2;
            if(res < dis){
                res = dis;
                ver1 = x,ver2 = y;
            }
        }
    }
    fa[x] = y,ver[y][1] = ver1,ver[y][2] = ver2;
}
inline int Get_ans(int x){
    int fx = get_fa(x);
    int res1 = dist[ver[fx][1]] + dist[x] - 2*dist[LCA(ver[fx][1],x)];
    int res2 = dist[ver[fx][2]] + dist[x] - 2*dist[LCA(ver[fx][2],x)];
    return max(res1,res2);
}
struct node{int op,x;}q[N];
vector<int> ans;
inline void solve(){
    cin>>n>>m;
    for(int i = 1;i < n; ++i) cin>>u[i]>>v[i],add(u[i],v[i]),add(v[i],u[i]);
    for(int i = 1;i <= m; ++i) cin>>q[i].op>>q[i].x;
    dfs1(1),dfs2(1,1);
    for(int i = 1;i <= n; ++i) fa[i] = i,ver[i][1] = ver[i][2] = i;
    bitset<N> ok;
    for(int i = 1;i <= m; ++i) if(q[i].op == 1) ok[q[i].x] = true;
    for(int i = 1;i < n; ++i) if(!ok[i]) Merge(u[i],v[i]);
    for(int i = m;i >= 1; --i){
        if(q[i].op == 1) Merge(u[q[i].x],v[q[i].x]);
        else ans.emplace_back(Get_ans(q[i].x));
    }
    reverse(ans.begin(),ans.end());
    for(auto i : ans) cout<<i<<'\n';
}
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
    solve();
}

T3 军队

image

T4 棋盘

image

出题人的碎碎念 :

image

标签:false,22,int,long,集训,FILE,ans,using,csp
From: https://www.cnblogs.com/hzoi-Cu/p/18363470

相关文章

  • day22 Java基础——方法(干货)
    day22Java基础——方法在Java中,方法是一段组织好的、可重复使用的代码块,用于执行一个特定的操作。方法提供了一种封装代码的方式,使得代码模块化,便于管理和重用。以下是关于Java中方法的一些基本介绍:文章目录day22Java基础——方法1.方法的定义2.方法的调用2.1方法......
  • 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)等术语,这会造成混乱。让我们澄清一下每一个术语的含义。假定是关于我们认为某个想法的正确性的陈述......
  • 力扣 | 一维简单线性dp | 2140. 解决智力问题、322. 零钱兑换、2466. 统计构造好字符
    文章目录一、2140.解决智力问题二、322.零钱兑换三、2466.统计构造好字符串的方案数四、91.解码方法五、983.最低票价六、790.多米诺和托米诺平铺需要特别注意的题目有2140.解决智力问题和983.最低票价,因为这两个题目可以启发思路,其他的题都比较普通。一、21......
  • 栈与计算—— 150、227、224※
    150.逆波兰表达式求值(中等)给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算符为 '+'、'-'、'*' 和 '/' 。每个操作数(运算对象)都可以是一个整数或者另一个表达式。两个整数......
  • 暑假集训csp提高模拟21
    赛时rank47,T120,T20,T330,T445赛时最后想到了T1的正解,可惜没有打出来。整场比赛都在死磕T1的神秘构造,导致本来可以AC的T2没有写,开题的策略不行,太容易死磕了。T1黎明与萤火DestructionofaTree贪心构造。先给一组数据Input:501234Output:YES24135......
  • 2024暑假集训测试25
    前言比赛链接。一上来就感觉T4最可做,发现T4题面假了,去找学长改了,让后第一反应二分哈希,怎么调大样例都过不去,异常上火,狂调一个半小时才想起来丫的这玩意儿没有单调性,然后就崩了。结果T4string用死了挂成\(0\)分了还。T2是水板子但是不会那个板子,心态者了T1也没搞......
  • [lnsyoj2271/luoguP3745/省选联考 2017]期末考试
    题意给定长度为\(n\)的序列\(t\)和长度为\(m\)的序列\(b\),以及常数\(A,B,C\),可以进行两种操作:选取任意\(1\lex,y\len\),并使\(b_x+1,b_y-1\),记进行了\(\alpha\)次这种操作;选取任意\(1\lez\len\),并使\(b_z-1\),记进行了\(\beta\)次这种操作。求进......