题目
题意给定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
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?