8.25 模拟赛

最后一场了 \(30+50+5=85\) \(rk8\) 也算是不错的结尾罢

补题补到了 \(150pts\) 希望能对whk分数有所裨益

T1

暴力跑路了 太神了()

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define mid (l+r>>1)
#define inl inline
#define eb emplace_back
#define pii pair<int,int>
const int N = 1e3 + 5;
const int inf = 0x3f3f3f3f;
//char buf[1<<24] , *p1 , *p2;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<24,stdin),p1==p2)?EOF:*p1++)
#define getchar() cin.get();
int read()
{
	int x = 0 , f = 1;
	char ch = getchar();
	while ( !isdigit(ch) ) { if ( ch == '-' ) f = -1; ch = getchar(); }
	while ( isdigit(ch) ) { x = ( x << 1 ) + ( x << 3 ) + ( ch ^ 48 ); ch = getchar(); }
	return x * f ;
}

int n , q , a[N];

int solve ()
{
	for ( int val = 0 ; val < (1<<30) ; val ++ )
	{
		if ( ( val >= 512 ) & ( n <= 500 ) & ( q <= 500 ) ) break;
		int flag = 1 , maxx = 0;
		for ( int i = 1 ; i <= n ; i ++ )
		{
			if ( maxx > ( a[i] ^ val ) ) { flag = 0; break; } 
			maxx = max ( maxx , a[i] ^ val );
		}
		if ( flag ) return val;
	}
	return -1;
}

signed main ()
{
	freopen ( "sequence.in" , "r" , stdin );
	freopen ( "sequence.out" , "w" , stdout );
	ios::sync_with_stdio(false);
	cin.tie(nullptr) , cout.tie(nullptr);
	n = read();
	for ( int i = 1 ; i <= n ; i ++ ) a[i] = read();
	cout << solve() << endl;
	q = read();
	for ( int i = 1 ; i <= q ; i ++ )
	{
		int x = read() , val = read();
		a[x] = val;
		cout << solve() << endl;
	}
	return 0;
}


T2

暴搜显然 \(50pts\)

学习榜一 \(WGSZ\_ckain\) 的剪枝方法到了 \(100pts\)

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define mid (l+r>>1)
#define inl inline
#define eb emplace_back
#define pii pair<int,int>
#define print(x) cout<<#x<<'='<<x<<endl
#define int long long
const int N = 100 + 5;
const int inf = 0x3f3f3f3f3f3f3f3f;
//char buf[1<<24] , *p1 , *p2;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<24,stdin),p1==p2)?EOF:*p1++)
#define getchar() cin.get();
int read()
{
	int x = 0 , f = 1;
	char ch = getchar();
	while ( !isdigit(ch) ) { if ( ch == '-' ) f = -1; ch = getchar(); }
	while ( isdigit(ch) ) { x = ( x << 1 ) + ( x << 3 ) + ( ch ^ 48 ); ch = getchar(); }
	return x * f ;
}

int n , m , k , vis[N] , now[N] , must[N] , flag[N] , minn = inf;

struct node { int u , p , v , q; } a[N];

vector<int> vec[N];

void dfs ( int stp , int sum )
{
	if ( sum == k )
	{
		int summ = 0;
		for ( int i = 1 ; i <= n ; i ++ ) 
		{
			int kk = inf;
			if ( vis[a[i].u] ) kk = min ( kk , a[i].p );
			if ( vis[a[i].v] ) kk = min ( kk , a[i].q );
			if ( kk == inf ) return;
			summ += kk;
		}
		minn = min ( minn , summ );
		return;
	}
	if ( m - stp >= k - sum && !must[stp] && !flag[stp] )
	{
		for ( auto v : vec[stp] ) ++ flag[v];//下一次必须选它了 
		dfs ( stp + 1 , sum );
		for ( auto v : vec[stp] ) -- flag[v];
	}
	vis[stp] = 1 , dfs ( stp + 1 , sum + 1 ) , vis[stp] = 0;
}

signed main ()
{
	freopen ( "cloud.in" , "r" , stdin );
	freopen ( "cloud.out" , "w" , stdout );
	ios::sync_with_stdio(false);
	cin.tie(nullptr) , cout.tie(nullptr);
	n = read() , m = read() , k = read();
	for ( int i = 1 ; i <= n ; i ++ )
	{
		a[i].u = read() , a[i].p = read() , a[i].v = read() , a[i].q = read();
		if ( a[i].u == a[i].v ) must[a[i].u] = 1;
		else vec[a[i].u].eb(a[i].v) , vec[a[i].v].eb(a[i].u);
	}
	dfs ( 1 , 0 );
	cout << ( minn == inf ? -1 : minn ) << endl;
	return 0;
}

T3

考场上只想着固输了 但是发现 \(20pts\) 只需要暴力用 \(map\) 存一下每一个 \(b\) 串的前缀和后缀价值 然后在 \(a\) 串中 \(dp\) 即可

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define mid (l+r>>1)
#define inl inline
#define eb emplace_back
#define pii pair<int,int>
const int N = 500 + 5;
const int inf = 0x3f3f3f3f;
//char buf[1<<24] , *p1 , *p2;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<24,stdin),p1==p2)?EOF:*p1++)
#define getchar() cin.get();
int read()
{
	int x = 0 , f = 1;
	char ch = getchar();
	while ( !isdigit(ch) ) { if ( ch == '-' ) f = -1; ch = getchar(); }
	while ( isdigit(ch) ) { x = ( x << 1 ) + ( x << 3 ) + ( ch ^ 48 ); ch = getchar(); }
	return x * f ;
}

int m , n , l , c[N] , f[N];
string a , b[N];
map<string,int> mp;

signed main ()
{
	freopen ( "string.in" , "r" , stdin );
	freopen ( "string.out" , "w" , stdout );
	ios::sync_with_stdio(false);
	cin.tie(nullptr) , cout.tie(nullptr);
	memset ( f , inf , sizeof f );
	m = read() , n = read() , l = read();
	cin >> a;
	l = a.size();
	a = " " + a;
	for ( int i = 1 ; i <= n ; i ++ ) c[i] = read() , cin >> b[i];
	for ( int i = 1 ; i <= n ; i ++ )
	{
		string stemp;
		for ( int j = 0 ; j < b[i].size() ; j ++ )
		{
			stemp.push_back(b[i][j]);
			if ( !mp[stemp] ) mp[stemp] = c[i];
			else mp[stemp] = min ( mp[stemp] , c[i] );
		}
		stemp.clear();
		for ( int j = b[i].size() - 1 ; j >= 0 ; j -- )
		{
			stemp.push_back(b[i][j]);
			string srev = stemp;
			reverse ( srev.begin() , srev.end() );
			if ( !mp[srev] ) mp[srev] = c[i];
			else mp[srev] = min ( mp[srev] , c[i] );
		}
	}
	f[0] = 0;
	for ( int i = 1 ; i <= l ; i ++ ) // 枚举这一段的终止节点
	{
		for ( int j = 0 ; j < i ; j ++ ) // 枚举上一段的终止节点
		{
			string stemp;
			for ( int k = j + 1 ; k <= i ; k ++ ) stemp.push_back(a[k]);
			if ( mp[stemp] ) f[i] = min ( f[i] , f[j] + mp[stemp] );
		}
	}
	cout << ( f[l] == inf ? -1 : f[l] ) << endl;
	return 0;
}


posted @ 2023-08-26 22:55  Echo_Long  阅读(9)  评论(0编辑  收藏  举报