다른 매개 변수 (ID 및 흐름)별로 정렬에 액세스하려면 TVertex 객체 그룹이 필요합니다. O (1) 시간에 k 번째 요소를 찾고 o (log2 (N)) 시간에 해당 속성을 업데이트합니다.포인터 집합을 업데이트하는 방법 C++?
이렇게하려면 TComparatorF 및 TComparatorI 클래스를 사용합니다.
그들은 모두 TVertex 및 운영자에 대한 포인터를 가지고>과 TComparatorF는 비교 <
)는 TComparatorI은 IDS
TVertex을 (비교
흐름 비교기 자체에의 포인터를 둔다. 그런 다음 비교기를 비교기 세트에 배치합니다.
그러나 TVertex 객체의 속성을 업데이트하면 비교 자의 위치가 변경되지 않습니다.
내 세트를 강제 업데이트하거나 여러 정렬을 저장하는 더 좋은 방법이 있습니까?
코드 :
#include<stdio.h>
#include<set>
#include<stdlib.h>
using namespace std;
const int N=300000;
struct TVertex;
struct TComparatorF
{
TVertex *cmp;
bool operator >(const TComparatorF &other) const;
bool operator <(const TComparatorF &other) const;
};
struct TComparatorI
{
TVertex *cmp;
bool operator >(const TComparatorI &other) const;
bool operator <(const TComparatorI &other) const;
};
set <TComparatorF> flowset;
set <TComparatorI> idset;
struct TVertex
{
int flow,id;
TVertex();
};
bool TComparatorF::operator >(const TComparatorF &other) const
{
return !(*cmp).flow>(*(other.cmp)).flow;
}
bool TComparatorF::operator <(const TComparatorF &other) const
{
return !(*cmp).flow<(*(other.cmp)).flow;
}
bool TComparatorI::operator >(const TComparatorI &other) const
{
return !(*cmp).id>(*(other.cmp)).id;
}
bool TComparatorI::operator <(const TComparatorI &other) const
{
return !(*cmp).id<(*(other.cmp)).id;
}
TVertex::TVertex()
{
flow=0;
TComparatorF comp;
comp.cmp=this;
flowset.insert(comp);
TComparatorI comp2;
comp2.cmp=this;
idset.insert(comp2);
}
TVertex ver[N];
int main()
{
ver[0].flow=17;
ver[0].id=6;
ver[1].flow=100;
ver[1].id=5;
ver[2].flow=5798;
ver[2].id=40;
TComparatorF comp=*(flowset.begin());
TComparatorI comp2=*(idset.begin());
printf("%d %d\n",(*(comp.cmp)).flow,(*(comp2.cmp)).id);
system("PAUSE");
return 0;
}
내가 할
17 6
대신
5798 40
그래, 대부분의 컨테스트에 감사드립니다. 외부 라이브러리를 사용할 기회가 없습니다. – user2136963
래퍼의 경우 변수가 변경된 것을 알 수있는 이벤트 시스템없이 만들 수 있습니까? – user2136963
랩퍼에서 랩퍼를 통해서만 이벤트에 액세스 할 수 있으므로 변경시기를 알 수 있습니다. – stefaanv