【ARC079F】Namori Grundy

本文探讨了一种特殊图结构——基环外向树的节点权值分配问题,目标是确定每个节点的权值,使其等于该节点所有后继节点权值的mex值。文章提供了一个有效的解决方案,并附带实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

  
   题目链接
  
   大意:给一张基环外向树。要求给每一个点确定一个值,其值为所有后继点的\(\text{mex}\)。求是否存在确定权值方案。
  
  
  

Solution

  
   首先,对于叶子节点,其权值必定是0.
  
   对于每一棵外向树,树上的每个点的权值都是唯一确定的。可以通过DFS计算得到。
  
   然而,每棵外向树的根——环上的某个点\(u\),其权值不是唯一确定的。因为它要考虑的后继,不仅包括在树上的后继,还有一个环上后继。
  
   根据\(\text{mex}\)的性质,我们发现不管\(u\)的环上后继是多少,\(u\)始终只有两种取值:分别是只考虑树上后继时的一级\(\text{mex}\)与二级\(\text{mex}\)
  
   再一来可以发现,只要我们确定了环上的某个点\(u\)的权值,我们可以唯一确定地填出剩余环上点的权值。只需要模拟一圈计算回来,判断最终\(u\)的权值和开始确定的值是否相同即可。
  
   任选一个环上点,两种值各试一次,只要一种OK则存在方案;否则无解。
  
   要对这个\(\text{mex}\)的取值比较敏感,才能很快地发现“两种取值”这一性质。确定一个点的值就能唯一确定方案这一点只要不要脑抽退却了应该能够比较顺利地发现。
  
  
  

Code

  

#include <cstdio>
using namespace std;
const int N=200005;
int n,pre[N],cnex[N];
int h[N],tot;
struct Edge{
    int v,next;
}e[N*2];
int a[N],len,mex[N][2];
inline void addEdge(int u,int v){
    e[++tot]=(Edge){v,h[u]}; h[u]=tot;
}
void readData(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&pre[i]);
        addEdge(pre[i],i); 
    }
}
void findCircle(int u){
    static int stk[N],top=0;
    static bool vis[N];
    stk[++top]=u;
    vis[u]=true;
    if(vis[pre[u]]){
        int v=pre[u];
        cnex[v]=u;
        for(;stk[top]!=v;top--){
            cnex[stk[top]]=stk[top-1];
            a[++len]=stk[top];
        }
        a[++len]=v;
        return;
    }
    findCircle(pre[u]);
}
void dfs(int u,int dep){
    for(int i=h[u],v;i;i=e[i].next)
        if((v=e[i].v)!=cnex[u])
            dfs(v,dep+1);
    static int cnt[N];
    for(int i=h[u],v;i;i=e[i].next)
        if((v=e[i].v)!=cnex[u])
            cnt[mex[v][0]]++;
    for(mex[u][0]=0;cnt[mex[u][0]];mex[u][0]++);
    if(dep==0)
        for(mex[u][1]=mex[u][0]+1;cnt[mex[u][1]];mex[u][1]++);
    for(int i=h[u],v;i;i=e[i].next)
        if((v=e[i].v)!=cnex[u])
            cnt[mex[v][0]]--;
}
bool run(int x){
    int last=x;
    for(int i=len-1;i>=1;i--){
        int u=a[i];
        last=(mex[u][0]==last)?mex[u][1]:mex[u][0];
    }
    last=(mex[a[len]][0]==last)?mex[a[len]][1]:mex[a[len]][0];
    return x==last;
}
bool judge(){
    for(int i=1;i<=len;i++)
        dfs(a[i],0);
    return run(mex[a[len]][0])||run(mex[a[len]][1]);
}
int main(){
    readData();
    findCircle(1);
    puts(judge()?"POSSIBLE":"IMPOSSIBLE");
    return 0;
}

转载于:https://www.cnblogs.com/RogerDTZ/p/9518499.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值