打卡信奥刷题(3398)用C++实现信奥题 P9980 [USACO23DEC] Flight Routes G

P9980 [USACO23DEC] Flight Routes G

题目描述

Bessie 最近发现她最喜欢的摇滚艺术家 Elsie Swift 正在表演她最新的“时代之旅”音乐会!不幸的是,票卖光的太快了,所以 Bessie 考虑飞往另一个城市参加音乐会。“时代之旅”将在编号为 1…N1\dots N1NNNN2≤N≤7502 \le N \le 7502N750)座城市上演,每对满足 i<ji<ji<j 的城市对 (i,j)(i,j)(i,j) 都可能存在从 iiijjj 的一条单向直飞航班

从城市 aaa 到城市 bbb 的一条航线是一个包含 k≥2k\ge 2k2 座城市的序列 a=c1<c2<⋯<ck=ba=c_1<c_2<\cdots<c_k=ba=c1<c2<<ck=b,使得对于所有的 1≤i<k1\le i< k1i<k,城市 cic_{i}ci 到城市 ci+1c_{i+1}ci+1单向直飞航班。对于所有满足 i<ji<ji<j 的城市对 (i,j)(i,j)(i,j),你将被告知它们之间航线数目的奇偶性(000 代表偶数,111 代表奇数)。

在计划她的旅行行程时,Bessie 分心了。现在她想知道,有多少对城市间有单向直飞航班。可以证明答案是唯一的。

输入格式

第一行包含整数 NNN

接下来 N−1N-1N1 行,第 iii 行包含 N−iN-iNi 个整数。第 iii 行的第 jjj 个整数表示从城市 iii 到城市 i+ji+ji+j 的航线数目的奇偶性。

输出格式

输出有单向直飞航班的城市对数。

输入输出样例 #1

输入 #1

3
11
1

输出 #1

2

输入输出样例 #2

输入 #2

5
1111
101
01
1

输出 #2

6

说明/提示

样例解释 1

有两条单向直飞航班:1→21\rightarrow 2122→32\rightarrow 323。有城市 1,21,21,2 之间、2,32,32,3 之间,仅包含一条单向直飞航班的航线各一条。还有城市 1,31,31,3 之间的航线一条(1→2→31\rightarrow 2\rightarrow 3123)。

样例解释 2

有六条单向直飞航班:1→21\rightarrow 2121→41 \rightarrow 4141→51\rightarrow 5152→32\rightarrow 3233→53\rightarrow 5354→54\rightarrow 545。这导致的航线数如下表所示:

出发地\目的地12345
101113
200101
300001
400001
500000

这与输入是相符的。

测试点性质

  • 测试点 3−43-434 满足 N≤6N \le 6N6
  • 测试点 5−125-12512 满足 N≤100N \le 100N100
  • 测试点 13−2213-221322 没有额外限制。

C++实现

#include <algorithm>
#include <iostream>
#include <vector>
#include <bitset>
#include <string>
#include <array>
using namespace std;
array<bitset<1500>,750> matrix;
int main(int argc,char* argv[],char* envp[])
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int cnt;
    cin>>cnt;
    for(int i=0;i<cnt;matrix[i].set(i),matrix[i].set(i+cnt),i++)
        for(int j=i+1;j<cnt;j++)
        {
            char tmp;
            cin>>tmp;
            matrix[i][j]=tmp-'0';
        }
    for(int i=0;i<cnt;i++)
        for(int j=0;j<i;j++)
            if(matrix[j][i])
                matrix[j]^=matrix[i];
    int answer=0;
    for(int i=0;i<cnt;i++)
        for(int j=i+1;j<cnt;j++)
            answer+=matrix[i][j+cnt];
    cout<<answer;
    return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值