首页 > 编程语言 >第十一届山东省大学生程序设计竞赛(正式赛)C题

第十一届山东省大学生程序设计竞赛(正式赛)C题

时间:2024-05-08 19:44:25浏览次数:27  
标签:竞赛 标记 up back le 第十一届 顶点 push 程序设计

C
https://codeforces.com/gym/103118/problem/C
题面:
在猫的国度里,任何猫科动物都可以被视为一棵根深蒂固的树。众所周知,猫的体内都隐藏着一种僵尸病毒。因此,一个猫家庭可能由猫和僵尸组成。当一只猫出生时,它可能会变成僵尸。如果一只猫变成了僵尸,它的后代也会变成僵尸。

现在给定一个整数 \(K\) ,你应该用恰好 \(K\) 种方法来构建一个猫科家族,以标记家族成员的身份(猫或僵尸)。当且仅当至少有一个成员在一种方式中被标记为猫,而在另一种方式中被标记为僵尸时,两种方式才被认为是不同的。

从形式上看,有根树中的顶点会被标记为黑色或白色,如果一个顶点被标记为黑色,那么其子树中的所有顶点也应该被标记为黑色。给定一棵有根树,很容易计算出在树上标记顶点的有效方法的数量。你的任务是构建一棵有根的树,用恰好 \(K\) 种方法标记树中的顶点。当且仅当至少有一个顶点在一种标记方式中被标记为黑色,而在另一种标记方式中被标记为白色时,两种标记方式才会被认为是不同的。

输入
唯一一行包含一个整数 \(K\) - 树中顶点的有效标记方式的数量。 \((2 \le K \le 2 \cdot 10^{18})\) - 树中顶点的有效标记方式的数量。

输出
我们用 \(n\) 表示您构建的树的顶点数,并标注从 \(1\) 到 \(n\) 的顶点,其中顶点 \(1\) 是根。
输出结果应包含 \(n\) 行。在第一行中,打印一个整数 \(n\) \((1 \le n \le 10^5)\) 。在接下来的每 \(n-1\) 行中,打印两个整数 \(u,v\) \((1 \le u, v \le n, u \neq v)\) 描述一个根。 \((1 \le u, v \le n, u \neq v)\) 描述有根树的一条边。
保证至少存在一个解决方案。如果存在多个可能的有效解,则可以打印任意一个。

从简单的开始分析,一个点有两种方案数 (1/0),此时他的父节点一定是0,如果他的父节点是1,那么他也只能是1。所以相比单个节点,给他增加一个父节点可以让方案数x+1。如果两个点不是父子关系(不互相影响),那么他们的方案数是\(2*2\),但是所有的点要相互连通,就必须再加一个点当他们的父节点,此时的方案数变化是\(x*2+1\)。
那么现在有两种变化方法,一种是让方案数+1,一种是让方案数*2之后再+1。最开始的方案数是2,那么从2开始可以一步步变成n 。同等于从n变化成2,可以-1或者-1之后/2,因为方案数只有正整数,所以偶数只能-1,奇数则执行-1后/2.如果算到3,则不需要除2直接结束。要注意计算的方案和建树是反过来的。
代码如下:

#include <bits/stdc++.h>
#define int long long
using namespace std;

void solve()
{
    int n;
    cin >> n;
    vector<int> v;
    while (n > 2)
    {
        if (n % 2 == 0)
        {
            n --;
            v.push_back(0);
        }
        else 
        {
            if ((n - 1) / 2 >= 2)
            {
                n = (n - 1) / 2;
                v.push_back(1);
            }
            else 
            {
                n --;
                v.push_back(0);
            }
        }
    }
    int up = 1;
    vector<pair<int, int>> g;
    reverse(v.begin(), v.end());
    
    for (auto x : v)
    {
        if (x)
        {
            g.push_back({up, up + 2});
            g.push_back({up + 1, up + 2});
            up += 2;
        }
        else 
        {
            g.push_back({up, up + 1});
            up ++;
        }
    }
    cout << up << "\n";
    reverse(g.begin(), g.end());
    for (auto [x, y] : g)
        cout << up - y + 1 << ' ' << up - x + 1 << "\n";
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    solve();

}

