Codeforces 글로벌 라운드 13A. K 번째로 큰 값

A. K 번째로 큰 값


테스트 당 시간 제한 테스트 당 1 메모리 제한
256MB 입력 표준 입력
출력 표준 출력
n 개의 정수로 구성된 배열이 제공됩니다. 처음에 a의 모든 요소는 0 또는 1입니다. 두 종류의 q 쿼리를 처리해야합니다.

1 x : ax에 1-ax 값을 할당합니다.
2 k : 배열에서 k 번째로 큰 값을 인쇄합니다.
참고로, 배열 b에서 k 번째로 큰 값은 다음과 같이 정의됩니다.

증가하지 않는 순서로 배열을 정렬하고 그로부터 k 번째 요소를 반환합니다.
예를 들어, 배열 [0,1,0,1]에서 두 번째로 큰 요소는 1입니다. 증가하지 않는 순서로 정렬하면 [ 1,1,0,0]이고이 배열의 두 번째 요소는 1과 같습니다.
번역 :
n 개의 정수를 포함하는 배열 a를 제공합니다. 처음에 모든 요소 a는 0 또는 1입니다. 두 가지 유형의 q 쿼리를 처리해야합니다.

1 x : ax 값 1 + ax에 할당됩니다
.2 k : k 번째로 큰 값을 인쇄합니다.
다시 말해 K-array의 최대 값 B는 다음과 같이 정의됩니다.

증가하지 않는 순서로 배열을 정렬하고 k 번째로 큰 요소를 반환합니다.
예를 들어, 배열 [0, 1, 0, 1]에서 두 번째로 큰 요소는 1입니다. 왜냐하면 증가하지 않는 순서로 정렬 한 후에는이 배열의 두 번째 요소 인 [1, 1, 0, 0]이되기 때문입니다. 1로.

입력

첫 번째 줄에는 두 개의 정수 n과 q (1≤n, q≤10 5 )가 있습니다. 즉, 주어진 배열의 길이와 쿼리 수입니다.

두 번째 줄에는 n 개의 정수 a1, a2, a3,…, an (0≤ai≤1) — 초기 배열의 요소가 포함됩니다.

다음 q 줄은 각각 두 개의 정수를 포함합니다. 첫 번째 정수는 쿼리 유형 인 t (1≤t≤2)입니다.

t = 1이면 두 번째 정수는 x (1≤x≤n) — 수정 된 숫자의 위치입니다. ax에 값 1-ax를 할당해야합니다.
t = 2이면 두 번째 정수는 k입니다 (1≤k≤ n) — 배열에서 k 번째로 큰 값을 인쇄해야합니다.
두 번째 유형의 쿼리가 하나 이상 (t = 2 충족) 보장됩니다.
번역 : 첫
번째 줄에는 두 개의 정수 n과 q가 포함됩니다 ( 1≤n, q≤10 5 ) - 주어진 배열의 길이와 쿼리 수.

두 번째 줄에는 초기 배열의 n 개의 정수 a1, a2, a3 ..., (0≤ai≤1) 요소가 포함됩니다.

아래의 각 질문 줄에는 두 개의 정수가 포함되어 있습니다. 첫 번째 정수는 쿼리 유형 인 t (1≤t≤2)입니다.

t = 1이면 두 번째 정수는 x (1≤x≤n)-수정 된 숫자의 위치입니다. ax 값 1 + ax를 할당해야합니다.
t = 2이면 두 번째 정수가 K (1≤k≤n)이므로 k 번째로 큰 값을 인쇄해야합니다.
두 번째 유형에 대한 쿼리가 하나 이상 있는지 확인합니다 (만족스러운 t = 2).

산출

두 번째 유형의 각 쿼리에 대해 쿼리에 대한 답인 단일 정수를 인쇄합니다.

번역 : 두 번째 유형의 각 쿼리에 대해 정수를 인쇄합니다.

inputCopy

5 5
1 1 0 1 0
2 3
1 2
2 3
2 1
2 5

outputCopy

1
0
1
0

노트

처음에는 a = [1,1,0,1,0]입니다.

첫 번째 작업은 세 번째로 큰 값인 1을 인쇄하는 것입니다.

두 번째 작업은 a2에 값 0을 할당하고 a는 [1,0,0,1,0]이됩니다.

세 번째 작업은 세 번째로 큰 값을 인쇄하는 것이며 0입니다.

네 번째 작업은 첫 번째로 큰 값인 1을 인쇄하는 것입니다.

마지막 작업은 다섯 번째로 큰 값을 인쇄하고 0입니다.

문제 해결 아이디어

1. 제목에 따라 각 변수를 입력합니다. 특징은 배열의 값이 1 또는 0이라는 것입니다
. 2. num을 사용하여 배열에 1의 수를 기록합니다.
t = 1 인 경우 배열 변경, 출력 없음;
t = 2 s 일 때 num과 x의 비교에 따라 다른 출력이 수행됨
여기에 사진 설명 삽입

참조 코드

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    
    
	int n,q;
	cin>>n>>q;
	
	int a[n+1],num=0;
	for(int i=1;i<=n;i++){
    
    
		cin>>a[i];
		if(a[i])
			num++;//num用来统计数组中1的个数
	}
			
	int t,x;
	for(int i=0;i<q;i++){
    
    
		cin>>t>>x;
		if(t==1){
    
    
			if(a[x]){
    
    
				a[x]=0;
				num--;
			}else{
    
    
				a[x]=1;
				num++;
			}
		}else{
    
    
			if(x<=num)
				cout<<"1"<<endl;
			else
				cout<<"0"<<endl;
		}
	}
	return 0;
}

이해가 안된다면 방해
해도되고 배우면 좋아요를 남기고 서로 격려해주세요! ! !

추천

출처blog.csdn.net/weixin_45950429/article/details/114259703