sfqxx 发表于 2023-1-28 13:38:32

元豪 发表于 2023-1-28 13:03
我去!还真的瞎选啊!

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

今天选简单一些

dolly_yos2 发表于 2023-1-29 11:08:18

好奇一下这道题您有测试数据吗?

sfqxx 发表于 2023-1-29 11:41:15

dolly_yos2 发表于 2023-1-29 11:08
好奇一下这道题您有测试数据吗?

?没理解

dolly_yos2 发表于 2023-1-29 11:47:32

sfqxx 发表于 2023-1-29 11:41
?没理解

想知道您怎么判断一个回答是不是正确
比如您有一些输入和对应的答案吗?这道题目没有找到出处,您是否有对程序进行测试的途径?

sfqxx 发表于 2023-1-29 11:48:30

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

有,不知道现在能不能再提交
有测试的{:10_279:}

dolly_yos2 发表于 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.weight = weight;
    edges.destination = destination;
    edges.next = head;
    head = 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;
    int64_t low = p_weight - p_high;
    int64_t high = p_weight - p_low;
    head |= 1 << 31;
    int64_t child_low, child_high;
    for(uint32_t edge = start; edge != 0x7fffffff; edge = edges.next){
      if(head.destination] >> 31 == 1) continue;
      if(edges.weight - low < l || edges.weight - high > r){
            low = 1;
            high = 0;
            break;
      }
      if(edges.weight - r > low) low = edges.weight - r;
      if(edges.weight - l < high) high = edges.weight - l;
      trace(edges.destination, edges.weight, low, high, &child_low, &child_high);
      if(child_low > child_high){
            low = 1;
            high = 0;
            break;
      }
      if(edges.weight - child_high > low) low = edges.weight - child_high;
      if(edges.weight - child_low < high) high = edges.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 = 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 >> 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;
}

sfqxx 发表于 2023-1-29 13:28:22

本帖最后由 sfqxx 于 2023-1-29 13:30 编辑

dolly_yos2 发表于 2023-1-29 12:20
感觉好像有点思路,试着写了一个

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

基本看了一下,第一个文件错误原因是第二行太短,第二个文件错误答案。错误答案在第2行第1列,读8,应为7。

dolly_yos2 发表于 2023-1-29 13:36:56

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


离谱 还能有全错在规模最小的数据上的情况
不过这大概说明思路是没有大问题的

sfqxx 发表于 2023-1-29 13:44:47

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

{:10_275:}

dolly_yos2 发表于 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 种填法

sfqxx 发表于 2023-1-29 14:27:31

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

看看第2行,他说太短
我要下了

zhangjinxuan 发表于 2023-2-1 23:18:15

元豪 发表于 2023-1-28 13:03
我去!还真的瞎选啊!

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

绿题

sfqxx 发表于 2023-2-21 17:36:40

真6

sfqxx 发表于 2023-2-23 18:33:03

zhangjinxuan 发表于 2023-1-27 21:31
是因为你是瞎选的题,啊呵呵,我说随便选你还真的就随便选啊

{:10_257:}

sfqxx 发表于 2023-2-24 17:41:28

元豪 发表于 2023-1-28 13:03
我去!还真的瞎选啊!

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

是普及/提高_
页: 1 [2]
查看完整版本: 【C++板块提升计划】梦想护卫舰 第15期 画树