给定一个包含 NN 个节点和 N-1N−1 条边的树。
节点编号 1,2,...N1,2,...N。第 ii 条边连接节点 a_iai 和 b_ibi。
判断这棵树是否为一个 star(星树)。
star(星树)的定义:如果树中有一个节点与其他所有节点直接相连,则称它是星树(图)。
第一行一个整数NN。
接下来N-1N−1行。每行两个数表示a_iai和b_i (1≤i≤N-1)bi(1≤i≤N−1)。
输入的树是否为star,用Yes
和No
表示。
5
1 4
2 4
3 4
4 5
Copy
Yes
Copy
44 号节点连接了其他所有节点,所以是星树。
4
2 4
1 4
2 3
Copy
No
Copy
找不到连接其他所有节点的节点
10
9 10
3 10
4 10
8 10
1 10
2 10
7 10
6 10
5 10
Copy
Yes
Copy
1010 号节点连接其他所有节点
#include
using namespace std;
const int N = 3e5 + 5;
int n, u, v, in[N]; // 记录入度
int main() {
cin >> n;
for(int i = 2; i <= n; i++){
cin >> u >> v;
in[u]++;
in[v]++;
}
for(int i = 1; i <= n; i++) {
if(in[i] == n-1) {
cout << "Yes" << endl;
return 0;
}
}
cout << "No" << endl;
return 0;
}
2.导火线
有 NN 根引线连成一条导火线。其中从左数的第 ii 根引线长度为 A_iAi 厘米,燃烧速度是 B_iBi 厘米每秒。同时点燃这条线的最左侧和最右侧。找出两簇火焰最终在哪里相遇,用相遇点到导火线最左侧的距离表示。
第一行一个整数NN。
接下来 NN 行,每行一对整数,依次是 A_iAi 和 B_iBi。
输出火焰相遇的点到导火线最左侧的距离,单位是厘米(只需要打印数字)。
你的输出与标准答案相差在 10^{-5}10−5 以内时算作正确。
3
1 1
2 1
3 1
Copy
3.000000000000000
Copy
两簇火焰相遇在距离导火线左侧 33 厘米的地方。
3
1 3
2 2
3 1
Copy
3.833333333333333
Copy
5
3 9
1 2
4 6
1 5
5 3
Copy
8.916666666666668
Copy
#include
using namespace std;
const int N = 1e5+5;
int n;
double a[N], b[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i] >> b[i];
double t = 0, ans = 0;
for(int i = 0; i < n; i++) t += a[i] / b[i];
t /= 2;
for(int i = 0; t; i++){
ans += min(a[i], t * b[i]);
t -= min(a[i] / b[i], t);
}
cout << fixed << setprecision(15) << ans;
}
一款网络游戏有 NN 个注册玩家。
今天是游戏发布上线的第 10^{100}10100 天。开发者拓拓检查了用户的登录历史。他发现第 ii 个用户从 A_iAi 日开始,连续登录了 B_iBi 天,并且没在其他天登录(第 11 天是游戏上线的日子)。也就是,第 ii 名玩家登录的日子是 A_i,A_{i+1},...,A_i+B_i-1Ai,Ai+1,...,Ai+Bi−1,并且只在这些天登录过。
对于每一个满足 1\le k\le N1≤k≤N 的整数 kk,找出有多少天当天刚好 kk 名玩家登录。
第一行一个整数 NN。
接下来 NN 行每行两个整数,表示 A_iAi 和 B_iBi。
输出 NN 个整数,以空格隔开。第 ii 个数表示有多少天刚好有 ii 个玩家登录。
3
1 2
2 3
3 1
Copy
2 2 0
Copy
第一位玩家在第 1,21,2天登录,第二位玩家在第 2,3,42,3,4 天登录,第三位玩家只在第 33 天登录。
因此,我们得到第 1,41,4 天有 11 位玩家登录,第 2,32,3 天有 22 位玩家登录,其他日子没有玩家登录。
答案表示:有一位玩家登录的天数是 22 天,有两位玩家登录的天数也是 22 天,有三位玩家登录的天数是 00 天。
2
1000000000 1000000000
1000000000 1000000000
Copy
0 1000000000
Copy
可能有多名玩家在相同的时间段登录。
#include
using namespace std;
const int N = 2e5+5;
long long l, r, a[2*N];
int n, t[N];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 1; i <= n; i++) {
cin>>l>>r;
r += l-1;
a[i*2-1] = l*2+1;
a[i*2] = r*2+2;
}
sort(a+1, a+n*2+1);
long long s = 0, d = 0;
for(int i = 1; i <= n*2; i++) {
if(a[i]/2 > d) {
t[s] += a[i]/2-d;
d = a[i]/2;
}
if(a[i] %2 ==0) s--;
else s++;
}
for(int i=1;i<=n;i++) cout<
4.有限制的排列
在 (1,2,...,N)(1,2,...,N) 的排列组合中,如果有满足下列条件的序列 PP,则输出其中字典序最小的排列:
如果没有这样的序列 PP 就输出 -1−1。
第一行两个整数 NN 和 MM。
接下来 MM 行每行两个整数,表示 A_iAi 和 B_iBi。
输出答案。
4 3
2 1
3 4
2 4
Copy
2 1 3 4
Copy
有 55 个满足条件的排列 PP:(2,1,3,4)(2,1,3,4),(2,3,1,4)(2,3,1,4),(2,3,4,1)(2,3,4,1),(3,2,1,4)(3,2,1,4),(3,2,4,1)(3,2,4,1)。其中字典序最小的是 (2,1,3,4)(2,1,3,4)。
2 3
1 2
1 2
2 1
Copy
-1
Copy
没有符合条件的排列。
#include
#define endl "\n"
using namespace std;
int n,m;
int in[200009];
vectorgra[200009],prt;
priority_queue,greater >q;
inline bool Tops()
{
int res=0;
for(int i=1;i<=n;i++)
if(!in[i]) res++,q.push(i);
while(!q.empty())
{
int u=q.top();
q.pop();
prt.push_back(u);
for(int i=0;i>n>>m;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
gra[u].push_back(v);
in[v]++;
}
if(Tops()) cout<<-1;
else print();
return 0;
}