首页 > 其他分享 >CSP 模拟 7

CSP 模拟 7

时间:2024-07-28 09:00:16浏览次数:8  
标签:std ch int long num CSP 模拟 size

T1 Permutations & Primes

\(2,3\) 放两边,\(1\),放中间,易证最优。

T2 树上游戏

原题 [ARC116E] Spread of Information
二分是明显的,关键在 check,发现每次选最深的叶子节点的 \(mid\) 级父亲一定不劣,因为它能够覆盖最多。然后每次找就行,实现比较麻烦。
设 \(f_i\) 表示 \(i\) 的子树内最远未被覆盖的点的距离,\(g_i\) 表示 \(i\) 的子树内最近是关键点的距离。初值 \(f\) 负无穷,表示被覆盖,\(g\) 正无穷,表示还没有关键点。然后分讨进行转移。

点击查看代码
#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
inline int read(){char ch=getchar();int 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;}
const int N=2e5+10;
int n,k,mid,res=0,f[N],g[N],dep[N];
std::vector<int> e[N];
bool vis[N];
inline void dfs(int u,int fa){
	f[u]=-N,g[u]=N;
    for(int v:e[u]){
    	if(v==fa)continue;
    	dfs(v,u);
    	f[u]=std::max(f[u],f[v]+1);
    	g[u]=std::min(g[u],g[v]+1);
    }
   	if(f[u]+g[u]<=mid)f[u]=-N;
   	if(g[u]>mid){
   		f[u]=std::max(f[u],0);
   	}
   	if(f[u]==mid){
   		f[u]=-N,g[u]=0,++res;
   	}
}
signed main(){
	// freopen("in.in","r",stdin);freopen("out.out","w",stdout);
	std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
	n=read(),k=read();
	for(int i=2;i<=n;++i){int u=read(),v=read();e[u].emplace_back(v);e[v].emplace_back(u);}
    int l=1,r=n,ans=0;
	r=n/k+1;
    while(l<=r){
        mid=l+r>>1;
        res=0;
        dfs(1,0);
        res+=f[1]>=0;
        if(res<=k)ans=mid,r=mid-1;
        else l=mid+1;
    }   
    std::cout<<ans<<'\n';
}
  • \(f_i+g_i\le mid\) 表示这个点子树内的可以全覆盖,不需要进行覆盖。\(f_i=-inf\)
  • \(g_i>mid\) 时,不呢覆盖当前节点,需要父亲来覆盖,\(f_i=\max(f_i,0)\)
  • \(f_i=mid\) 是,这个点不得不覆盖了,\(f_i=-inf,g_i=0\),答案加一。
    对于最后的根节点,需要查看是否覆盖来增加答案。

T3 Ball Collector

原题 [ABC302Ex] Ball Collector
自然想到颜色连边,然后发现连成一棵树(\(n-1\) 条边,无自环)时可以拿到 \(n-1\) 种颜色,否则可以拿到 \(n\) 种颜色。
因为我们是按照边拿,对于树的话,从叶子开始拿最大,根节点拿不了,所以是 \(n-1\) 种颜色。
如果有环的话,就可以少贡献一条边,从而全拿。
知道这个之后就直接上可撤销并查集维护图的形态即可,因为要维护图的具体形态,所以不能路径压缩。

点击查看代码
#include<bits/stdc++.h>
#define int long long
typedef long long ll;
typedef unsigned long long ull;
inline int read(){char ch=getchar();int 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;}
const int N=4e5+10;
int n,a[N],b[N],dep[N],ANS[N],ans,num[N],size[N],tag[N],top,fa[N];
std::pair<int,int> st[N<<1];
std::vector<int> e[N];
inline int find(int x){return fa[x]==x?x:find(fa[x]);}
inline void add(int x,int y){
    x=find(x);y=find(y);top++;
    if(x==y){
        if(num[x]==size[x]-1)ans++,tag[top]=1;
        num[x]++,st[top]={-1,x};
    }else{
        if(size[x]>size[y])std::swap(x,y);
        if(num[x]==size[x]-1||num[y]==size[y]-1)ans++,tag[top]=1;
        size[y]+=size[x];fa[x]=y;st[top]={x,y};
        num[y]+=num[x]+1;
    }
}
inline void del(int id){
    if(st[id].first==-1)num[st[id].second]--;
    else{int x=st[id].first,y=st[id].second;fa[x]=x;size[y]-=size[x];num[y]-=num[x]+1;}
    if(tag[id])ans--;
    tag[id]=0;st[id]={0,0};
}
inline void dfs(int u,int fa){
    int cur=top;
    add(a[u],b[u]);
    ANS[u]=ans;
    for(int v:e[u])if(v!=fa)dfs(v,u);
    while(top>cur)del(top--);
}
signed main(){
    // freopen("in.in","r",stdin);freopen("out.out","w",stdout);
    std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
    n=read();
    for(int i=1;i<=n;++i)a[i]=read(),b[i]=read();
    for(int i=2;i<=n;++i){
        int u=read(),v=read();
        e[u].emplace_back(v);e[v].emplace_back(u);
    }
    for(int i=1;i<=n;++i)size[i]=1,fa[i]=i;
    dfs(1,0);
    for(int i=2;i<=n;++i)std::cout<<ANS[i]<<' ';
}

