首页 > 其他分享 >20230701水题选做

20230701水题选做

时间:2023-07-01 14:12:01浏览次数:37  
标签:20230701 水题 int sum son 该点 SG 节点

CF1676D

题意

给定一个无根树,点从 \(1\) 到 \(n\) 编号。你需要给每个点分配一个正整数权值 \(w_i\)。定义一个节点为好节点,当且仅当其权值等于所有相邻节点的权值之和

最大化好节点的个数,并且在好节点个数最大的前提下最小化所有节点的权值和。

分析

我们先考虑一种特殊情况,当 \(n=2\) 时我们有唯一可以使一个点和它的父亲都为好的节点,这样我们先特判这种情况。

而后我们考虑设两个状态来转移本题。我们设 \(f_{i,1/0}\) 表示该点是好的节点或不好的节点子树内好的节点数(包含该点)。显然我们有一个节点和它的父亲不能同时为好的节点。而后我们显然有转移

\(f_{u,0}=\sum \min({f_{son[u],0},f_{son[u],1}})\)

\(f_{u,1}=\sum f_{sum[u],0}\)。

而后我们考虑设 \(g_{i,1/0}\) 表示该点是好的节点或者不好的节点子树内点权和(包含该点)。显然

\(g_{u,1}=\sum g_{son[u],0}\)。

当 \(f_{u,0}=f_{u,1}\) 时有 \(g_{u,0}=\sum min(g_{son[u],0},g_{son[u],1})\)。

当 \(f_{u,0}>f_{u,1}\) 时有 \(g_{u,0}=\sum f_{son[u],0}\)。

当 \(f_{u,0}<f_{u,1}\) 时有 \(g_{u,0}=\sum f_{son[u],1}\)。

而后我们考虑一种方案,即若该点为好的节点该点权值为 \(deg[i]\) 否则为 \(1\)。显然最优。而后我们考虑怎么标记。我们考虑再进行一次 \(mark\) 操作,如果该点的父亲被标记那么显然它肯定不能被标记,而后如果该点被该点不被标记是 \(f\) 值大或者 \(f\) 值相同 \(g\) 值更小,那么不被标记,反之被标记。而后我们下传这个标记给他的儿子,这样使得它的儿子必须不能被标记,这样 dfs 下去显然可以得出一个方案。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
int n;
vector<int> G[N<<2];
int deg[N];
int f[N<<2][2],g[N<<2][2];
void dfs(int u,int father){
  f[u][1]=1,g[u][1]=deg[u],g[u][0]=1;
  for(int k:G[u]) if(k!=father){
    dfs(k,u);
    f[u][1]+=f[k][0];
    g[u][1]+=g[k][0];
    f[u][0]+=max(f[k][0],f[k][1]);
    if(f[k][0]==f[k][1]) g[u][0]+=min(g[k][0],g[k][1]);
    else g[u][0]+=(f[k][0]>f[k][1]?g[k][0]:g[k][1]);
  }
}
bool mrk[N];
void mark(int u,int father,bool fl){
  if(fl) mrk[u]=0;
  else{
    if(f[u][0]>f[u][1]||f[u][0]==f[u][1]&&g[u][0]<g[u][1])
    mrk[u]=0;
    else mrk[u]=1;
  }
  for(int k:G[u]){
    if(k!=father)
    mark(k,u,mrk[u]);
  }
}
int main(){
  scanf("%d",&n);
  for(int i=1;i<=n-1;i++){
    int u,v;scanf("%d%d",&u,&v);G[u].push_back(v),G[v].push_back(u);
    ++deg[u],++deg[v];
  }
  if(n==2) return printf("2 2\n1 1\n"),0;
  dfs(1,0);
  mark(1,0,0);
  printf("%d %d\n",max(f[1][0],f[1][1]),f[1][0]==f[1][1]?min(g[1][0],g[1][1]):(f[1][0]>f[1][1]?g[1][0]:g[1][1]));
  for(int i=1;i<=n;i++) printf("%d ",mrk[i]?deg[i]:1);
  return 0;
}

魔法珠

题意

SG函数:首先得到\(x\)的因数,然后获得到他们的\(SG\)值,作为他们的子游戏的\(SG\)值异或起来,当这个值异或其中一个\(SG\)值时,根据异或的性质,可以得到除了他以外的\(SG\)值。而后我们使用\(map\)记录他们可到的状态,而后从\(0\)到\(cnt\)枚举最小的\(mex\)记它为\(SG[x]=mex\)。

