HDU4858 项目管理 算法刷题笔记

1. 题目描述

1.1. Limit

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 32768/32768 K (Java/Others)

1.2. Problem Description

我们建造了一个大项目!这个项目有 n n n 个节点,用很多边连接起来,并且这个项目是连通的!
两个节点间可能有多条边,不过一条边的两端必然是不同的节点。
每个节点都有一个能量值。

现在我们要编写一个项目管理软件,这个软件呢有两个操作:

  1. 给某个项目的能量值加上一个特定值。
  2. 询问跟一个项目相邻的项目的能量值之和。(如果有多条边就算多次,比如 a a a b b b 2 2 2 条边,那么询问 a a a 的时候 b b b 的权值算 2 2 2 次)。

1.3. Input

第一行一个整数 T ( 1 < = T < = 3 ) T(1 <= T <= 3) T(1<=T<=3),表示测试数据的个数。
然后对于每个测试数据,第一行有两个整数 n ( 1 < = n < = 100000 ) n(1 <= n <= 100000) n(1<=n<=100000) m ( 1 < = m < = n + 10 ) m(1 <= m <= n + 10) m(1<=m<=n+10),分别表示点数和边数。

然后 m m m 行,每行两个数 a a a b b b,表示 a a a b b b 之间有一条边。

然后一个整数 Q Q Q

然后 Q Q Q 行,每行第一个数 c m d cmd cmd 表示操作类型。如果 c m d cmd cmd 0 0 0,那么接下来两个数 u <mtext>   </mtext> v u\ v u v表示给项目 u u u 的能量值加上 v ( 0 < = v < = 100 ) v(0 <= v <= 100) v(0<=v<=100)
如果 c m d cmd cmd 1 1 1,那么接下来一个数 u u u 表示询问 u u u 相邻的项目的能量值之和。

所有点从 1 1 1 n n n 标号。


1.4. Output

对每个询问,输出一行表示答案。


1.5. Sample Input

1
3 2
1 2
1 3
6
0 1 15
0 3 4
1 1
1 3
0 2 33
1 2

1.6. Sample Output

4
15
15

1.7. Source

BestCoder Round #1


2. 解读

看到题目中的节点和连边,我们很自然地会想到用图去存储,但是
节点最大数量是 10万,要存一个10万x10万的二维数组非常容易爆内存。而从题目中我们可以发现,这个图的连边是比较稀疏的,所以我们可以采用邻接表的方式进行存储。

用邻接表存储了点和连边的关系之后,我们再用一个数组去存储每一个节点的相邻节点能量之和。在某一个节点能量增加之后,增加所有与其相邻的节点的能量,有查询请求时直接输出即可。

我查了网上的一些其他解读,据说这里用到了一种算法叫做分块算法,感兴趣的同学可以了解一下。

3. 代码

#define mill 100010
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
int main()
{
    // test case
    int t;
    scanf("%d", &t);
    // Buffer
    long long list[mill];
    // 声明邻接表
    vector<int> vec_list[mill];
    for (int j = 0; j < t; j++) {
        // 清空邻接表
        memset(vec_list, 0, sizeof(vec_list));
        // 清空Buffer
        memset(list, 0, sizeof(list));
        // 读数据
        int n, m;
        scanf("%d %d", &n, &m);
        // 连边
        int a, b;
        // 循环m次,读入连边
        for (int i = 0; i < m; i++) {
            scanf("%d %d", &a, &b);
            // ---存入ab-----------
            vec_list[a].push_back(b);
            // ---存入ba-----------
            vec_list[b].push_back(a);
        }
        // 读取query
        // query个数
        int q;
        scanf("%d", &q);
        // query 类型
        int qType;
        // query内容
        int u, v;
        // 读入query
        for (int i = 0; i < q; i++) {
            scanf("%d", &qType);
            if (qType == 0) {
                scanf("%d %d", &u, &v);
                // 操作query 0
                // 读连边
                vector<int> vec = vec_list[u];
                // 为每个与u相连的点加v能量
                for (unsigned long k = 0; k < vec.size(); k++) {
                    list[vec[k]] += v;
                }
            } else {
                scanf("%d", &u);
                // 操作query 1
                printf("%lld\n", list[u]);
            }
        }
    }
}
全部评论

相关推荐

整体时间线:2月末力扣从零开始。3月初刷题成瘾,中旬陆续开面开杀,被机试折磨,下旬纠结日常offer选择。4月入职淘天,从硬landing到上手业务快乐融入5月平静美好,顺利到我觉得直接转正是最佳选择,月底转暑期流程被hr直接挂,主管诱骗能转正,万幸蚂蚁暑期流程没拒掉,压哨发意向,手里也还有个腾讯offer兜底,毁约腾讯暑期到此结束。==============================一些感悟:永远保留后手,先拿了阿里国际日常,拿到网易伏羲offer之后才拒绝意向,中间难免要催hr尽量开在同一时间,后续等淘天oc的时候立马拒了网易意向。不会让手里超过2个offer,但是也不会在未确定的时候就拒掉到手的。在淘天的时候师兄主管都保证能转正别担心,甚至主管拉我进内部群一起团建,但是始终把腾讯offer抓在手里,也给了我撕破脸之后和主管谈判的底气。蚂蚁一面二面间隔一个半月,时不时反向保温一下面试官又没拒掉流程,真是我最明智的选择。==============================实习体验:研一在鹅厂AI&nbsp;Lab实习打杂纯快乐的,自己包装一下也是有产出的。遇到的所有人都很温和有礼貌,整体不卷年纪偏大,公司关怀好,不考虑城市的话应该会是第一选择。淘天业务组非常业务,技术不容易提升但是容易有产出,整体强度能承受分到的活也不多还挺核心的,师兄还是很nice的,往年转正待遇也挺好,小组整体年龄结构有中有小没老人,晋升空间不错。拒掉的offer里面,同花顺是做大模型部署加速的,给钱少太卷拒了;阿里国际是研究型实习生随便面的感觉面试官技术没有太懂;网易伏羲是llm+智能npc其实很有搞头,还是贪图大厂title拒了;腾讯这个最可惜,agent+游戏ai,而且在大部门实习过可以丝滑landing,腾讯招聘经常能看到校招社招广告,应该是团队扩张期,考虑到城市因素忍痛拒绝,释放一个hc给大家。==============================彩蛋:想看看牛u会做什么选择,感觉人生到了这个时间点,每个决策都会影响很大,已知和女友都是浙江人,她稳定杭州工作,计划后续杭州定居结婚。 #暑期实习# #腾讯# #阿里# #蚂蚁# #大模型# #淘天#
投递蚂蚁集团等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务