链接:https://ac.nowcoder.com/acm/contest/6874/F
来源:牛客网
题目描述
牛牛擅长投影剑类来战斗,他投影的武器甚至有着核弹般的破坏力,故人送外号核弹剑仙。
现在牛牛投影了nn把武器,编号为1\sim n1∼n,每把武器都有一个属于自己的破坏力,且任意两把武器之间的破坏力不同。他接下来进行了mm次比较,每次比较会告诉你aa武器破坏力强于bb武器破坏力,数据保证比较结果不会自相矛盾。
请问你能根据这mm次比较结果,告诉牛牛:对于ii号武器,明确比ii号武器破坏力大的武器有多少把吗?
输入描述:
第一行两个正整数nn,mm,n\leq10^{3}n≤10
3
,m\leq2\times10^{3}m≤2×10
3
。
接下来mm行,每行两个正整数aa,bb,其中a\leq na≤n,b\leq nb≤n。
输出描述:
输出nn行,第ii行的数字表示明确比ii号武器破坏力大的武器有多少把。
示例1
输入
复制
6 5
1 3
2 4
3 5
4 5
5 6
输出
复制
0
0
1
1
4
5
每两个之间的比较,用二进制优化即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <bitset>
using namespace std;
const int N = 1e3 + 10;
bitset<N> g[N];
int main(){
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++) g[i].reset();
for (int i = 1; i <= m; i ++){
int a, b;
scanf("%d%d", &a, &b);
g[b][a] = 1;
}
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
if (g[j][i]) g[j] |= g[i];
for (int i = 1; i <= n; i ++){
int cnt = 0;
for (int j = 1; j <= n; j ++){
if (g[i][j]) cnt ++;
}
cout << cnt << endl;
}
return 0;
}