首页 > 其他分享 >[Codeforces] CF1719C Fighting Tournament

[Codeforces] CF1719C Fighting Tournament

时间:2023-11-24 20:48:09浏览次数:38  
标签:队头 int Tournament Codeforces Fighting en 运动员 maxn data

题目传送门

另:多测不清空,WA两行泪

题意

Burenka正准备去观看一年中最有趣的体育活动 —— 她朋友Tonya组织的格斗锦标赛。

n 名运动员参加了大赛,标号分别为为 1,2,... ,n 。第 i 名运动员的实力是 \(a_i(1 \le a_i \le n)\)每个运动员的实力是不同的,也就是说,数组 a 是 n 的 一种 全排列

大赛的流程是这样的:

一开始,运动员们按标号从小到大排成一列,队头为 1 号运动员,队尾为 n 号运动员。

每轮一次比赛,队头的两个人进行格斗,赢的人(实力较强的人)变成队头,输的人变成队尾

Burenka 问了 Tonya q 个问题,每个问题包含两个整数 ik ,表示 i 号运动员在前 k 轮中会胜多少场

分析

首先可以将这个活动看成一个打擂台,每次实力强的上台,输的下台

那么,可以很容易地发现,如果一个人下台了,那么他就不可能再次上台,因为台上的人的实力一定比他强

所以,一个人胜利的场次一定是一个区间,所以只需要把每个人的范围都预处理一下即可

代码

代码还是挺简单的,但是要注意几个坑:

  1. 除了第一个人之外,每个人都是可以和自己身前的人打一架的,所以是比第一个人要多一场的,也就是说第一个人需要减1(我为了方便就写成了-(i==1)

  2. 每个人都是可以最少和身前还有身后两个人打架的,所以当他下台和\(k\)作比较时,记得\(k\)要\(+1\)

代码如下:

#include<bits/stdc++.h>
using namespace std;

const int Maxn=2e5+10;
int n,q,maxn;
struct node
{
    int st,en;
    int data;
}a[Maxn];

void run()
{
    cin>>n>>q;maxn=0;
    for(int i=0;i<=n;i++) a[i].st=a[i].en=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].data;
        if(a[i].data>a[maxn].data) a[maxn].en=i-1,a[i].st=i,maxn=i;
    }
    a[maxn].en=n;
//    for(int i=1;i<=n;i++) cout<<a[i].st<<" "<<a[i].en<<endl;
    while(q--)
    {
        int i,k;
        cin>>i>>k;
        if(k<i-1) cout<<0;
        else if(i==maxn) cout<<k-i+2-(i==1);
        else if(a[i].st==0) cout<<0;
        else cout<<min(k+1,a[i].en)-a[i].st+1-(i==1);
        cout<<endl;
    }
}

int main()
{
    int t;
    cin>>t;
    while(t--) run();
}

标签:队头,int,Tournament,Codeforces,Fighting,en,运动员,maxn,data
From: https://www.cnblogs.com/lyk2010/p/17854722.html

相关文章

  • [Codeforces] CF1728C Digital Logarithm
    题目传送门很奇妙的一道题,我想到了正解,但是又没有完全想到题意我们定义\(f(x)\)表示取出\(x\)在十进制下的位数。(如\(f(114514)=6,\;f(998244353)=9\))。形式化讲,就是\(f(x)=\lfloor\log_{10}x\rfloor+1\)。给定两个数组\(a\)和\(b\),求执行若干次以......
  • [Codeforces] CF1475C Ball in Berland
    BallinBerland-洛谷题意在毕业典礼上,有\(a\)个男孩和\(b\)个女孩准备跳舞,不是所有的男孩和女孩都准备结伴跳舞。现在你知道\(k\)个可能的舞伴,你需要选择其中的两对,以便使没有人重复地出现在舞伴里,求可能的数量。思路暴力最朴素,也是简单的方法,就是通过暴力组合进行配对。......
  • [Codeforces] CF1506C Epic Transformation
    EpicTransformation-洛谷算是今天的题目里边思维难度最高的一道了,但是代码真的简单的要死题意你有一个长度为 \(n\) 的序列 \(a\),你可以对其进行下列操作:选择 \(i,j\) 满足 \(*a_i\neqa_j*\) 然后删除 \(*a_i,a_j*\) 两个数。求序列 a 经过若干次操作后最少......
  • [Codeforces] CF1705C Mark and His Unfinished Essay
    题目传送门题意给定长度为\(n\)的字符串\(s\),进行\(c\)次操作,每次操作将\(s_l\)到\(s_r\)复制到字符串尾。全部操作结束后有\(q\)次询问,每次询问字符串\(s\)的第\(k\)位。数据保证\(r\)不超过当前字符串长度,\(k\)不超过最终字符串长度。思路及分析通过数......
  • [Codeforces] CF1858C Yet Another Permutation Problem
    YetAnotherPermutationProblem-洛谷这题本来很简单,思路我也想到了,但是代码一直没写对,思路也一直换来换去(悲然而发现最开始的思路是对的题意Alex收到了一个名为"GCD排列"的游戏作为生日礼物。这个游戏的每一轮进行如下操作:首先,Alex选择一个整数序列\(a_1,a_2,…,a_......
  • Codeforces Round 905 (Div. 3)
    CodeforcesRound905(Div.3)A.Morning题意:操作:显示,向前走都为一次操作;目标:显示这四个数思路:0->10,然后依次作差就行#include<bits/stdc++.h>usingnamespacestd;voidsolve(){chara[4];intmi=100,sum=4,b[4];for(inti=0;i<4;i++){cin>>a[i]......
  • Codeforces Round 903 (Div. 3)
    CodeforcesRound903(Div.3)A.Don'tTrytoCount大概题意给你两个字符串a,b。a串可进行的操作为将整个a串复制到之前的a串后面(直接用a+a即可),然后看操作多少次可以让b串变为a串的子串如果不能就输出-1。#include<iostream>usingnamespacestd;stringa,b;voidsolve()......
  • Codeforces Round 910 (Div. 2)
    CodeforcesRound910(Div.2)A.MilicaandString解题思路:统计给定字符串\(s\)中的\(B\)的数量,记录为\(cnt\)。如果\(cnt==k\):输出0;如果\(cnt<k\):从左往右数,将第\(cnt-k\)个\(A\)的位置前的数全部变成\(B\).如果\(cnt>k\):从左往右数,将第\(k-cnt\)个\(B\)的......
  • CodeForces 1898F Vova Escapes the Matrix
    洛谷传送门CF传送门Type\(1\)是简单的。直接输出空格个数即可。Type\(2\)也是简单的。显然要堵住不在起点和出口最短路上的格子,答案为空格个数减去起点到任一出口的最短路。考虑Type\(3\)。容易发现答案为空格个数减去起点到任两个出口的最短路(公共部分只算一次)。考虑......
  • Codeforces Round 697 (Div. 3)
    A.OddDivisor#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong//#defineint__int128#definedoublelongdoubletypedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<string,string>PSS;constintN=......