1. 程式人生 > >第15屆上海大學程式設計聯賽夏季賽暨上海高校金馬五校賽H

第15屆上海大學程式設計聯賽夏季賽暨上海高校金馬五校賽H

思路:

首先要知道:11+12+13+14+...++1n=ln(n)+C
然後就可以為所欲為【暴力吧!】
拿個優先佇列什麼的,或者直接numlog(num) sort好像都行????

程式碼:

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

const int N = 2e4 + 10;

int n, m, a[N];
priority_queue<int>que;
vector<int>xs[N];

void solve(int pos, int k){
    for
(int i=0;i<n;i+=k) que.push(a[i]); while(!que.empty()){ int x = que.top(); xs[pos].push_back(x); que.pop(); } } int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d%d",&n, &m); while(!que.empty()) que.pop(); for
(int i=0;i<n;i++){ scanf("%d", &a[i]); xs[i].clear(); } for(int i=0, k = 1;i < n; i++, k++) solve(i, k); int K, S; while(m--){ scanf("%d%d", &K, &S); if(K>n) puts("-1"); else
{ int Size = xs[K - 1].size(); if(Size < S) puts("-1"); else{ printf("%d\n",xs[K-1][S-1]); } } } } return 0; }