标签:竞赛,标记,up,back,le,第十一届,顶点,push,程序设计
From: https://www.cnblogs.com/karashi/p/18180737

相关文章

  • 算法竞赛第一章-队列
    1、队列constintN=1e5;//定义队列大小intque[N],head,tail;//队头队尾指针,队列大小为tail-head+1//head++;弹出对头,head<=tail//queue[head];//读对头数据//que[++tail]=data;//数据data入队,尾指针加1,注意不能溢出2、STLqueuequeue<Type>q:定义......
  • 程序设计题
    设计一程序实现功能,处理字符串A,处理规则是:只要B字里面有的字母,不分大小写,一律从A字符串中删掉。/***************************************************filename:Pro_StuInfo.c*author:momolyl@126.com*date:2024/05/06*function:设计一程序......
  • 竞赛与剑术
    我是一名信息竞赛生,或许学会得不够多,但是我仍会继续学习。以下是我对竞赛的感触,随手一记:竞赛对我来说意味着什么?在我没搞竞赛的时候,我闲,自己探索我好奇的,自学了剑术。曾经有一段时间我学习压力很大,就在傍晚的时候练习剑术,打得一身薄汗。那是我对剑术是珍爱的。但是时与日去,学业......
  • 2024“图森未来杯”程序设计邀请赛
    https://voj.mobi/contest/242/problems,密码2024ecnutsolA-调和与折中#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingvi=vector<int>;i32main(){ ios::sync_with_stdio(false),cin.tie(nullptr);......
  • 浙大版C语言程序设计习题11-17
    点击查看代码typedefstructNODE{intdata;structNODE*next;}NODE,*Linkedlist;//初始化头节点voidInit(Linkedlist&L){L=(NODE*)malloc(sizeof(NODE));L->next=NULL;}//尾插法创建链表LinkedlistCreateFromRear(LinkedlistL){NODE*rear=L;for......
  • 个人算法竞赛模板(2024.5.4)
    精简版:#include<algorithm>#include<cmath>#include<cstring>#include<iostream>#include<map>#include<queue>#include<set>#include<stack>#include<string>#include<vector>#include<......
  • 【排课小工具】排课程序设计与实现
    课表的完整性意味着,可分配的节点的数量大小等于课表周数的累加和大小,为了进行完整性检测我需要两个对象:课表模板以及课程对象,从课表模板中获取可分配的节点数,从课程对象中获取该课程的上课周次。用户要求每个班级的课表模板相同,这使得完整性检测容易很多。分级填充需求主要和课程......
  • 【排课小工具】排课程序设计与实现
    课表的完整性意味着,可分配的节点的数量大小等于课表周数的累加和大小,为了进行完整性检测我需要两个对象:课表模板以及课程对象,从课表模板中获取可分配的节点数,从课程对象中获取该课程的上课周次。用户要求每个班级的课表模板相同,这使得完整性检测容易很多。分级填充需求主要和课程......
  • C语言程序设计——字符串典型题练习
    1、计算一个字符串中最大的重复子串的字符的数量/********************************************************************* name : CalSubStrMaxCnt* function:计算一个字符串中最大的重复子串的字符的数量* argument:* @str:需要查找的字符串的地址* * ret......
  • XMU《UNIX 系统程序设计》第五次实验报告(编制模拟“五个哲学家”问题的程序)
    想知道第三、四次实验去哪儿了吗?我也想知道。实验五编制模拟“五个哲学家”问题的程序一、实验内容描述编制模拟“五个哲学家”问题的程序目的学习和掌握并发进程同步的概念和方法。要求程序语法philosopher[-t<time>]<time>是哲学家进餐和沉思的持续时间值,......