1063 sicily(木は正確に題意を理解して、ずっとwrong error)--しかしこの事の迅速な順序の一回の復習、やはり記録します

6140 ワード

//本ブログは私が自分で勉强して、総括する场所で、正确ではありませんて、みんなに调べてもらうならば、必ずはっきり说明を见て、各位の事を遅らせないようにします.
#include <iostream>
using namespace std;
#define E 30000
#define Q 200
typedef struct node{
int id;
long s;
long long m;
}Node;
Node arr[E];
int qArr[Q];

void quickSort(int low,int high);
int partition(int low,int high);
int main()
{
int nt;
cin>>nt;
while(nt--)
{
int p,q;
cin>>p>>q;
for(int i=0;i<p;i++)
{
cin>>arr[i].id>>arr[i].s>>arr[i].m;
}
for(int i=0;i<q;i++)
{
cin>>qArr[i];
}
//
quickSort(0,p-1);
for(int i=0;i<q;i++)
{
for(int j=0;j<p;j++)
{
if(arr[j].id==qArr[i])
{
if(j==0)
{
cout<<0<<" "<<p-1<<endl;
}
else
{
int k=j-1;
for(;k>=0;)
{
if(arr[j].m>arr[k].m)
{
k--;
}
else
{
break;
}

}
cout<<arr[k].id;
k=j+1;
for(;k<p;)
{
if(arr[j].m<arr[k].m)
{
k++;
}
else
{
break;
}
}
cout<<" "<<p-k<<endl;
}
}
}
}
}
return 0;
}

void quickSort(int low,int high)
{
int index;
if(low<high)
{
index=partition(low,high);
quickSort(low,index-1);
quickSort(index+1,high);
}
}
int partition(int low,int high)
{
Node temp=arr[low];
while(low<high)
{
while(low<high&&arr[high].s<temp.s)
{
high--;
}
if(low<high)
{
arr[low]=arr[high];
low++;
}
while(low<high&&arr[low].s>temp.s)
{
low++;
}
if(low<high)
{
arr[high]=arr[low];
high--;
}
}
arr[low]=temp;
return low;
}