【TPC-17】迎国庆 & 拓尔思 2022年 9 月月赛 - Div2. 中学组

 1.星树

题目描述

给定一个包含 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,用YesNo表示。

样例

输入数据#1

5
1 4
2 4
3 4
4 5

Copy

输出数据#1

Yes

Copy

解释#1

44 号节点连接了其他所有节点,所以是星树。

输入数据#2

4
2 4
1 4
2 3

Copy

输出数据#2

No

Copy

解释#2

找不到连接其他所有节点的节点

输入数据#3

10
9 10
3 10
4 10
8 10
1 10
2 10
7 10
6 10
5 10

Copy

输出数据#3

Yes

Copy

解释#3

1010 号节点连接其他所有节点

数据范围

  • 对于 100\%100% 的数据:3≤n≤10^53≤n≤105,1≤a_i≤b_i≤N1≤ai​≤bi​≤N。
  • 给定的图必定一棵树


 

#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 以内时算作正确。

样例

输入数据#1

3
1 1
2 1
3 1

Copy

输出数据#1

3.000000000000000

Copy

解释#1

两簇火焰相遇在距离导火线左侧 33 厘米的地方。

输入数据#2

3
1 3
2 2
3 1

Copy

输出数据#2

3.833333333333333

Copy

输入数据#3

5
3 9
1 2
4 6
1 5
5 3

Copy

输出数据#3

8.916666666666668

Copy

数据范围

  • 对于 100\%100% 的数据:1\le N\le 10^51≤N≤105,1\le A_i,B_i\le 10001≤Ai​,Bi​≤1000。

#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;
}

3.网络游戏

题目描述

一款网络游戏有 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 个玩家登录。

样例

输入数据#1

3
1 2
2 3
3 1

Copy

输出数据#1

2 2 0

Copy

解释#1

第一位玩家在第 1,21,2天登录,第二位玩家在第 2,3,42,3,4 天登录,第三位玩家只在第 33 天登录。

因此,我们得到第 1,41,4 天有 11 位玩家登录,第 2,32,3 天有 22 位玩家登录,其他日子没有玩家登录。

答案表示:有一位玩家登录的天数是 22 天,有两位玩家登录的天数也是 22 天,有三位玩家登录的天数是 00 天。

输入数据#2

2
1000000000 1000000000
1000000000 1000000000

Copy

输出数据#2

0 1000000000

Copy

解释#2

可能有多名玩家在相同的时间段登录。

数据范围

  • 对于 100\%100% 的数据:1\le N\le 2\times 10^51≤N≤2×105,1\le A_i \le 10^91≤Ai​≤109,1\le B_i \le 10^91≤Bi​≤109。
#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,则输出其中字典序最小的排列:

  • 对于所有 i=1,...,Mi=1,...,M,都保证 A_iAi​ 出现在 B_iBi​ 前面。

如果没有这样的序列 PP 就输出 -1−1。

输入格式

第一行两个整数 NN 和 MM。
接下来 MM 行每行两个整数,表示 A_iAi​ 和 B_iBi​。

输出格式

输出答案。

样例

输入数据#1

4 3
2 1
3 4
2 4

Copy

输出数据#1

2 1 3 4

Copy

解释#1

有 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

2 3
1 2
1 2
2 1

Copy

输出数据#2

-1

Copy

解释#2

没有符合条件的排列。

数据范围

  • 对于 100\%100% 的数据:2\le N\le 2\times 10^52≤N≤2×105,1\le M \le 2\times 10^51≤M≤2×105,1\le A_i,B_i\le N1≤Ai​,Bi​≤N,A_i\neq B_iAi​=Bi​。
#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;
} 

你可能感兴趣的:(c++)