您当前的位置: 首页 > 

对方正在debug

暂无认证

  • 4浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C. Fighting Tournament(模拟/map)

对方正在debug 发布时间:2022-08-17 13:00:31 ,浏览量:4

题目

题意

给定n个选手,每个选手有一个权值,且每个选手的权值取值各不相同,且范围为1到n。 即这n个选手的权值a[i]是一个关于n的排列。

两个选手进行比赛,权值大的那位选手获胜。

对于每轮比赛,做以下操作:

选择当前最前面两位选手,进行比赛。获胜的选手,排在第1位;失败的选手,排在最后1位。

例如5位选手,他们的权值为 3 1 4 5 2

第1轮,第1位选手和第2位选手比赛,第1位选手获胜,此时数组为 3 4 5 2 1

第2轮,第2位选手和第3位选手比赛,第3位选手获胜,此时数组为 4 5 2 1 3

第3轮,第3位选手和第4位选手比赛,第4位选手获胜,此时数组为 5 2 1 3 4

第4轮,第4位选手和第5位选手比赛,第4位选手获胜,此时数组为 5 1 3 4 2

第5轮,第4位选手和第2位选手比赛,第4位选手获胜,此时数组为 5 3 4 2 1 …

有q次询问,对于第i个选手,经过前k轮后,他总共获胜了多少次。

1 a[i] int Right[maxn];// leftest pos > i, which a[pos] > a[i] void init() { run = 0; while (true) { if (ve[0] == n) { break; } if (ve[0] > ve[1]) { swap(ve[0], ve[1]); } ++run; ++num[mp[ve[1]]]; int tmp = ve[0]; ve.pop_front(); ve.push_back(tmp); } int pos = 0; for (int i = 1; i a[i]) { Left[i] = pos; } else { Right[pos] = i; pos = i; } } } int cal() { int res; if (k >= run) {// case 1 res = num[pos]; if (a[pos] == n) { res += k - run; } return res; } // case 2.1 if (Left[pos] != -1) { return 0; } // case 2.2 k -= pos; if (k

关注
打赏
1664895754
查看更多评论
立即登录/注册

微信扫码登录

0.2006s