8.19 模拟赛

打了\(100+100+10+40\) \(rk7\) 赢!

T1

直接维护每一个dp状态的前\(k\)大的值 每次暴力进行转移即可

这里怕被卡常使用\(multiset\)实现

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define mid (l+r>>1)
#define inl inline
#define eb emplace_back
#define ls p<<1
#define rs p<<1|1
#define lson ls,l,mid
#define rson rs,mid+1,r
#define print(x) cout << #x << '=' << x << endl
const int N = 1e2 + 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 , k , a[N][N];

multiset < int > s[N][N];
priority_queue < int > q; 

signed main ()
{
	freopen ( "triangle.in" , "r" , stdin );
	freopen ( "triangle.out" , "w" , stdout );
	ios::sync_with_stdio(false);
	cin.tie(nullptr) , cout.tie(nullptr);
	n = read() , k = read();
	for ( int i = 1 ; i <= n ; i ++ ) for ( int j = 1 ; j <= i ; j ++ ) a[i][j] = read();
	s[1][1].insert(a[1][1]);
	for ( int i = 2 ; i <= n ; i ++ )
	{
		for ( auto v : s[i-1][1] )
		{
			s[i][1].insert(v+a[i][1]);
			if ( s[i][1].size() > k ) s[i][1].erase(s[i][1].begin());
		}
		for ( int j = 2 ; j < i ; j ++ )
		{
			for ( auto u : s[i-1][j-1] ) 
			{
				s[i][j].insert(u+a[i][j]);
				if ( s[i][j].size() > k ) s[i][j].erase(s[i][j].begin());
			}
			for ( auto v : s[i-1][j] )
			{
				s[i][j].insert(v+a[i][j]);
				if ( s[i][j].size() > k ) s[i][j].erase(s[i][j].begin());
			}
		}
		for ( auto v : s[i-1][i-1] )
		{
			s[i][i].insert(v+a[i][i]);
			if ( s[i][i].size() > k ) s[i][i].erase(s[i][i].begin());
		}	
	}
	for ( int j = 1 ; j <= n ; j ++ ) for ( auto v : s[n][j] ) q.push(v);
	for ( int i = 1 ; i < k ; i ++ ) q.pop();
	cout << q.top() << endl;	
	return 0;
}


T2

我们看到\(\sum c_i\) 可以想到答案和国家没有本质联系

那么我们直接将所有询问的国家和性格值离线下来放入结构体中

最后排序并用双指针移动来卡极差即可

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define mid (l+r>>1)
#define inl inline
#define eb emplace_back
#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 = 2e6 + 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 , cnt , res , ans = inf , vis[N];

struct node { int val , pos; } a[N];

signed main ()
{
	freopen ( "eliminate.in" , "r" , stdin );
	freopen ( "eliminate.out" , "w" , stdout );
	ios::sync_with_stdio(false);
	cin.tie(nullptr) , cout.tie(nullptr);
	n = read();
	for ( int i = 1 ; i <= n ; i ++ )
	{
		int c = read();
		for ( int j = 1 ; j <= c ; j ++ ) a[++cnt] = { read() , i };
	}
	sort ( a + 1 , a + cnt + 1 , [](const node &a , const node &b) { return a.val < b.val; } );
	int l = 1 , r = 0;
	while ( l <= cnt && r <= cnt )
	{
		while ( res < n ) { ++ r; if ( r > cnt ) break; res += ( ++vis[a[r].pos] == 1 ); }
		while ( res == n ) { ans = min ( ans , a[r].val - a[l].val ) , res -= ( --vis[a[l].pos] == 0 ) , l ++; if ( l > cnt ) break; }
	}
	cout << ans << endl;
	return 0;
}

T3

最后\(5min\)打了一个\(10pts\)的抽象做法

正常暴力可以有很可观的\(40pts\)分数 时间全给\(T4\)实属不该 ()

\(40pts:\)

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define mid (l+r>>1)
#define inl inline
#define eb emplace_back
#define ls p<<1
#define rs p<<1|1
#define lson ls,l,mid
#define rson rs,mid+1,r
#define print(x) cout << #x << '=' << x << endl
const int N = 1e3 + 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 , ans , a[N][N];

int solve ( int lx , int ly , int rx , int ry )
{
	for ( int i = lx ; i <= rx ; i ++ )
		for ( int j = ly ; j <= ry ; j ++ )
			for ( int k = lx ; k <= rx ; k ++ )
				for ( int l = ly ; l <= ry ; l ++ )
				{
					if ( k - i == l - j ) { if ( a[i][j] != a[k][l] ) return 0; }
					else { if ( a[i][j] == a[k][l] ) return 0; }
				}
	return 1;
}

