7K12 blog

猫でも分かる何か

データ構造の分割 LIB::MultiSplit

#include <bits/stdc++.h>
using namespace std;

namespace LIB {
	template<class MT>class MultiSplit {
		using ll=long long;
		using sl=set<ll>;
		template<class T>using ve=vector<T>;
		MT& ds;
		sl spl;
		template<class T>void push(ve<T>& t, T x) { t.push_back(x); } 
	public:
		MultiSplit(MT& ds):ds(ds) { spl.insert((ll)ds.size()-1); }
		void split(ll i) { spl.insert(i); }
		ve<MT> get() {
			ve<MT> res;
			MT div;
			auto d=ds.begin();
			auto s=spl.begin();
			for(ll i=0;i!=(ll)ds.size();i++) {
				push(div,*d),d++;
				if(i==*s) res.push_back(div),div.clear(),s++;
			}
			return res;
		}
	};
}