提出 #15664290


ソースコード 拡げる

#include<bits/stdc++.h>
#ifdef ONLINE_JUDGE
#define endl '\n'
#ifndef CODE_JAM
#undef CASE_INFO
#endif
#else
#pragma GCC optimize "trapv"
#endif
#define F first
#define S second
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define rep(n) for(int i = 0; i < n; i++)
#define repj(n) for(int j = 0; j < n; j++)
#define all(p) p.begin(), p.end()
#define count_1(p) __builtin_popcountll(p)
#define count_0(p) __builtin_ctzll(p)
using namespace std;
template<class X=int>inline X mid(X s,X e){return (s+(e-s)/2);}
template<class X=int>inline X len(X s,X e){return (e-s+1);}
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
const int MOD = 1e9 + 7;
const int oo = 987654321;
const ll OO = 1e18;

class Timer {
public:
	clock_t start;
	Timer() {start = clock();}
	~Timer() {cerr << (double)(clock() - start)/CLOCKS_PER_SEC << "\n";}
};

class MST {
	vector<vector<int>> T;
	int n;
public:
	MST(const vector<int>& A) {
		n = A.size();
		T.assign(2*n, vector<int>());
		for(int p = n; p < 2*n; p++)
			T[p].push_back(A[p - n]);
		for(int p = n - 1; p > 0; p--) {
			T[p].resize(T[p<<1].size() + T[p<<1|1].size());
			merge(all(T[p<<1]), all(T[p<<1|1]), T[p].begin());
		}
	}

	int query(int l, int r) {
		int thresh = l, ret = 0;
		for(l += n, r += n + 1; l < r; l>>=1, r>>=1) {
			if(l & 1) ret += lower_bound(all(T[l]), thresh) - T[l].begin(), l++;
			if(r & 1) --r, ret += lower_bound(all(T[r]), thresh) - T[r].begin();
		}
		return ret;
	}
};

void solve() {
	int n, Q;
	cin >> n >> Q;
	vi c(n); rep(n) cin >> c[i];
	vi cur(n, -1), prevOcc(n, -1);
	for(int i = 0; i < n; i++) {
      c[i]--;
		prevOcc[i] = cur[c[i]];
		cur[c[i]] = i;
	}
	MST mst(prevOcc);
	while(Q--) {
		int l, r;
		cin >> l >> r;
		l--; r--;
		cout << mst.query(l, r) << endl;
	}
}

signed main() {
	Timer ti;
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	int T = 1;
	#ifdef TEST_CASES
	cin >> T;
	#endif
	for(int t = 1; t <= T; t++) {
		#ifdef CASE_INFO
		cout << "Case #" << t << ": ";
		#endif
		solve();
	}
	return 0;
}

提出情報

提出日時
問題 F - Range Set Query
ユーザ hetp111
言語 C++ (GCC 9.2.1)
得点 600
コード長 2315 Byte
結果 AC
実行時間 966 ms
メモリ 95736 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 2
AC × 7
セット名 テストケース
Sample sample00, sample01
All handmade02, handmade03, handmade04, handmade05, random06, sample00, sample01
ケース名 結果 実行時間 メモリ
handmade02 AC 9 ms 3672 KiB
handmade03 AC 92 ms 20616 KiB
handmade04 AC 579 ms 95736 KiB
handmade05 AC 748 ms 95068 KiB
random06 AC 966 ms 90512 KiB
sample00 AC 8 ms 3676 KiB
sample01 AC 3 ms 3756 KiB