7.16_D题

题目链接:http://code.bupt.edu.cn/problem/p/427/

一个很单纯的every-sg模型

代码:

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#define N 100010
using namespace std;
int step[N];
int sg[N];
int stone[N];
vector<int> g[N];

int mex(int a)
{
    if(g[a].empty()) return 0;
    if(sg[a]!=-1)
        return sg[a];
    int test=0;
    for(int i=0;i<g[a].size();i++)
    {
        if(sg[g[a][i]]==0)
            test=1;
        else if(sg[g[a][i]]==-1)
            return mex(g[a][i]);
    }
    return test;
}
int find_step(int a)
{
    if(g[a].empty()) return 0;
    if(step[a]!=-1) return step[a];
    int ma=0,mi=999999;
    for(int i=0;i<g[a].size();i++)
    {
        if(sg[a]==1)
        {
            if(!sg[g[a][i]])
                ma=max(ma,find_step(g[a][i]));
        }
        else
        {
            if(sg[g[a][i]])
                mi=min(mi,find_step(g[a][i]));
        }
    }
    if(sg[a])
        return ma+1;
    else
        return mi+1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(step,-1,sizeof(step));
        memset(sg,-1,sizeof(sg));
        for(int i=0;i<N;i++)
            g[i].clear();
        int n,m;
        int num;
        scanf("%d%d",&n,&m);
        for(int i=2;i<=n;i++)
        {
            scanf("%d",&num);
            g[num].push_back(i);
        }
        for(int i=0;i<m;i++)
            scanf("%d",&stone[i]);
        for(int i=n;i>=1;i--)
        {
            sg[i]=mex(i);
            //cout<<sg[i]<<endl;
        }
        for(int i=1;i<=n;i++)
        {
            step[i]=find_step(i);
            //cout<<step[i]<<endl;
        }
        int ans=0;
        for(int i=0;i<m;i++)
        {
            ans=max(ans,step[stone[i]]);
        }
        if(ans%2)
            printf("MengMengDa!\n");
        else
            printf("So sad...\n");
    }
    return 0;
}

7.16_D题

时间: 2024-11-26 11:25:34

7.16_D题的相关文章

C#认证第一章1 题 11题

C#第一章第一题 C#认证第一章  11题

[poj2104]可持久化线段树入门题(主席树)

解题关键:离线求区间第k小,主席树的经典裸题: 对主席树的理解:主席树维护的是一段序列中某个数字出现的次数,所以需要预先离散化,最好使用vector的erase和unique函数,很方便:如果求整段序列的第k小,我们会想到离散化二分和线段树的做法, 而主席树只是保存了序列的前缀和,排序之后,对序列的前缀分别做线段树,具有差分的性质,因此可以求任意区间的第k小,如果主席树维护索引,只需要求出某个数字在主席树中的位置,即为sort之后v中的索引:若要求第k大,建树时反向排序即可 1 #include

旧题新做:从idy的视角看数据结构

“今天你不写总结……!!!” 额…… 还是讲我的吧.这些考试都是idy出的题. 20170121:DFS序. ST表.线段树练习 这是第一次考数据结构. Problem 1. setsum 1 second 给你一个长度为N 的整数序列,支持两种操作: • modity l r val 将区间[l,r] 中的所有数修改为val • query l r 询问区间[l,r] 所有数的和 分析:最简单的线段树,区间更改区间求和.但注意是更改,不是添改,sum与flag需同时覆盖. Problem 2.

做预解释题的一点小方法和小技巧

在JavaScript中的函数理解中预解释是一个比较难懂的话题.原理虽然简单,寥寥数言,但其内涵却有深意,精髓难懂.如何在轻松活跃的头脑中将它学会,现在针对我在学习中的一点小窍门给大家分享一下,希望能给大家一些帮助: 万事需遵循"原理"--"预解释"无节操和"this"指向:(可先看例题解析然后结合原理进行学习) (感谢蕾蕾老师给归纳的预解释无节操原理:) 如果函数传参数则先于以下执行,就相当于在函数私有作用域下var了一个变量:根据作用域原理,

hdu 2966 In case of failure kdtree模板题

问求每个点距离平方的最小的点 kd-tree模板题…… 1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a)) 3 #define debug(x) cerr<<#x<<"=="<<(x)<<endl 4 using namespace std; 5 typedef long long ll; 6 typedef pair<int,int>

2017 计蒜之道 初赛 第一场 A、B题

A题 阿里的新游戏 题目概述: 阿里九游开放平台近日上架了一款新的益智类游戏--成三棋.成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示: 成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子.我们可以用坐标系来描述棋盘: 如果一条线段上的三个交叉点都被同一玩家的棋子占据的话,则称这条线段被该玩家 成三.现在,小红和小明两人在游戏平台上下棋,其中小红的棋子是黑色的.请你帮小红计算他成三的线段数. 样例对应的棋盘如下: 输入格式 输入第一行两个整数 n,m(3 \le n, m \le

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时

POJ 1741 Tree(树的点分治,入门题)

Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21357   Accepted: 7006 Description Give a tree with n vertices,each edge has a length(positive integer less than 1001).Define dist(u,v)=The min distance between node u and v.Give an in

九度OJ刷题——1013:开门人和关门人

题目描述:     每天第一个到机房的人要把门打开,最后一个离开的人要把门关好.现有一堆杂乱的机房签到.签离记录,请根据记录找出当天开门和关门的人. 输入: 测试输入的第一行给出记录的总天数N ( N> 0 ),下面列出了N天的记录.     每天的记录在第一行给出记录的条目数M (M > 0 ),下面是M行,每行的格式为 证件号码 签到时间 签离时间 其中时间按"小时:分钟:秒钟"(各占2位)给出,证件号码是长度不超过15的字符串. 输出: 对每一天的记录输出1行,即当天