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;
}