• Codeforces 1010D Mars rover


    题目大意:对于一个不完全二分图,根节点为1,叶节点值为0或1,非叶节点包含一个操作(and,or,xor,not),求改变各个叶节点的值时(即0改为1,1改为0),根节点的值是多少

    解法:遍历图求各节点的值,改变每个叶节点时,向图根节点遍历,求根节点值即可

    有两个需要剪枝的地方,一,当改变到当前节点是该节点值已经不在改变,则结束图的向上递归

    二,维护每个节点改变时,根节点的值,当再次遍历次节点时,可直接得到答案,结束递归

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cmath>
      4 #include<queue>
      5 #include<vector>
      6 #include<string.h>
      7 #include<cstring>
      8 #include<algorithm>
      9 #include<set>
     10 #include<map>
     11 #include<fstream>
     12 #include<cstdlib>
     13 #include<ctime>
     14 using namespace std;
     15 #define scd(a) scanf("%d",&a)
     16 #define scf(a) scanf("%lf",&a)
     17 #define scl(a) scanf("%lld",&a)
     18 #define sci(a) scanf("%I64d",&a)
     19 #define scs(a) scanf("%s",a)
     20 typedef long long ll;
     21 const int desll[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
     22 const ll mod=1e9+7;
     23 const int maxn=1e6+7;
     24 const int maxm=1e8+7;
     25 const double eps=1e-4;
     26 int m,n,ar[maxn];
     27 char ch[maxn];
     28 int armid[maxn];
     29 struct node{
     30     int val,num;
     31     char c;
     32     node *pre,*l,*r;
     33     void clear(){
     34         l=r=NULL;
     35     }
     36 }no[maxn];
     37 int ma,ans=0;
     38 int newCal(node* u)//求此节点的新值
     39 {
     40     if(u->c=='N') return 1-(u->l->val);
     41     else if(u->c=='A') return  u->l->val & u->r->val;
     42     else if(u->c=='X') return  u->l->val ^ u->r->val;
     43     else if(u->c=='O') return  u->l->val | u->r->val;
     44 }
     45 void dfs(node* u,int x)
     46 {
     47     int now=u->val;
     48     u->val=x;
     49     if(u->pre == NULL || now == x){//若此节点为根节点或此节点值已经不在改变,结束递归
     50         ma=1;
     51         ans=no[1].val;
     52     }
     53     else{
     54         if(armid[u->num]!=-1){//若此节点之前已经被便利过,则直接输出
     55             ans = armid[u->num];//armid维护每个节点值改变时引起的根节点改变之后的值
     56             ma=1;
     57         }
     58         else{
     59             dfs(u->pre,newCal(u->pre));
     60             armid[u->num]=ans;
     61         }
     62     }
     63     u->val=now;
     64 }
     65  
     66 void init(node* u)
     67 {
     68     //cout<<u->val<<endl;
     69     if(u->c=='I')return ;
     70     init(u->l);
     71     if(u->r!=NULL)init(u->r);
     72     if(u->c=='N')u->val=1-(u->l->val);
     73     else if(u->c=='A')u->val = u->l->val & u->r->val;
     74     else if(u->c=='X')u->val = u->l->val ^ u->r->val;
     75     else if(u->c=='O')u->val = u->l->val | u->r->val;
     76 }
     77 int main()
     78 {
     79     scd(n);
     80     int x,y;
     81     no[1].pre=NULL;
     82     for(int i=0;i<=n;i++)no[i].clear();
     83     for(int i=1;i<=n;i++){
     84         scs(ch);scd(x);
     85         if(ch[0]=='A' || ch[0]=='O' || ch[0]=='X'){
     86             scd(y);
     87             no[i].l=&no[x];
     88             no[i].r=&no[y];
     89             no[x].pre = &no[i];
     90             no[y].pre = &no[i];
     91             no[i].c=ch[0];
     92         }
     93         else if(ch[0]=='N'){
     94             no[i].l= &no[x];
     95             no[x].pre = &no[i];
     96             no[i].c=ch[0];
     97         }
     98         else{
     99             no[i].val=x;
    100             no[i].c=ch[0];
    101         }
    102         no[i].num=i;
    103     }
    104     memset(armid,-1,sizeof(armid));
    105     init(&no[1]);
    106     int len=0;
    107     for(int i=1;i<=n;i++){
    108         ma=0;
    109         if(no[i].c=='I'){
    110             dfs(&no[i],1-no[i].val);
    111             ar[len++]=ans;
    112         }
    113     }
    114     for(int i=0;i<len;i++){
    115         printf("%d",ar[i]);
    116     }
    117     printf("
    ");
    118  
    119  
    120     return 0;
    121 }
  • 相关阅读:
    Html、Vue——本地文件上传弹框+读取本地文件内容
    git-基本操作
    Selenium(二)---无界面模式+滑动底部
    Selenium(一)---Selenium的安装和使用
    Nginx+win10安装配置
    Tinghua Data Mining 9
    Tinghua Data Mining 8
    Tinghua Data Mining 7
    Tinghua Data Mining 6
    Tinghua Data Mining 5
  • 原文地址:https://www.cnblogs.com/wa007/p/9378531.html
Copyright © 2020-2023  润新知