首页 > 其他分享 >[赛记] 冲刺CSP联训模拟1[衡中]

[赛记] 冲刺CSP联训模拟1[衡中]

时间:2024-10-05 11:49:06浏览次数:1  
标签:赛记 yl xl int 衡中 cin 联训 bitset include

几何 100pts

赛时打的 $ DP $ 没有用 bitset 优化过了,也是放过了暴力

考虑设状态 $ f_{i, j, k} $ 表示考虑到第 $ i $ 位,到第 $ j $ 位 $ x $ 和第 $ k $ 位 $ y $ 可不可取,直接转移即可;

时间复杂度:$ \Theta(|s||x||y|) $,应该是过不了的;

点击查看暴力
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int t;
char s[500005], x[55], y[55];
int sl, xl, yl;
bool f[2][52][52];
int main() {
	freopen("geometry.in", "r", stdin);
	freopen("geometry.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> t;
	while(t--) {
		cin >> (s + 1);
		cin >> (x + 1);
		cin >> (y + 1);
		memset(f, false, sizeof(f));
		sl = strlen(s + 1);
		xl = strlen(x + 1);
		yl = strlen(y + 1);
		f[0][xl][0] = true;
		f[0][0][yl] = true;
		for (int i = 1; i <= sl; i++) {
			memset(f[i & 1], false, sizeof(f[i & 1]));
			for (int j = 0; j <= xl; j++) {
				for (int k = 0; k <= yl; k++) {
					if (s[i] == x[j]) {
						if (j - 1 == 0) {
							f[i & 1][j][k] |= f[(i - 1) & 1][xl][k];
							f[i & 1][j][k] |= f[(i - 1) & 1][0][k];
						} else {
							f[i & 1][j][k] |= f[(i - 1) & 1][j - 1][k];
						}
					}
					if (s[i] == y[k]) {
						if (k - 1 == 0) {
							f[i & 1][j][k] |= f[(i - 1) & 1][j][0];
							f[i & 1][j][k] |= f[(i - 1) & 1][j][yl];
						} else {
							f[i & 1][j][k] |= f[(i - 1) & 1][j][k - 1];
						}
					}
				}
			}
		}
		if (f[sl & 1][xl][yl] || f[sl & 1][xl][0] || f[sl & 1][0][yl]) {
			cout << "Yes" << '\n';
		} else {
			cout << "No" << '\n';
		}
	}
	return 0;
}

根据我们以前的经验,我们可以将答案与状态后两维中的一位互换,所以设 $ f_{i, j} = k $ 表示考虑前 $ i $ 位,到第 $ j $ 位 $ x $ 时所有合法的 $ y $ 的状态,这时我们就可以用 bitset 来存储 $ f $ 数组,进而转移;

转移其实就是循环移位和按位与和按位或的操作;

时间复杂度:$ \Theta(\frac{|s||x||y|}{w}) $;

点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <bitset>
using namespace std;
int t;
char s[500005], x[55], y[55];
int sl, xl, yl;
bitset<55> f[2][52];
bitset<55> g[500005];
bitset<55> Y(bitset<55> x) {
	int y = x[yl];
	bitset<55> bit = (x << 1);
	if (y) bit[1] = 1;
	return bit;
}
int main() {
	freopen("geometry.in", "r", stdin);
	freopen("geometry.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> t;
	while(t--) {
		cin >> (s + 1);
		cin >> (x + 1);
		cin >> (y + 1);
		memset(f, 0, sizeof(f));
		memset(g, 0, sizeof(g));
		sl = strlen(s + 1);
		xl = strlen(x + 1);
		yl = strlen(y + 1);
		for (int i = 1; i <= sl; i++) {
			for (int j = 1; j <= yl; j++) {
				if (s[i] == y[j]) g[i][j] = 1;
			}
		}
		f[0][0][0] = 1;
		for (int i = 1; i <= sl; i++) {
			memset(f[i & 1], 0, sizeof(f[i & 1]));
			for (int j = 0; j <= xl; j++) {
				if (s[i] == x[j]) {
					f[i & 1][j] |= f[(i - 1) & 1][j - 1];
					if (j - 1 == 0) f[i & 1][j] |= f[(i - 1) & 1][xl];
				}
				bitset<55> b = Y(f[(i - 1) & 1][j]);
				b &= g[i];
				f[i & 1][j] |= b;
			}
		}
		if (f[sl & 1][xl][yl] || f[sl & 1][xl][0] || f[sl & 1][0][yl]) {
			cout << "Yes" << '\n';
		} else {
			cout << "No" << '\n';
		}
	}
	return 0;
}

分析 0pts

$ DP $,。。。

点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
long long a, b;
long long f[500005][2][2], w[2][2];
struct sss{
	int t, ne;
}e[2000005];
int h[2000005], cnt;
void add(int u, int v) {
	e[++cnt].t = v;
	e[cnt].ne = h[u];
	h[u] = cnt;
}
void dfs(int x, int fa) {
	f[x][0][0] = 0;
	for (int i = h[x]; i; i = e[i].ne) {
		int u = e[i].t;
		if (u == fa) continue;
		dfs(u, x);
		for (int j = 0; j <= 1; j++) {
			for (int k = 0; k <= 1; k++) {
				w[j][k] = f[x][j][k];
				f[x][j][k] = 0x3f3f3f3f3f3f3f3f;
			}
		}
		for (int j = 0; j <= 1; j++) {
			for (int k = 0; k <= 1; k++) {
				for (int uj = 0; uj <= 1; uj++) {
					for (int uk = 0; uk <= 1; uk++) {
						f[x][j][k | uj | uk] = min(f[x][j][k | uj | uk], w[j][k] + f[u][uj][uk] + a);
						long long now = 0;
						if (j && uj) {
							now = -b;
						} else if (!j && !uj) {
							now = b;
						}
						f[x][j ^ 1][k | (uj ^ 1) | uk] = min(f[x][j ^ 1][k | (uj ^ 1) | uk], w[j][k] + f[u][uj][uk] + now);
					}
				}
			}
		}
	}
}
int main() {
	freopen("analyse.in", "r", stdin);
	freopen("analyse.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	cin >> a >> b;
	a = min(a, b);
	int x, y;
	for (int i = 1; i <= n - 1; i++) {
		cin >> x >> y;
		add(x, y);
		add(y, x);
	}
	memset(f, 0x3f, sizeof(f));
	dfs(1, 0);
	cout << min({f[1][0][0], f[1][0][1] - b, f[1][1][0] - b, f[1][1][1] - b});
	return 0;
}

标签:赛记,yl,xl,int,衡中,cin,联训,bitset,include
From: https://www.cnblogs.com/PeppaEvenPig/p/18447737

相关文章

  • [赛记] csp-s模拟7
    median50pts错解50pts(有重复的数就不行);赛时想容斥了,其实不用容斥(好像也不能容斥);题解做法:将每个数存一个二元组,按大小排序,枚举每一个数作为中位数,再枚举每个位置的种类,看它前面和后面有多少这些种类的数,乘起来即可;这样就巧妙地避免了重复的情况,如果直接枚举,则有相同的数会被重......
  • [赛记] csp-s模拟6
    一般图最小匹配35pts纯纯的错解35pts;考虑将原数列排序,那么我们选的边就只能是相邻两个点的;发现这玩意能够递推(赛时没发现),所以直接$DP$,设$f_{i,j}$表示当前考虑到第$i$位,有$j$条边被选的最小权值,转移时考虑第$i$个点连不连第$i-1$个点即可;时间复杂......
  • 冲刺 CSP 联训模拟2
    题面温馨提示代码中的变量名可能与题意、题解不同。代码不删缺省源,可以直接拿来对拍。T1挤压Solution众所周知,异或是一种按位运算,不好进行十进制的数间合并。我们考虑将每个数拆分为二进制的形式进行处理。此时,对于每一种情况,假设表示\(2^i\)二进制位的值为\(b_i\),我......
  • 冲刺 CSP 联训模拟 2
    T1挤压概率期望,二进制拆位看到异或想到拆位算贡献\[\begin{aligned}ans&=\sum_xx^2P(x)\\&=\sum_x(b_1+b_2+...+b_{30})^2P(x)\\\(b_i表示\x\二进制下\i\位的值)\\&=\sum_x(b_1b_1+b_1b_2+...b_{30}b_{29}+b_{30}b_{30})P(x)\\&=\sum_i^{30}\sum_j^{30......
  • 比赛记录(51~60)
    51CSP-S模拟赛321得分题目T1T2T3T4总分得分\(4\)\(20\)\(11\)\(27\)\(62\)排名:rank\(9\)。真正炸裂的一集。2题解T1考虑到边数较少,于是考虑能不能枚举边相关信息。通过部分分可以有如下讨论:\(c_u\nec_v\)时,意味着原先两点间有的边没了,那么两......
  • 冲刺CSP联训模拟2
    冲刺CSP联训模拟2过T2了,赢了T3T4暴力没写满,输了A挤压我是唐诗老哥一个半小时才过T1发现要求的是\(E(s^2)\),因为有个异或,所以直接考虑拆贡献到每一位\[E(s^2)=E(\sums_i\sums_j)=\sumE(s_is_j)\]所以直接考虑后面那个咋做,就是\(i,j\)位同时是一的时候贡献\(2^......
  • 冲刺CSP联训模拟2
    冲刺CSP联训模拟2\(T1\)P294.挤压\(40pts\)部分分\(20\%\):爆搜,时间复杂度为\(O(2^{n})\)。另外\(20\%\):观察到值域较小,将值域计入状态设计,时间复杂度为\(O(nV)\)。点击查看代码constllmod=1000000007;lla[100010],p[100010],pp[100010],q[100010],f[2]......
  • 联训题单
    总览题单进度备注数据结构13/24-数据结构1STEP读假题了,读成下面这样了:给定01序列,每次单点修改,查询最长的字符相同的连续段长度这不是一眼线段树经典板子题,分别维护左右区间信息以及合并处的信息,然后尝试在中间合并来更新答案十五分钟光速打完拉下样例......
  • 多校A层冲刺NOIP2024模拟赛【衡中】
    多校A层冲刺NOIP2024模拟赛01构造字符串咕咕咕寻宝咕咕咕点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintmaxn=50009;intn,m,k,q,tot,cnt,vis[32767];inta[4]={1,-1,0,0};intb[4]={0,0,-1,1};map<int,short>mp[maxn];queue<pair<int,int>>......
  • [39] (多校联训) A层冲刺NOIP2024模拟赛01
    你们不感觉最近机房网越来越慢了吗,现在下个10M的东西要用三分钟,而且期间访问不了网站整个机房分1000Mbps的带宽为啥只能分这么一点,huge拿我电脑挖矿了?本来以为多校就是多校的,结果是真的多校,一百一十多个人在一块考huge:参加的都是咱们北方这几个强校你说得对,但是广东......