Digi Comp II UVALive - 6953 (bfs/拓扑)__Magic的博客-程序员秘密

技术标签: 深搜广搜  其他图问题  Digi Comp II  拓扑思想  UVALive - 6953  

Uva https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4965

vjudge https://vjudge.net/problem/UVALive-6953


雾草 一波瞎优化从2000ms跑到800ms.....


题意:给你n(1~10^18)个球 m个点 每个点有一个状态 一个球来过状态就改变 根据当前状态确定下一步(状态左右)

输入 m行 : 初始状态 左子树 右子树

直接模拟会超时

利用拓扑思想 记录入度 然后队列模拟

首先几点必须注意

1.落下偶数小球 状态不变

2.落下奇数小球 状态改变

3.左右子树 可以相同(左右子树描述不确切)

4.入度为零的点可能不只是1节点

详见下代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <ctime>
#include <map>

using namespace std;

#define sf scanf
#define pf printf
#define ll long long
#define For(i,a,b) for(i=a;i<=b;i++)
#define _For(i,a,b) for(i=b;i>=a;i--)
#define Out(x) cout<<x<<endl
#define Outdouble(x,a) cout<<fixed<<setprecision(a)<<1.0*x<<endl
#define mset(arr,num) memset(arr,num,sizeof(arr))
#define ok std::ios::sync_with_stdio(0)
#pragma comment(linker, "/STACK:102400000,102400000")
#pragma GCC optimize("O3")

const ll inf = 1e12+10;  ///
const double esp = 1e-7; ///
const int NUM = 1e5+10;

// #define debug
#if defined (debug)
---check---
#endif

/// ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^  ^_^ ///

struct node
{
    ll num;
    int dis;  ///1表示Left  0表示Right
    int l,r;
} arr[5*NUM];

int indeg[5*NUM]; ///存入度
ll n,m; ///long long 把我卡炸了

void bfs()
{
    int i,past;
    queue <int> q;
    For(i,1,m)  ///注意 如果某点入度为零也要加进来 因为关系到后面节点的入度--问题
    {
        if(indeg[i]==0)
        {
            q.push(i);
        }
    }
    while(!q.empty())
    {
        past = q.front();
        q.pop();

        int L = arr[past].l;
        int R = arr[past].r;

        arr[L].num+=arr[past].num>>1;
        arr[R].num+=arr[past].num>>1;

        if((arr[past].num&1) == 1) ///如果小球是奇数那么多出来的一个判断分给谁
        {
            if(arr[past].dis == 1) ///根据父节点来判断当前状态
            {
                arr[L].num++;
            }
            else
            {
                arr[R].num++;
            }
            arr[past].dis^=1; ///转换状态
        }                     ///当落上珠子和是偶数那么并不会变状态

        arr[past].num = 0;
        indeg[L]--;
        indeg[R]--;  ///入度减一 父节点"释放"

        if(L!=0 && indeg[L]==0)  ///只要不为零,入度为零 那么前面就没有球落进来了 状态就固定了
        {
            q.push(L);
            if(L == R) continue; ///左右孩子相同的情况 记得判断
        }
        if(R!=0 && indeg[R]==0)
        {
            q.push(R);
        }
    }
}

void Output()
{
    int i;
    For(i,1,m)
    {
        if(arr[i].dis == 1)
        {
            pf("L");
        }
        else pf("R");
    }
    pf("\n");
}

int main()
{
    ok;
    char s[5];
    int i,j;
    while(cin>>n>>m)
    {
        mset(indeg,0);
        mset(arr,0);

        For(i,1,m)
        {
            cin>>s>>arr[i].l>>arr[i].r;
            indeg[arr[i].l]++;
            indeg[arr[i].r]++;  ///记录入度

            if(s[0] == 'L')
            {
                arr[i].dis = 1;
            }
            else arr[i].dis = 0;
        }
        arr[1].num = n;  ///n个球放在1上
        bfs();
        Output();
    }
    return 0;
}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gentle_guan/article/details/56681007

智能推荐

线程ID与线程句柄有啥不同_511遇见的博客-程序员秘密

当某个程序创建一个线程后,会产生一个线程的句柄,线程的句柄主要用来控制整个线程的运行,例如停止、挂起或设置线程的优先级等操作。线程句柄与线程ID的区别:●CreateThread() API 用于创建线程。 API 返回同时线程句柄和线程标识符 (ID)。 线程句柄有完全访问权创建线程对象。 运行线程时线程 ID 唯一标识线程在系统级别。●ID是在Windows系统范围内唯一标示Thread的。●Handle是用来操作Thread的,可以有多个,每个HANDLE可以有不同的操作权限,在不同进程O

