列表

详情


NC54605. 盖楼大挑战

描述

今年的双十一与以往似乎有些不同,桃饱网举办了名为"盖楼大挑战"的活动,每个用户都有着自己的楼,每个人的楼都有一个等级.与此同时还有着组队玩法,若干个人组成一支队伍,最终队伍的楼层等级等于队内所有人的楼层等级加上给这支队伍助力的人的楼层等级.每个人只能给同一支队伍助力一次,不能给自己的队伍助力,每个人只能给其他队伍助力K次(如果一个人已经助力了一支队伍之后再次收到了这支队伍里的人的助力请求则不会消耗次数,向自己所在队伍里的人请求助力是无效的,也不会消耗次数).icpc集训队里的人也想盖楼,他们组成了若干支队伍,并且互相发了助力请求.保证他们不会请求icpc集训队以外的人的助力,并且保证收到助力请求如果助力次数没有耗尽则一定会同意,现在给你每个人的楼层等级,所属队伍以及所有的助力请求,要求输出每个人所在队伍的等级.

输入描述

第一行输入三个数n, m, K, n为icpc集训队人数, m为总的助力请求数(请求的时间顺序即为输入顺序),K为助力限制数
第二行输入n个数,第i个数a_i表示第i个人的楼层等级
第三行输入n个数,第i个数b_i表示第i个人的队伍编号
接下来m行每行两个数x, y表示编号为x的人向编号为y的人请求助力

输出描述

一行n个数,第i个数表示第i个人所在队伍的等级

示例1

输入:

5 0 1
32 342 123 1 32
1 2 3 2 1

输出:

64 343 123 343 64

示例2

输入:

5 4 2
1 2 3 4 5
1 1 2 2 3
2 5
1 5
3 5
3 4

输出:

8 8 12 12 5

示例3

输入:

3 3 1
1 2 3
1 2 3
1 2
1 3
2 3

输出:

6 2 3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 744K, 提交时间: 2019-11-22 20:10:17

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000+50;
int a[MAXN],b[MAXN],s[MAXN],jl[MAXN],hel[MAXN][MAXN];
int main(){
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) jl[i]=k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
		s[b[i]]+=a[i];
	}
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		if(jl[y]&&!hel[y][b[x]]&&b[x]!=b[y]){
			s[b[x]]+=a[y];
			jl[y]--;
			hel[y][b[x]]=1;
		}
		
	}
	for(int i=1;i<=n;i++){
		cout<<s[b[i]]<<" ";
	}
	cout<<endl;
	return 0;
}

Python3(3.5.2) 解法, 执行用时: 49ms, 内存消耗: 3448K, 提交时间: 2019-11-22 20:44:04

n, m, K = map(int, input().split())
a = list(map(int, input().split()))
t = list(map(int, input().split()))
mark = [[] for _ in range(n)]
s = [0 for _ in range(max(t))]
for i in range(n):
    s[t[i] - 1] += a[i]
for i in range(m):
    x, y = map(int, input().split())
    if not(t[x - 1] in mark[y - 1] or len(mark[y - 1]) >= K or t[x - 1] == t[y - 1]):
        s[t[x - 1] - 1] += a[y - 1]
        mark[y - 1].append(t[x - 1])
for i in range(n):
    print(s[t[i] - 1], end=' ')

上一题