题目:
http://acm.hdu.edu.cn/showproblem.php?pid=5360
题意:
某君要邀请n个人去郊游,每个人都有奇特的要求,对于第i个人,只有当前答应去郊游的人数cur满足MIN[i]<=cur<=MAX[i],他才会答应参加,并且参加后不会反悔,问最多能邀请到多少人去郊游,并给出任意满足题意邀请序列
思路:
先依据所有人min进行排序,当邀请人数为cur时,把数组里所有min等于cur的人放入优先队列,邀请队列中max最小,且max<=cur的那个人
代码:
#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<functional>
#pragma comment(linker, "/STACK:102400000,102400000")//C++
using namespace std;
const double PI = 3.141592653589793238462643383279502884197169399;
const int MAXINT = 0x7fffffff;
const int MAXSIZE = 100000 + 5;
const long long INF = 0x7FFFFFFFFFFFFFFF;
struct node{
int num;
int l,r;
};
bool operator <(const node&p1, const node&p2){
return p1.r>p2.r;
}
void quick_sort(node arr[],int l,int r){
int i=l,j=r;
int x=arr[(l+r)>>1].l;
while (i<=j){
while (arr[i].l<x) i++;
while (arr[j].l>x) j--;
if (i<=j){
swap(arr[i],arr[j]);
i++;
j--;
}
}
if (i<r) quick_sort(arr,i,r);
if (l<j) quick_sort(arr,l,j);
}
node arr[MAXSIZE];
vector<int> ans;
priority_queue<node> Q;
int main(){
int total;
cin>>total;
while (total--){
int n;
scanf("%d",&n);
for (int i=0;i<n;++i){
scanf("%d",&arr[i].l);
arr[i].num = i+1;
}
for (int i=0;i<n;++i){
scanf("%d",&arr[i].r);
}
quick_sort(arr,0,n-1);
int cur=0;
int k=0;
ans.clear();
while (!Q.empty()) Q.pop();
while (arr[k].l == 0) {
Q.push(arr[k]);
k++;
}
while (!Q.empty()){
while (!Q.empty()){
if (Q.top().r<cur) {
ans.push_back(Q.top().num);
Q.pop();
}
else break;
}
if (!Q.empty()){
ans.push_back(Q.top().num);
Q.pop();
cur++;
//cout<<cur<<" "<<ans[ans.size()-1]<<endl;
}
while (arr[k].l == cur) {
Q.push(arr[k]);
k++;
}
}
while (k<=n-1) {ans.push_back(arr[k].num);k++;}
printf("%d\n",cur);
for (int i=0;i<ans.size()-1;++i){
printf("%d ",ans[i]);
}
printf("%d\n",ans[ans.size()-1]);
}
return 0;
}