您的位置:首页 > 其它

洛谷Oj-P1801 黑匣子-STL

2018-03-27 20:42 232 查看
nth_element函数法(90分):

#pragma GCC optimize(3)//STL必备
int add[200010],get[200010];
int main()
{
int m,n;
cin >> m >> n;
for(int i = 1; i <= m; ++i)//添加
scanf("%d",&add[i]);
for(int i = 1; i <= n; ++i)//查询
scanf("%d",&get[i]);
int j = 0;//其实j没有必要存在
int id = 1;
for(int i = 1; i <= m; ++i)//对于每一个添加
{
while(get[id] == i)//如果第id个查询是在第i个元素被添加后
{
j++;
//注意:若对数组add使用函数,则数组内元素的顺序发生了改变
nth_element(add + 1,add + j,add + i + 1);
cout << add[j] << endl;
id++;
}
}
return 0;
}


MULTISET法(AC):

int add[200010],get[200010];
multiset<int> mul_s;//因为元素值可能会重复
int main()
{
int m,n;
cin >> m >> n;
for(int i = 1; i <= m; ++i)
scanf("%d",&add[i]);
for(int i = 1; i <= n; ++i)
scanf("%d",&get[i]);
mul_s.insert(add[1]);
multiset<int>::iterator it = mul_s.begin();//一定是set中有元素后再给迭代器赋初值
int id = 1;
for(int i = 1; i <= m; ++i)
{
if(i != 1)//add[1]已经被放过了
{
mul_s.insert(add[i]);//放入集合内
if(add[i] < *it)//如果比所指的值小
it--;//迭代器前移
}
while(get[id] == i)//第id个查询是在放入了第i个元素之后
{
if(id != 1)//如果是第一次查询的话直接输出就行,因为迭代器初始时指的就是最小的元素
it++;//之后需要向后移动
cout << *it << endl;
id++;
}
}
return 0;
}


解决方法:

set的默认顺序是升序,所要求的是当前set中的第id小

迭代器初始时指向第一个元素,如果新元素比指向的元素小,则迭代器前移
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: