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