HDU 5360 Hiking

The meaning of the question: Invite n to a party. If you have successfully invited x people before inviting the ith person, and li <= x <= ri, then the ith person will go, and ask you how to arrange to invite the most people.

Analysis: For all people, sort them according to li. For maintaining a priority queue, the priority of the small ri is in the queue, and then enumerate each time point, put all the current time points equal to li in the queue, and then take out The one with the highest priority, which is to be invited, of course, if the ri at the top of the queue is less than the current time point, it should be removed from the queue.

code show as below:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <sstream>
#include <list>
#include <assert.h>
#include <bitset>
#include <numeric>
#define debug() puts("++++")
#define gcd(a, b) __gcd(a, b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define fi first
#define se second
#define pb push_back
#define sqr(x) ((x)*(x))
#define ms(a,b) memset(a, b, sizeof a)
#define sz size()
#define be begin()
#define ed end()
#define pu push_up
#define pd push_down
#define cl clear()
#define lowbit(x) -x&x
//#define all 1,n,1
#define FOR(i,n,x)  for(int i = (x); i < (n); ++i)
#define freopenr freopen("in.in", "r", stdin)
#define freopenw freopen("out.out", "w", stdout)
using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const LL LNF = 1e17;
const double inf = 1e20;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 1e5 + 20;
const int maxm = 1e6 + 10;
const LL mod = 1000000000000000LL;
const int dr[] = {-1, 1, 0, 0, 1, 1, -1, -1};
const int dc[] = {0, 0, 1, -1, 1, -1, 1, -1};
const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int my[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline bool is_in(int r, int c) {
  return r >= 0 && r < n && c >= 0 && c < m;
}
inline int readInt(){ int x;  scanf("%d", &x);  return x; }

struct Node{
  int l, r, id;
  bool operator < (const Node &rhs) const{
    return r > rhs.r;
  }
};

Node a[maxn];
bool vis[maxn];


int main(){
  int T;  cin >> T;
  while(T--){
    scanf("%d", &n);
    for(int i = 0; i < n; ++i){
      scanf("%d", &a[i].l);
      a[i].id = i;
    }
    for(int i = 0; i < n; ++i)  scanf("%d", &a[i].r);
    sort(a, a + n, [&](Node a, Node b){ return a.l < b.l; });
    priority_queue<Node> pq;
    vector<int> ans;
    int k = 0;
    for(int i = 0; i < n; ++i){
      while(ans.sz == i && k < n && a[k].l == i)  pq.push(a[k++]);
      while(!pq.empty() && pq.top().r < i)  pq.pop();
      if(pq.empty())  continue;
      ans.pb(pq.top().id);  pq.pop();
    }
    printf("%d\n", ans.sz);
    int cnt = 0; ms(vis, 0);
    for(int i = 0; i < ans.sz; ++i){
      vis[ans[i]] = 1;
      if(cnt)  printf(" %d", ans[i] + 1);
      else printf("%d", ans[i] + 1);
      cnt = 1;
    }
    for(int i = 0; i < n; ++i)  if(!vis[i]){
      if(cnt)  printf(" %d", i + 1);
      else printf("%d", i + 1);
      cnt = 1;
    }
    printf("\n");
  }
  return 0;
}

  

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325096523&siteId=291194637