#세그먼트 트리
아이디어는 내가 간단하다 내가 이번에 이을 숫자 쌍 뒤로 몇개의 숫자가 존재하냐를 묻는 문제이다.
여기서 "뒤로 몇개의 숫자가 존재하냐"를 세그먼트 트리로 구현 해주면된다.
# 실수 했던 점
세그먼트 트리를 오랜만에 풀었더니 퀴리함수에서 탈출조건을 잘못써서 시간초과가 한번났다.
정답은 long long형 이여야 한다.
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #define MAX 100005 #define INF 987654321 #define MOD 1000000 #pragma warning(disable:4996) using namespace std; typedef long long ll; typedef pair<int, int> pi; int t,n,m,loc[MAX],arr[MAX],seg[MAX*4]; int update(int val,int pos,int x,int y) { if(!(x<=val&&val<=y)) return seg[pos]; if(x==y) return seg[pos]=1; return seg[pos]=update(val,pos*2,x,(x+y)/2)+update(val,pos*2+1,(x+y)/2+1,y); } int query(int pos,int l,int r,int x, int y) { if(y<l||r<x) return 0; if(l<=x&&y<=r) return seg[pos]; return query(pos*2,l,r,x,(x+y)/2)+query(pos*2+1,l,r,(x+y)/2+1,y); } int main() { scanf("%d", &t); for(int i=0;i<t;i++) { ll ans=0; fill_n(&seg[0],MAX*4,0); scanf("%d",&n); for(int k=1;k<=n;k++) { scanf("%d",&m); loc[m]=k; } for(int k=1;k<=n;k++) { scanf("%d",&m); arr[k]=loc[m]; } for(int k=1;k<=n;k++) { ans+=(ll)query(1,arr[k],n,1,n); update(arr[k],1,1,n); } printf("%lld\n",ans); } return 0; }
'IT > BOJ' 카테고리의 다른 글
백준(BOJ) 14709 여우사인 * (0) | 2018.07.21 |
---|---|
백준(BOJ) 14728 벼락치기 ** (0) | 2018.07.21 |
백준(BOJ) 13547 수열과 쿼리5 *** (0) | 2018.06.28 |
백준(BOJ) 15807 빛영우 *** (0) | 2018.06.28 |
백준(BOJ) 15808 주말 여행 계획 ** (0) | 2018.06.28 |