CF401B - Sereja and Contests
阿新 • • 發佈:2021-09-28
Problem
CF有一些比賽,有的比賽只有Div2,其它的既有Div1也有Div2。每個比賽有個識別符號,從 \(1\) 開始依次編號,如果一場比賽有Div1和Div2,則Div2的識別符號一定是這次比賽的Div1的識別符號 \(+1\) 。已知一個人在 \([1,n)\) 的時間段內共打了 \(k\) 次比賽,知道每次比賽是否分Div以及它的識別符號。問這個人最多可能錯過多少Div2比賽,最少錯過多少場。
Solution
給所有出現了的編號打一個標記。對於剩下沒有標記的編號,最大值肯定就是這些編號的總數量。對於一段連續的無標記編號,會發現div2場的最少數量是這一段連續的編號數量除以 \(2\)
#include<bits/stdc++.h> using namespace std; bool f[4010]; int main() { int n,m,i,j,l=0,r=0; scanf("%d %d",&n,&m); f[n]=true; for(i=1;i<=m;i++) { int op,n1,n2; scanf("%d",&op); if(op==1) { scanf("%d %d",&n1,&n2); f[n1]=f[n2]=true; } else { scanf("%d",&n1); f[n1]=true; } } int cmb=0; for(i=1;i<=n;i++) { if(!f[i]) cmb++; else { l+=cmb/2+(cmb%2); r+=cmb; cmb=0; } } printf("%d %d",l,r); return 0; }