为什么我显示编译失败qaq
查看原帖
为什么我显示编译失败qaq
649710
Lorkji楼主2022/1/30 19:20

显示了这个东东: No valid executable file was produced by the compiler /nix/store/js66s0xwjnzg0ggi2lq9bcvlk6x2za13-binutils-2.35.2/bin/ld: /tmp/compiler_50gnb_x4/lib.o: in function std::vector<int, std::allocator<int> >::vector(std::vector<int, std::allocator<int> > const&)': src:(.text._ZNSt6vectorIiSaIiEEC2ERKS1_[_ZNSt6vectorIiSaIiEEC5ERKS1_]+0x8e): undefined reference to std::__throw_bad_array_new_length()' collect2: 错误:ld 返回 1

代码:

#include <vector>

int draw_territory(int N, int A, int B, std::vector<int> D, std::vector<int> L);
#include <bits/stdc++.h>
#define rep(i, n) for(int i = 0; i < (int)(n); i ++)
#define rep1(i, n) for(int i = 1; i <= (int)(n); i ++)
#define MP make_pair

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int MOD = 1e9 + 7;
int dx[6] = {1, 1, 0, -1, -1, 0}, dy[6] = {0, 1, 1, 0, -1, -1};

int fr[200005], to[200005], pos[200005], dif[200005];
int grp[200005], tp[200005], oth[200005], lx[200005], rx[200005], ly[200005], ry[200005], n, cnt;
vector<PII> T[200005];

vector<int> xs, hv[200005];

int tmp;
int eval(int i, int x)
{
	return pos[i] + dif[i] * x;
}
bool cmp(int i, int j)
{
	int vi = pos[i] + dif[i] * tmp, vj = pos[j] + dif[j] * tmp;
	return vi < vj || (vi == vj && ((tp[i] == -1) == (tp[j] == -1) ? i != j && ((tp[i] == -1) ^ dif[i]) : i < j));
}
struct cmp_t
{
	bool operator()(int i, int j)
	{
		return cmp(i, j);
	}
};
set<int, cmp_t> rs;
void add_edge(int u, int v)
{
	T[u].push_back(MP(v, tmp)); T[v].push_back(MP(u, tmp)); 
}
void upd(int l, int r)
{
	if(tp[l] == -1 && tp[r] == -1) {
		set<int, cmp_t>::iterator it = rs.lower_bound(r);
		if(it == rs.end() || cmp(r, oth[*it])) {
			rs.insert(r);
			tp[l] = 0; tp[r] = 1; oth[l] = r; oth[r] = l;
			lx[cnt] = tmp; ly[cnt] = l; ry[cnt] = r;
			grp[l] = grp[r] = cnt ++;
		} else {
			int ro = *it, lo = oth[ro];
			rs.insert(l);
			tp[l] = 1; tp[r] = 0; oth[l] = lo; oth[lo] = l; oth[r] = ro; oth[ro] = r;
			add_edge(grp[lo], cnt); add_edge(grp[lo], cnt + 1);
			rx[grp[lo]] = lx[cnt] = lx[cnt + 1] = tmp; ly[cnt] = lo; ry[cnt] = l; ly[cnt + 1] = r; ry[cnt + 1] = ro;
			grp[l] = grp[lo] = cnt ++; grp[r] = grp[ro] = cnt ++;
		}
	} else if(tp[l] == 0 && tp[r] == 1) {
		rs.erase(r);
		tp[l] = tp[r] = -1; rx[grp[l]] = tmp;
	} else if(tp[l] == 1 && tp[r] == 0) {
		rs.erase(l);
		int lo = oth[l], ro = oth[r];
		tp[l] = tp[r] = -1; oth[lo] = ro; oth[ro] = lo;
		add_edge(grp[l], cnt); add_edge(grp[r], cnt);
		rx[grp[l]] = rx[grp[r]] = lx[cnt] = tmp; ly[cnt] = lo; ry[cnt] = ro;
		grp[lo] = grp[ro] = cnt ++;
	} else {
		if(tp[r] == -1) swap(l, r);
		if(tp[r] == 1) {
			rs.erase(r); rs.insert(l);
		}
		int ro = oth[r];
		swap(tp[l], tp[r]); oth[l] = ro; oth[ro] = l;
		add_edge(grp[r], cnt);
		rx[grp[r]] = lx[cnt] = tmp; ly[cnt] = l; ry[cnt] = ro; if(tp[l]) swap(ly[cnt], ry[cnt]);
		grp[l] = grp[oth[r]] = cnt ++;
	}
}