signed main ()
{
	freopen ( "rainbow.in" , "r" , stdin );
	freopen ( "rainbow.out" , "w" , stdout );
	ios::sync_with_stdio(false);
	cin.tie(nullptr) , cout.tie(nullptr);
	n = read() , m = read();
	for ( int i = 1 ; i <= n ; i ++ )
		for ( int j = 1 ; j <= m ; j ++ )
			a[i][j] = read();
	for ( int i = 1 ; i <= n ; i ++ )
		for ( int j = 1 ; j <= m ; j ++ )
			for ( int len = 1 ; i + len - 1 <= n && j + len - 1 <= m ; len ++ )
				ans += solve ( i , j , i + len - 1 , j + len - 1 );
	cout << ans << endl;
	return 0;
}



T4

暴搜玛丽有很大提升()

\(40pts:\)

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define mid (l+r>>1)
#define inl inline
#define eb emplace_back
#define ls p<<1
#define rs p<<1|1
#define lson ls,l,mid
#define rson rs,mid+1,r
#define print(x) cout << #x << '=' << x << endl
const int N = 13;
//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 dx[4] = { 0 , 1 , 0 , -1 };
int dy[4] = { 1 , 0 , -1 , 0 };

int n , m , vis[N][N] , marked[N][N] , temp[N][N] , markst[N][N] , cnt[N];

struct node { int x_1 , y_1 , x_2 , y_2; } a[N];
struct point { int x , y; };
vector<point> vec[N][100005] , road[N] , tt ;

void printst()
{
	for ( int i = 1 ; i <= n ; i ++ , cout.put(endl) )
		for ( int j = 1 ; j <= n ; j ++ ) cout << vis[i][j] << ' ';
}

int in ( int x , int y ) { return 1 <= x && x <= n && 1 <= y && y <= n; }

void dfss ( int stp , int x , int y )
{
	if ( marked[x][y] == stp ) return vec[stp][++cnt[stp]] = tt , void();
	for ( int i = 0 ; i < 4 ; i ++ )
	{
		int tx = x + dx[i] , ty = y + dy[i];
		if ( marked[tx][ty] == stp ) { tt.eb((point){tx,ty}) , dfss ( stp , tx , ty ) , tt.pop_back(); continue; }
		if ( vis[tx][ty] || !in(tx,ty) ) continue;
		vis[tx][ty] = 1;
//		for ( auto v : tt ) cout << v.x << ' ' << v.y << endl;
		tt.eb((point){tx,ty});
		dfss ( stp , tx , ty );
		tt.pop_back();
		vis[tx][ty] = 0;
	}
}

void dfs ( int stp )
{
	if ( stp > m )
	{
		int flag = 1;
		for ( int i = 1 ; i <= n ; i ++ ) for ( int j = 1 ; j <= n ; j ++ ) if ( !vis[i][j] ) flag = 0;
		if ( flag )
		{
			for ( int i = 1 ; i <= m ; i ++ )
			{
				cout << road[i].size() << endl;
				for ( auto v : road[i] ) cout << v.x << ' ' << v.y << endl;
			}
			exit(0);
		}
		return;
	}
	tt.eb((point){a[stp].x_1 , a[stp].y_1});
	dfss ( stp , a[stp].x_1 , a[stp].y_1 );
	tt.pop_back();
	for ( int st = 1 ; st <= cnt[stp] ; st ++ )
	{
		for ( auto p : vec[stp][st] ) vis[p.x][p.y] = 1;
		road[stp] = vec[stp][st];
		dfs ( stp + 1 );
		road[stp].clear();
		for ( auto p : vec[stp][st] ) vis[p.x][p.y] = 0;
	}
	return ;
}

signed main ()
{
	freopen ( "flowfree.in" , "r" , stdin );
	freopen ( "flowfree.out" , "w" , stdout );
	ios::sync_with_stdio(false);
	cin.tie(nullptr) , cout.tie(nullptr);
	n = read() , m = read();
	for ( int i = 1 ; i <= m ; i ++ )
	{
		a[i].x_1 = read() , a[i].y_1 = read() , a[i].x_2 = read() , a[i].y_2 = read();
		marked[a[i].x_2][a[i].y_2] = i , vis[a[i].x_1][a[i].y_1] = vis[a[i].x_2][a[i].y_2] = 1;
	}
	dfs ( 1 );
	return 0;
}

posted @ 2023-08-21 23:29  Echo_Long  阅读(9)  评论(0编辑  收藏  举报