题 解 [CF332C] 학생 복수

얼굴 질문

결심

매운 닭고기 얼굴은 내 청소년 제목을 파괴

문제의 얼굴이 번역 쓴 있기 때문에 \ (n 개의-K의 나머지가 완료되지 않습니다 \) .

그래서 나머지 생각 (\ NK) \ 값을 계산합니다 개월이 만족되지 않습니다.

(그러나 사실입니다 만 \ (PK의 \) 더 ...)

첫째, 대통령의 규칙에 따라, 우리가 먼저 임페리얼 수 있습니다 \ (PK의 \)가 절대적으로 작업을 선택할 수 없습니다,

\ (B \) 하강은 다음 \ (A \) 오름차순 최후 선 촬영.

(... 그것을 이해하기 쉬워야한다)

그런 언론의 나머지 넣어 \ (A \) , 내림차순

이어서 \ (b \) 복용 전에 내림차순 \ (케이 \)를 제 최대 백발 상황이다.

여기에 \ (ㄱ \)가 하강 때문에의 나머지 (\ PK) \ 또한 불만이 있지만, 가장 큰,

그래서 만약 하강 더 많은 기회가있다.

그런 다음 나머지 고려 (PK \) \을 A,

킹 제임스 반드시 불만의 가장 큰 경우가 아니라 전에 때문에,

그래서 우리는 첫 번째 순서를 눌러야합니다,

이미 복용하기 전에했다 \ (케이 \) 작업의 얼굴에서 지난 후 개월 \ (PK \) 목록에있는 일.

이것은 약간 복잡한 사운드 수 있습니다 ...

우리는의 나머지 수 있도록 싶기 때문에 \는 (PK \) 하나가 앞에서 방해 할 수 없습니다 \ (케이 \) (즉, 의자의 규칙에 더 높은 우선 순위) 일.

그리고 자신 \ (전년 동기 대비 \) 아래의 목록에 있어야합니다.

주목해야 할 또 다른 점은이다

두 작업 수 있으므로 \ (A, B \) , 동등

그래서 결과가 두 번 같은 종류를하지 않을 수 있습니다합니다 (WA 침을하기 때문에 ...)

그래서 잘 세 번째 키와 숫자를 주문할 때.

암호:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;

inline int read(){
    int sum=0,f=1;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
    return f*sum;
}

const int N=200005;
struct node{int x,y,tag,id,pos;}a[N],b[N];
int n,K,P,sum=0x3f3f3f3f,ret=0;

inline bool cmp(node a,node b){
    return a.y!=b.y? a.y<b.y:a.x>b.x;
}

inline bool cmp1(node a,node b){
//  if(a.tag!=b.tag) return a.tag<b.tag;
    if(a.x!=b.x) return a.x>b.x;
    return a.y>b.y;
}

inline bool cmp2(node a,node b){return a.y!=b.y? a.y>b.y:a.x<b.x;}

signed main(){
    n=read();P=read();K=read();
    for(int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();
    for(int i=1;i<=n;i++) a[i].id=i;
    sort(a+1,a+n+1,cmp2);
    memcpy(b,a,sizeof(b));
    for(int i=1;i<=n;i++) a[i].pos=i;
    int ss=P-K;
    sort(a+1,a+n-ss+1,cmp1);
    for(int i=1;i<=K;i++) printf("%d ",a[i].id);
    for(int i=1;i<=K;i++) ret=max(ret,a[i].pos);
//  sort(a+ret+1,a+n+1,cmp2);
    for(int i=1;i<=ss;i++){
        printf("%d ",b[i+ret].id);
    }
    
//  for(int i=1;i<=n;i++) if(a[i].tag) printf("%d ",a[i].id);
    puts("");
    return 0;
}

추천

출처www.cnblogs.com/zsq259/p/11519896.html