开O2RE求助
查看原帖
开O2RE求助
149192
__gcd楼主2021/2/9 10:56

rt,会不会是UB啊

#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
inline ll read() {
    ll x = 0; bool op = 0;
	char c = getchar();
	while(!isdigit(c))op |= (c == '-'), c = getchar() ;
	while(isdigit(c))x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
	return op ? -x : x;
}
const int N = 50100; 
const int Mod = 1e9 + 7;
int n, m, siz, maxi, id, tot;
int son[N][2], val[N], que[15];
ll a[15][N], dp[N][2], t[1 << 15];
char s[N]; 
int mod(ll x) {return x >= 0 ? x % Mod : x % Mod + Mod;}
bool cmp(int x, int y) {return a[x][id] < a[y][id];}
int build(int l, int r) {
	if(l == r)return s[l] - '0' + 1;
	if(s[r] == ')') {
		int cnt = 1;
		for(int i = r - 1; i >= l; i--) {
			if(s[i] == ')')cnt++;
			else if(s[i] == '(')cnt--;
			if(cnt == 0) {
				if(i == l)return build(l + 1, r - 1);
				int cur = ++tot;
				son[cur][0] = build(l, i - 2);
				son[cur][1] = build(i + 1, r);
				if(s[i - 1] == '<')val[cur] = 1;
				else if(s[i - 1] == '>')val[cur] = 2;
				else val[cur] = 0;
				return cur;
			}
		}
	}
	else {
		int cur = ++tot;
		son[cur][0] = build(l, r - 2);
		son[cur][1] = build(r, r);
		if(s[r - 1] == '<')val[cur] = 1;
		else if(s[r - 1] == '>')val[cur] = 2;
		else val[cur] = 0;
		return cur;
	}
}
void dfs(int u, int i) {
	int ls = son[u][0], rs = son[u][1];
	if(ls == 0 && rs == 0) {
		if((i >> (u - 1) & 1) == 0)dp[u][1] = 1, dp[u][0] = 0;
		else dp[u][0] = 1, dp[u][1] = 0;
		return ;
	}
	dfs(ls, i); dfs(rs, i);
	for(int k = 0; k <= 1; k++) {
		ll res1 = 0, res2 = 0;
		for(int p = 0; p <= 1; p++) {
			for(int q = 0; q <= 1; q++) {
				if(min(p, q) == k)
					res1 = mod(res1 + mod(dp[ls][p] * dp[rs][q]));
				if(max(p, q) == k) 
					res2 = mod(res2 + mod(dp[ls][p] * dp[rs][q]));
			}
		}
		if(val[u] == 1)dp[u][k] = res1;
		else if(val[u] == 2)dp[u][k] = res2;
		else dp[u][k] = mod(res1 + res2);
	}
	return ;
}
int main() {
	n = read(); m = read(); maxi = (1 << m) - 1;
	for(int i = 1; i <= m; i++) {
		for(int j = 1; j <= n; j++) {
			a[i][j] = read();
		}
	}
	scanf("%s", s + 1); siz = strlen(s + 1);
	tot = m;
	int rt = build(1, siz); 
	for(int i = 0; i <= maxi; i++) {
		memset(dp, 0, sizeof(dp));
		dfs(rt, i); t[i] = dp[rt][1];
	}
	ll ans = 0;
	for(int i = 1; i <= n; i++) {
		id = i; 
		for(int j = 1; j <= m; j++)que[j] = j; 
		sort(que + 1, que + m + 1, cmp);
		int S = 0;
		for(int j = 1; j <= m; j++) {
			ans = mod(ans + mod((a[que[j]][i] - a[que[j - 1]][i]) * t[S]));
			S ^= (1 << (que[j] - 1));
		}
	}
	printf("%lld", ans);
	return 0;
}
2021/2/9 10:56
加载中...