Exemplo n.º 1
0
inline void pushup(int x) {
    data a = tr[x<<1], b = tr[x<<1|1], &c = tr[x];
    c.max = std::max(a.max, b.max), c.max2 = -1, c.num = 0;
    if(a.max == c.max) {
        c.num += a.num;
        chkmax(c.max2, a.max2);
    }
    else chkmax(c.max2, a.max);
    if(b.max == c.max) {
        c.num += b.num;
        chkmax(c.max2, b.max2);
    }
    else chkmax(c.max2, b.max);
    c.sum = a.sum+b.sum;
}
Exemplo n.º 2
0
LL solve() {
	int n;
	getint2(m, n);
	ans = 0;
	for(int i = 0; i < n; i++) {
		getint2(k[i], l[i]);
		k[i] = k[i] - l[i] + 1;
		for (int j = 0; j < l[i] - 1; j++) {
			int x;
			getint(x);
		}
		for (int j = 0; j < k[i]; j++) {
			getint(a[i][j]);
		}
		for (int j = 0; j < l[i] - 1; j++) {
			int x;
			getint(x);
		}
		for (int j = 0; j < k[i] - 1; j++) {
			getint(c[i][j]);
		}
	}
	for (int i = 0; i < (1 << n); i++) {
		if (__builtin_popcount(i) != 8)
			continue;
		int s = i;
		vector<int> l, r;
		for (int j = 0; j < n; j++) {
			if (s & 1) {
				if (l.size() != 4)
					l.pb(j);
				else
					r.pb(j);
			}
			s >>= 1;
		}
		solve(l, lans);
		solve(r, rans);
		if (rans.empty())
			continue;
		for (map<int, LL>::iterator it = lans.begin(); it != lans.end(); it++) {
			if (m - it->c0 < 0)
				break;
			map<int, LL>::iterator rit = rans.upper_bound(m - it->c0);
			if (rit == rans.begin())
				break;
			rit--;
			chkmax(ans, it->c1 + rit->c1);
		}
	}
	return ans;
}