UVA - 1611 (구조 류)

1396 단어 고 효율
제목 의 대 의 는 n 길이 의 문자열 을 주어진 것 입 니 다. 길이 가 짝수 인 구간 의 반 대 반 만 교환 (반전 이 아 닌) 하고 9 ^ 6 (최 악의 nlogn 알고리즘) 을 초과 하지 않 고 순 서 를 매 기 는 것 입 니 다.
방법
처음에는 생각 지도 못 하 게 머리 가 사점 에 빠 졌 다.
사실 평소 전달 식 사상 으로 1 을 1 곳 에 두 면 나머지 는 키 문제 다.
1 을 어떻게 빨리 1 곳 에 두 는 지 는 사실 1 곳 은 고려 할 필요 가 없다.만약 에 1. 중심 위치 (짝수 상황 에서 오른쪽 에 있 는 중간 위 치 를 선택) 는 그 다음 에 교환 하면 된다.
나머지 는 양쪽 이 고 순서대로 교환 하면 1 을 중간 에 놓 을 수 있다.그래서 최 악 은 두 번 이 필요 해.그럼 총 시간 복잡 도 최 악 은 2 * n.
다음 코드:
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 10100;
int a[maxn],Id[maxn],n;
struct node{
  int x, y;
  node(int x=0,int y=0):x(x),y(y){}
};
vector ans;
int Swap(int x1,int y1,int x2,int y2){
  ans.push_back(node(x1,y2));
  for(int i=x1,j=x2;i<=y1;i++,j++){
     swap(Id[a[i]],Id[a[j]]);
     swap(a[i],a[j]);
  }
}
int main()
{
    int T=0;
    scanf("%d",&T);
    while(T--){
      scanf("%d",&n);
      for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        Id[a[i]]=i;
      }
      ans.clear();
      for(int i=1;i<=n;i++){
        if(Id[i]==i) continue;
         int m=(i+n+1)/2;
         int id=Id[i];
         if(id!=m){
            if(id

좋은 웹페이지 즐겨찾기