MFC学习资料_mfc学习资料网盘_N1314N的博客-程序员秘密

在我的百度网盘上,含视频,文档,网站参考鸡啄米。地址:https://pan.baidu.com/s/1ggArcRUIblZg-qjLbzhAHA 提取码:ipf9

–allow-file-access-from-files解决chrome通过file协议加载文件报跨域问题_梧桐深院的博客-程序员秘密

chrome默认是不可以通过file协议加载文件的,当然,这里这样说不标准,并不是所有的情况都不可以通过file协议加载,比如,写了个本地的html,还是可以加载js,css,图片等资源的。但是在某些情况下通过file协议加载数据,就会报跨域问题。比如目前我遇到以下两种情况:一、学习ES6模块化的时候,加载本地模块,就会报跨域问题,例如,下面的代码:&lt;script src="./aaa.js" type="module"&gt;&lt;/script&gt;二、加载本地图片,用canvas获取

关于一起linux secure安全日志写入异常分析处理_titanagent_羌俊恩的博客-程序员秘密

一、问题描述检查发现2022年5月份的secure日志里混入了2021年10月份的日志信息,很是不解。二、分析出来日志报错:sshd[17263]: Did not receive identification string from 192.168.1.1 #表1.1ssh本地主机建立连接时,返回时出现问题,认证信息丢弃2)查看与绕行相关的日志,发现异常,日志被写入旧的脏数据其中:The imjournal module bellow is now used as a

莫比乌斯反演入门_莫比乌斯反演计算组合数学_mumei314的博客-程序员秘密

这个算是竞赛中用到的组合数学里最多的知识点,也是比较难理解的,在被将近一个星期的折磨后总算是理解了一些。其实莫比乌斯反演就只有两个重要的公式,而且用到的最多的也只有一个(其实都差不多),但是需要一些预备知识。莫比乌斯函数,质数线性筛,整除分块,积性函数以及一些其他的数论知识,下面会将其中一部分重要的算法,目录1.莫比乌斯函数2.莫比乌斯函数的线性筛3.整除分块4....

随便推点

字节码:ASCII编码:单字节编码,ANSI编码:多字节编码,UNICODE编码:宽字节编码_IT界的小小小学生的博客-程序员秘密

字符字节与编码字符是人们常用的一些记号,比如”1”, “汉”, “お”,”℃”等等,包括各种语系的语言和一些符号都可以被称为字符。 字节是计算机存储数据的存储单元,是一个8位的二进制数,所以最多只能表示256个数字(0-255)。 编码是大家对计算机如何使用字节来表示一个字符的约定,可分为ASCII编码,ANSI编码(本地化编码),UNICODE编码(国际化编码)三种。1.ASCI...

使用html编写一个(移动端)静态页面_html移动端页面_et1125的博客-程序员秘密

html代码喜马拉雅移动端css代码图片就自行想办法成品展示中间是一个轮播图

undefined reference to `ceres::Solve(ceres::Solver::Options const&, ceres::Problem*,_HeyMountain的博客-程序员秘密

问题描述:软件安装编译时,出现以下问题,是ceres库和glog库有问题undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int)'../../../Linux-x86_64/libaliceVision_multiview.so.2.2: undefined reference to ...

JavaWeb实现文件上传与下载(超详细)_GuoJunD的博客-程序员秘密

文件的上传与下载实现首先需要创建一个Web项目,并配置好Tomcat等相关配置,并引入commons-fileupload-1.3.3.jar和commons-io-2.4.jar,如果是maven创建的项目在web.XML中引入依赖commons-fileupload-1.3.3.jarjar下载地址:https://repo1.maven.org/maven2/commons-fileupload/commons-fileupload/1.3.3/commons-fileupload-1.3.3.

Android原生音量控制_他叫小黑的博客-程序员秘密

本文主要涉及AudioService。还是基于5.1.1版本的代码。 AudioService.java文件位于/framework/base/media/java/android/media/下。音量控制是AudioService最重要的功能之一。先总结一下:AudioService音量管理的核心是VolumeStreamState。它保存了一个流类型所有的音量信息。Volum...

推荐文章

热门文章

相关标签