T4 满穗

不会。

标签:std,ch,int,long,num,CSP,模拟,size
From: https://www.cnblogs.com/Ishar-zdl/p/18327859

相关文章

  • c语言模拟Python的命名参数
    最近在书里看到的,让c语言去模拟其他语言里有的命名函数参数。觉得比较有意思所以记录一下。目标众所周知c语言里是没有命名函数参数这种东西的,形式参数虽然有自己的名字,但传递的时候并不能通过这个名字来指定参数的值。而支持命名参数的语言,比如python里,我们能让代码达到这种效......
  • 基于Java的模拟写字板的设计与实现
    点击下载链接基于Java的模拟写字板的设计与实现摘要:目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并且涉及到网络、多线程等重要的基础知识,因此Java语言也是学习面向对象编程和网络编程的首选语言。此简易JAVA写字板程序,使用Java程序编写,能够进行输入文......
  • 2023CSP-j复赛题解
    csp-j题解update:2024.6.18-2024.6.25:重构题解第一题:小苹果原题洛谷P9748思路n表示当前长度求几天取完:每天取走\((n-1)/3+1\)个苹果,记录几天取完第\(n\)个苹果第几天被取走:当\(n\bmod3=0\)时被取走时间复杂度约为\(O(\log_n)\)#include<iostream>......
  • 暑假模拟7
    暑假模拟7Permutations&Primes比较简单的构造题,容易发现所选区间只有包含1才可能产生贡献,此时考虑将2,3放在两边,1放在中间,其他数字不重要。构造方法正确性显然。注意\(n=1,2\)的情况。树上游戏Description这一天,\(Delov\)在和他的\(npy\)们在树上做游戏,他的\(npy\)们......
  • 暑假集训CSP提高模拟9
    又是挂分严重的一场T1大众点评T1交互题,注意边界处理,还有他的\(compare\)函数返回的是\(1,-1\),我以为是\(1,0\),爆零了还有特判\(N=1\)的情况点击查看代码//#include"ramen.h"////voidRamen(intN){//if(Compare(0,1)==1){//Answer(1,0);//}else{......
  • 暑假集训PVZ提高模拟9
    没关exe让这货挂了一天A.大众点评交互红题啊,交互会写,但是忘记判\(n=1\)了......
  • CSP 模拟 6
    at场T1花间叔祖原题[ARC148A]modM考虑每个数都写成\(k\cdotmod+b\)的形式,然后将找出所有相邻两数差的\(gcd\),如果\(gcd\ne1\)的话选\(mod=2\)这样最优,否则选\(gcd\)这样答案为\(1\)。点击查看代码#include<bits/stdc++.h>#defineintlonglongtypedeflo......
  • 模拟赛构造题一道
    给定\(n,m\)要你求出在\(n*m\)的棋盘上最多能摆多少个象(国际象棋)。输出方案。挺无聊的。但是这是我这一个月以来模拟赛中场切的第一题。先想到一个非常显然的构造:默认\(n\leqm\)。先放\(2n\)个棋子在第一行和第\(m\)行,然后中间填个一线天出来。对了。点击查看代码......
  • 暑假集训csp提高模拟9
    赛时rank15T10,T2100,T30,T40T1,T3都会做,然后都挂了。恼了,挂200,不愧是我,唐T1大众点评「JOISC2014Day1」拉面比较简单的交互。考虑选择相邻的两组,小的单独存一个,大的单独存一个,是比较200次再将大的互相比较,小的互相比较,各200次点此查看代码#include<bits/stdc++.......
  • 暑假集训CSP提高模拟9
    暑假集训CSP提高模拟9组题人:@Delov\(T1\)P161.大众点评\(0pts\)原题:JOISC2014Day1ラーメンの食べ比べ。思路来自1037-CSP2021提高级第一轮第5题。\(2n\)次比较是好做的。不难发现在这些比较是有多余的,考虑减少多余比较。将\(n\)座拉面馆两两......