为啥我的 nlogn 过不了 1e6
查看原帖
为啥我的 nlogn 过不了 1e6
227514
jijidawang楼主2022/1/13 16:15

rt

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cassert>
#include <set>
#include <map>
#include <vector>
#include <unordered_map>
#include <cmath>
#include <bitset>
using namespace std;
typedef long long ll;
const int N = 1e6, K = 66;
const ll pow2[] = {1ll,2ll,4ll,8ll,16ll,32ll,64ll,128ll,256ll,512ll,1024ll,2048ll,4096ll,8192ll,16384ll,32768ll,65536ll,131072ll,262144ll,524288ll,1048576ll,2097152ll,4194304ll,8388608ll,16777216ll,33554432ll,67108864ll,134217728ll,268435456ll,536870912ll,1073741824ll,2147483648ll,4294967296ll,8589934592ll,17179869184ll,34359738368ll,68719476736ll,137438953472ll,274877906944ll,549755813888ll,1099511627776ll,2199023255552ll,4398046511104ll,8796093022208ll,17592186044416ll,35184372088832ll,70368744177664ll,140737488355328ll,281474976710656ll,562949953421312ll,1125899906842624ll,2251799813685248ll,4503599627370496ll,9007199254740992ll,18014398509481984ll,36028797018963968ll,72057594037927936ll,144115188075855872ll,288230376151711744ll,576460752303423488ll,1152921504606846976ll,2305843009213693952ll};
int n, k;
ll a[N], t[N], dis[N], M;
vector<pair<int, int> > inp;
namespace ST // st 表维护区间 or 
{
	ll f[N][K];
	void init(int n)
	{
		for (int i=1; i<=n; i++) f[i][0] = a[i];
		for (int j=1; (1<<j)<=n; j++)
			for (int i=1; i<=n+1-(1<<j); i++)
				f[i][j] = (f[i][j-1] | f[i+(1<<(j-1))][j-1]);
	}
	ll get(int l, int r)
	{
		int _ = log2(r-l+1);
		return f[l][_] | f[r-(1<<_)+1][_];
	}
}
vector<int> tmpV; set<int> tmpS; map<int, int> tmpM;
int main()
{
#ifndef ONLINE_JUDGE
	freopen("i.in", "r", stdin);
#endif
	scanf("%d%d", &n, &k); ll full = (1ll << k) - 1;
	for (int _, i=0; i<k; i++)
	{
		scanf("%d", &_); int r;
		while (_--)
		{
			scanf("%d", &r); inp.push_back(make_pair(r, i));
			auto x = tmpS.find(r);
			if (x == tmpS.end()) tmpV.push_back(r), tmpS.insert(r);
		}
	}
	sort(tmpV.begin(), tmpV.end()); int l = tmpV.size();
	for (int i=0; i<l; i++) tmpM[tmpV[i]] = i+1;
	for (auto x : inp)
	{
		int magic = tmpM[x.first];
		a[magic] |= pow2[x.second]; t[magic] = x.first;
	} // discretization
	int lim = tmpV.size(); ST::init(lim); ll __ = 0x3f3f3f3f;
//	for (int i=1; i<=lim; i++) cout<<t[i]<<":"<<bitset<4>(a[i])<<"\n";
	for (int i=1; i<=n; i++)
	{
		int l = i, r = lim, ans=-1;
		while (l <= r)
		{
			int mid = (l + r) >> 1;
			if (ST::get(i, mid) == full){ans = mid; r = mid - 1;}
			else l = mid + 1;
		}
		if (ans == -1) continue;
//		cout<<"["<<t[i]<<", "<<t[ans]<<"]\n";
		__ = min(__, t[ans] - t[i]);
	} printf("%lld\n", __);
	return 0;
}
2022/1/13 16:15
加载中...