8.24 模拟赛

\(T3\) 数学题不会 成人下人力()

\(30+5+30\) \(rk\)倒三

\(T2\) 离散化挂了真不应该()

T1

\(30pts\) 是递推 \(60pts\) 是套公式

公式推导用差项法

设置 \(S_n=1+k+k^2+\cdots +k^{n-1}\)

那么 \(kS_n=k+k^2+k^3+\cdots +k^n\)

那么上下相减得到 \(S_n=\frac {k^n-1} {k-1}\)

\(95pts\) 可以用 \(exgcd\) 求逆元

\(100pts\) 用分治 可以发现对于一个数列 前一半都可以通过乘上一个数来得到后面的一半 那么递归做下去即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mid ((x-1)>>1)

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 , k , mod;

int ksm ( int base , int k )
{
	int res = 1;
	for ( ; k ; k >>= 1 , ( base *= base ) %= mod )
		if ( k & 1 ) ( res *= base ) %= mod;
	return res;
}

int solve ( int x )
{
	if ( x == 0 ) return 1;
	int lft = solve ( mid );
	int mul = ksm ( k , mid + 1 );
	if ( ( x - 1 ) & 1 ) return ( ( lft + lft * mul % mod ) % mod + ksm ( k , x ) ) % mod;
	else return ( lft + lft * mul % mod ) % mod;
}

signed main ()
{
	freopen ( "sunshine.in" , "r" , stdin );
	freopen ( "sunshine.out" , "w" , stdout );
	n = read() , k = read() , mod = read();
	cout << solve(n-1) << endl;
	return 0;
}

T2

并查集模板

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define mid (l+r>>1)
#define inl inline
#define eb emplace_back
const int N = 1e6 + 5;
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 , T , k , a[N];

int fa[N];
int find ( int x ) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void merge ( int x , int y ) { int fx = find(x) , fy = find(y); fa[fx] = fy; }

signed main ()
{
	freopen ( "foggy.in" , "r" , stdin );
	freopen ( "foggy.out" , "w" , stdout );
	ios::sync_with_stdio(false);
	cin.tie(nullptr) , cout.tie(nullptr);
	int T = read();
	while ( T -- )
	{
		n = read() , m = read();
		for ( int i = 1 ; i <= n ; i ++ ) fa[i] = i;
		for ( int i = 1 , u , v ; i <= m ; i ++ ) u = read() , v = read() , merge ( u , v );
		k = read();
		for ( int i = 1 ; i <= k ; i ++ ) a[i] = read();
		int flag = 1;
		for ( int i = 1 ; i <= k ; i ++ ) if ( find(a[i]) != find(a[1]) ) { flag = 0; break; }
		cout << ( flag ? "YES" : "NO" ) << endl;
	}
	return 0;
}

T3

调了 \(3h\) 怒砍 \(5pts\)

最终是离散化挂了 而且 \(dp\) 的时候没有将上界开到 \(max\) 边权

#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 fi first
#define se second
#define ls p<<1
#define rs p<<1|1
#define lson ls,l,mid
#define rson rs,mid+1,r 
#define int long long
#define print(x) cout<<#x<<'='<<x<<endl
const int N = 3e3 + 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 , T , sz , u[N] , v[N] , w[N] , fa[N] , b[N] , f[N][N] , lsh[N];

vector<int> vec;

int head[N] , cnt;
struct node { int to , nxt , w; } e[N<<1];
inl void add ( int u , int v , int w ) { e[++cnt] = { v , head[u] , w }; head[u] = cnt; }

void init()
{
	memset ( head , 0 , sizeof head );
	cnt = 0;
	memset ( f , 0 , sizeof f ); 
}

void dfs ( int u , int f )
{
	fa[u] = f;
	for ( int i = head[u] ; i ; i = e[i].nxt )
	{
		int v = e[i].to;
		if ( v == f ) continue;
		b[v] = e[i].w;
		dfs ( v , u );
	}
}


void dfss ( int u , int ff )
{
	for ( int j = 1 ; j <= sz ; j ++ )
		f[u][j] = abs ( lsh[j] - lsh[b[u]] );
	for ( int i = head[u] ; i ; i = e[i].nxt )
	{
		int v = e[i].to;
		if ( v == ff ) continue;
		dfss ( v , u );
		int minn = inf;
		for ( int j = sz ; j >= 1 ; j -- )
		{
			minn = min ( minn , f[v][j] );
			f[u][j] += minn;
		}
	}
}

signed main ()
{
	freopen ( "tree.in" , "r" , stdin );
	freopen ( "tree.out" , "w" , stdout );
	ios::sync_with_stdio(false);
	cin.tie(nullptr) , cout.tie(nullptr);
	int T = read();
	while ( T -- )
	{
		n = read();
		init();
		for ( int i = 1 ; i < n ; i ++ ) u[i] = read() , v[i] = read() , w[i] = lsh[i] = read();
		sort ( lsh + 1 , lsh + n );
		sz = unique ( lsh + 1 , lsh + n ) - lsh - 1;
		for ( int i = 1 ; i < n ; i ++ ) w[i] = lower_bound ( lsh + 1 , lsh + sz + 1 , w[i] ) - lsh;
		for ( int i = 1 ; i < n ; i ++ ) add ( u[i] , v[i] , w[i] ) , add ( v[i] , u[i] , w[i] );
		dfs ( 1 , 0 );
		dfss ( 1 , 0 );
		int sum = 0;
		for ( int i = head[1] ; i ; i = e[i].nxt )
		{
			int v = e[i].to;
			if ( v == fa[1] ) continue;
			int minn = inf;
			for ( int j = 1 ; j <= sz ; j ++ ) minn = min ( minn , f[v][j] );
			sum += minn;
		}
		cout << sum << endl;
	}
	return 0;
}
posted @ 2023-08-26 22:48  Echo_Long  阅读(5)  评论(0编辑  收藏  举报