分析

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+7;
int SG[N];
int _SG(int x){
  if(x==1&&x==0) return 0;
  int yz[N];
  int cnt=0;
  for(int i=1;i<x;i++) if(x%i==0) yz[++cnt]=i;
  int tmp=0;
  for(int i=1;i<=cnt;i++) tmp^=_SG(yz[i]);
  map<int,bool> mp;
  for(int i=1;i<=cnt;i++) mp[tmp^SG[yz[i]]]=1;
  int mex;
  for(int i=0;i<=cnt;i++){
    if(!mp[i]){
      mex=i;break;
    }
  }
  return SG[x]=mex;
}
int n,a[N];
int main(){
  while(cin>>n){
    int sum=0;
    memset(SG,-1,sizeof SG);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) sum^=_SG(a[i]);
    if(sum) printf("freda\n");
    else printf("rainbow\n");
  }
  return 0;
}

标签:20230701,水题,int,sum,son,该点,SG,节点
From: https://www.cnblogs.com/Zimo233/p/17519208.html

相关文章

  • P5719 水题
    https://www.luogu.com.cn/problem/P5719唠唠:别看这题很水,且只要求保留小数点后一位,倘若用float而不是double的话就无法AC,洛谷评测则只有40分。所以一定要用double!总结:能用double就别用floatCode`#includeincludeincludeincludeincludeincludeincludeusingnamespaces......
  • 20230628水题选做
    约束条件题意给定一些关系\(x=y或x\neqy\)。求是否能满足。分析显然并查集。我们考虑将约束条件排序,先使形如\(x_{i}=x_{j}\)的\(x_{i}\)和\(x_{j}\)合并。而后我们观察是否存在\(x_{i}\)和\(x_{j}\)已经合并但是关系是\(\neq\)。代码#include<bits/stdc++.h>usingname......
  • 20230626水题选做
    「数学基础」第6章期望问题单选错位题意单选把答案填在后面那道题了。假设所有题都正确,求答对题目的期望值。分析期望入门题。\(E(Ans)=\sumP[i]\)。那么显然有答对本题的期望为\(\dfrac{1}{\max\left(a\left[i+1\right],a\left[i\right]\right)}\)。代码#inc......
  • 2023.4-2023.5 水题记录 (持续更新)
    摆烂了属于是.1.P4071[SDOI2016]排列计数错排板子,显然答案为\(\dbinom{n}{m}D_{n-m}\),\(D_k\)m为错排数.2.P5104红包发红包连续型随机变量入门题.本人不太熟练,写一下过程.根据题中条件,抽到钱数在\([0,x](x\in[0,w])\)间的概率为\(\dfrac{x}{w}\).求导得概......
  • 线段树水题
    [THUSCH2017]大魔法师​ 给定\(n\)个三元组\((A,B,C)\)。共有\(m\)种区间操作,分为三大类,七小类。1.\(A_i=A_i+B_i\)2.\(B_i=B_i+C_i\)3.\(C_i=C_i+A_i\)给定值\(v\)4.\(A_i=A_i+v\)5.\(B_i=B_i\timesv\)6.\(C_i=v\)7.区间查询所有三元组......
  • hdu:这是真正的水题(RMQ)
    ProblemDescription在缺水的地方,水是非常有限的资源,所以人们常常为争夺最大的水源而战。给定一系列水源,用a1,a2,a3,…,an代表水源的大小。给定一组查询,每个查询包含2整数L和R,请找出L和R之间最大的水源。Input输入数据首先给定一个整数T(T≤10)表示测试用例的数量。......
  • Codeforces Round #358 (Div. 2) -- B. Alyona and Mex (思路水题)
    B.AlyonaandMextimelimitpertestmemorylimitpertestinputoutputSomeonegaveAlyonaanarraycontainingnpositiveintegersa1, a2, ..., an.Inoneoperation,Alyonacanchooseanyelementofthearray......
  • POJ - 2029 Get Many Persimmon Trees(暴力水题)
    题目大意:给你一个矩阵,矩阵上面有N个柿子树,现在要求你画一个s*t的矩阵,使得这个矩阵内的柿子树达到最多解题思路:100*100,直接暴力#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;constintN=110;intn,w,h,s,t;intmap[N][N];voidin......
  • ZOJ - 2421 Recaman's Sequence(打表水题)
    题目大意:A0=0Am=A(m-1)-m,如果Am小于0或者Am前面已经出现过了,那么Am=A(m-1)+m解题思路:打表水题我用的是map,纪录数是否出现过了#include<cstdio>#include<cstring>#include<map>usingnamespacestd;constintN=500010;typedeflonglongLL;map<LL,int>Ma......
  • P5219 无聊的水题 I
    P5219无聊的水题I计有标号树,容易想到\(\text{Prufer}\)序列,那么对于度数的限制即使,每一个数的出现次数要小于等于\(m-1\),且一定要有等于的,容斥一下,用小于等于\(m-1......