int absv(int x)
{
	return x < 0 ? -x : x;
}
int pe[200005], cd[200005];
int dfs(int v, int par, int A, int B)
{
	int ret = 0;
	int len = rx[v] - lx[v] + 1, dl = eval(ry[v], lx[v]) - eval(ly[v], lx[v]) + 1, dr = eval(ry[v], rx[v]) - eval(ly[v], rx[v]) + 1;
	if(pe[v] == rx[v]) swap(dl, dr);
	ret = 1LL * (dl + dr) * len / 2 % MOD * ((1LL * cd[v] * A + B) % MOD) % MOD;
	if(len != 1) {
		int dif = (dr - dl) / (len - 1);
		ret = (ret + 1LL * len * (len - 1) / 2 % MOD * dl % MOD * A) % MOD;
		ret = (ret + 1LL * len * (len - 1) % MOD * (2 * len - 1) % MOD * (MOD + 1) / 6 % MOD * (MOD + A * dif)) % MOD;
	}
	
	rep(i, T[v].size()) {
		int u = T[v][i].first;
		if(u == par) continue;
		pe[u] = T[v][i].second; cd[u] = (cd[v] + absv(pe[u] - pe[v])) % MOD;
		ret = (ret + (1LL * cd[u] * A + B) % MOD * (MOD - min(eval(ry[u], pe[u]), eval(ry[v], pe[u])) + max(eval(ly[u], pe[u]), eval(ly[v], pe[u])) - 1)) % MOD;
		ret = (ret + dfs(u, v, A, B)) % MOD;
	}
	return ret;
}

int calc(int N, int A, int B, vector<int> D, vector<int> L)
{
	rep(i, cnt) T[i].clear();
	rep(i, xs.size()) hv[i].clear();
	cnt = n = 0; xs.clear();
	
	int cx = 0, cy = 0;
	rep(i, N) {
		int nx = cx + L[i] * dx[D[i]], ny = cy + L[i] * dy[D[i]];
		if(cx != nx) {
			fr[n] = min(cx, nx); to[n] = max(cx, nx);
			dif[n] = (ny - cy) / (nx - cx); pos[n] = cy - dif[n] * cx;
			n ++;
		}
		cx = nx; cy = ny;
	}
	
	xs.clear();
	rep(i, n) {
		xs.push_back(fr[i]); xs.push_back(to[i]);
	}
	sort(xs.begin(), xs.end());
	xs.resize(unique(xs.begin(), xs.end()) - xs.begin());
	rep(i, n) {
		hv[lower_bound(xs.begin(), xs.end(), fr[i]) - xs.begin()].push_back(i);
		hv[lower_bound(xs.begin(), xs.end(), to[i]) - xs.begin()].push_back(i);
	}
	
	rep(i, n) tp[i] = -1;
	rep(i, xs.size()) {
		tmp = xs[i];
		sort(hv[i].begin(), hv[i].end(), cmp);
		for(int j = 0; j < (int)hv[i].size(); j += 2) upd(hv[i][j], hv[i][j + 1]);
	}
	
	int rt = -1;
	rep(i, cnt) if(lx[i] <= 0 && rx[i] >= 0 && pos[ly[i]] <= 0 && pos[ry[i]] >= 0) {
		rt = i; break;
	}
	
	cd[rt] = pe[rt] = 0;
	return dfs(rt, -1, A, B);
}

int draw_territory(int N, int B, int A, vector<int> D, vector<int> L)
{
	A = 1LL * A * (MOD + 1) / 2 % MOD;
	B = 1LL * B * (MOD + 1) / 3 % MOD; 
	int ans = 0;
	rep(i, 3) {
		rep(j, N) D[j] = (D[j] + 1) % 6;
		ans = (ans + calc(N, A, B, D, L)) % MOD;
	}
	return ans;
}
2022/1/30 19:20
加载中...