鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: sfqxx

[已解决]【C++板块提升计划】梦想护卫舰 第15期 画树

[复制链接]
 楼主| 发表于 2023-1-28 13:38:32 From FishC Mobile | 显示全部楼层
元豪 发表于 2023-1-28 13:03
我去!还真的瞎选啊!

我甚至怀疑这题高达 提高+/省选-

今天选简单一些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-29 11:08:18 | 显示全部楼层
好奇一下这道题您有测试数据吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-29 11:41:15 From FishC Mobile | 显示全部楼层
dolly_yos2 发表于 2023-1-29 11:08
好奇一下这道题您有测试数据吗?

?没理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-29 11:47:32 | 显示全部楼层

想知道您怎么判断一个回答是不是正确
比如您有一些输入和对应的答案吗?这道题目没有找到出处,您是否有对程序进行测试的途径?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-29 11:48:30 | 显示全部楼层
dolly_yos2 发表于 2023-1-29 11:47
想知道您怎么判断一个回答是不是正确
比如您有一些输入和对应的答案吗?这道题目没有找到出处,您是否有 ...

有,不知道现在能不能再提交
有测试的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-29 12:20:58 | 显示全部楼层    本楼为最佳答案   
感觉好像有点思路,试着写了一个
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
const uint64_t mod = 1000000007;
struct edge{
    int64_t weight;
    uint32_t destination;
    uint32_t next;
};
struct edge edges[(unsigned int)4e5];
uint32_t head[(unsigned int)2e5 + 1];
uint32_t next_edge;
uint32_t n;
int64_t l, r;
void insert_edge(uint32_t source, uint32_t destination, int64_t weight){
    edges[next_edge].weight = weight;
    edges[next_edge].destination = destination;
    edges[next_edge].next = head[source];
    head[source] = next_edge++;
}
void trace(
    uint32_t target,
    int64_t p_weight, int64_t p_low, int64_t p_high,
    int64_t* c_low, int64_t* c_high
){
    uint32_t start = head[target];
    int64_t low = p_weight - p_high;
    int64_t high = p_weight - p_low;
    head[target] |= 1 << 31;
    int64_t child_low, child_high;
    for(uint32_t edge = start; edge != 0x7fffffff; edge = edges[edge].next){
        if(head[edges[edge].destination] >> 31 == 1) continue;
        if(edges[edge].weight - low < l || edges[edge].weight - high > r){
            low = 1;
            high = 0;
            break;
        }
        if(edges[edge].weight - r > low) low = edges[edge].weight - r;
        if(edges[edge].weight - l < high) high = edges[edge].weight - l;
        trace(edges[edge].destination, edges[edge].weight, low, high, &child_low, &child_high);
        if(child_low > child_high){
            low = 1;
            high = 0;
            break;
        }
        if(edges[edge].weight - child_high > low) low = edges[edge].weight - child_high;
        if(edges[edge].weight - child_low < high) high = edges[edge].weight - child_low;
    }
    *c_low = low;
    *c_high = high;
}
void group_main(){
    uint64_t result = 1;
    scanf("%u%ld%ld", &n, &l, &r);
    int64_t minimum_weight = l + l;
    int64_t maximum_weight = r + r;
    for(uint32_t i = 1; i <= n; i++) head[i] = 0x7fffffff;
    next_edge = 0;
    uint8_t op;
    uint32_t source, destination;
    int64_t weight;
    for(uint32_t i = 1; i < n; i++){
        scanf("%hhu", &op);
        if(op == 0) scanf("%*u%*u");
        else if(op == 1){
            scanf("%u%u%ld", &source, &destination, &weight);
            if(weight > maximum_weight || weight < minimum_weight){
                printf("0\n");
                return;
            }
            insert_edge(source, destination, weight);
            insert_edge(destination, source, weight);
        }
    }
    int64_t left, right;
    for(uint32_t i = 1; i <= n; i++){
        if(head[i] >> 31 == 0){
            trace(i, l + r, l, r, &left, &right);
            if(left > right){
                result = 0;
                break;
            }
            result = ((right - left + 1) * result) % mod;
            if(result == 0) break;
        }
    }
    printf("%lu\n", result);
}
int main(){
    uint8_t T;
    scanf("%hhu", &T);
    for(uint8_t i = 0; i < T; i++) group_main();
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-29 13:28:22 | 显示全部楼层
本帖最后由 sfqxx 于 2023-1-29 13:30 编辑
dolly_yos2 发表于 2023-1-29 12:20
感觉好像有点思路,试着写了一个


拿着您的代码试了一下,得分85
有2个文件是WA
看看能不能改,不过这样已经很厉害了
测试信息: 屏幕截图_20230129_132802.png

基本看了一下,第一个文件错误原因是第二行太短,第二个文件错误答案。错误答案在第2行第1列,读8,应为7。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-29 13:36:56 From FishC Mobile | 显示全部楼层
sfqxx 发表于 2023-1-29 13:28
拿着您的代码试了一下,得分85
有2个文件是WA
看看能不能改,不过这样已经很厉害了

离谱 还能有全错在规模最小的数据上的情况
不过这大概说明思路是没有大问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-29 13:44:47 | 显示全部楼层
dolly_yos2 发表于 2023-1-29 13:36
离谱 还能有全错在规模最小的数据上的情况
不过这大概说明思路是没有大问题的

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-29 14:26:15 | 显示全部楼层
sfqxx 发表于 2023-1-29 13:28
拿着您的代码试了一下,得分85
有2个文件是WA
看看能不能改,不过这样已经很厉害了

有点不可思议
我的整体思路是这样的:
所有无权边可以忽略,这会将这棵树切分成一组所有边都是有权边的树(一个森林)
这个森林中的每一棵树中只要确定了任何一个点的取值,这棵树中所有点的取值就都确定了;任何一个点上的值变化,整棵树上的所有点的值一定一同发生变化,因此一棵树上点的填法数量和其中任何一个点的可取值数量是一致的
求出森林中每棵树的不同填法数量,将这些数量乘在一起就应该得到所有不同填法的数量
我又重新看了一遍我的代码,一共会调用 T 次 group_main,而 group_main 有且仅有两个出口,分别是第 69 行的 return 和函数结尾,两处都必然会经过一个 printf 函数输出当前组的结果,除非程序出现异常否则不应该缺少某组的输出。然而若程序出现异常,那么评测机的反馈理应为 RE 等异常退出状态而不是 WA
另一个问题期望答案应该是 7。考虑这一子任务的规模, n 不超过 10 而 l 和 r 均不小于 0 且不大于 5。可能性最多的情况是完全无约束的、最大点数量、最大取值范围,即全部边无权值、n 为 10 且 l, r 分别为 0 和 5。这一情况下每一个点各自独立有 6 种不同的取值,总填法数应该是 6^10 即 60466176,这一值远小于 1e9+7,因此应该是取模前的结果就是 7。然而 7 是质数,也就是说为组成此答案应该有一组(森林中的一棵树)恰有 7 种填法而其他树(若存在)都仅有一种。然而在数据规模约束下任何点都不会有超过 6 种填法,很好奇我的思考哪里出现了疏漏,究竟是什么样的数据能够得到这个 7 种填法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-29 14:27:31 | 显示全部楼层
dolly_yos2 发表于 2023-1-29 14:26
有点不可思议
我的整体思路是这样的:
所有无权边可以忽略,这会将这棵树切分成一组所有边都是有权边的 ...

看看第2行,他说太短
我要下了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-1 23:18:15 | 显示全部楼层
元豪 发表于 2023-1-28 13:03
我去!还真的瞎选啊!

我甚至怀疑这题高达 提高+/省选-

绿题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-21 17:36:40 From FishC Mobile | 显示全部楼层
真6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-23 18:33:03 | 显示全部楼层
zhangjinxuan 发表于 2023-1-27 21:31
是因为你是瞎选的题,啊呵呵,我说随便选你还真的就随便选啊

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-24 17:41:28 | 显示全部楼层
元豪 发表于 2023-1-28 13:03
我去!还真的瞎选啊!

我甚至怀疑这题高达 提高+/省选-

是普及/提高_
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 19:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表