此时不搏何|

bryce_yyds

园龄:2年6个月粉丝:7关注:12

20220819总结

这次考试太烂了,又没考过 Diavolo

T1

简单的入门题,先热身。

#include<iostream>
#define int long long
#define N 5001

using namespace std;

int n, ans;
double a[N];
int t[N];

signed main(){
	cin >> n;
	for (int i = 1; i <= n; i++){
		cin >> a[i] >> t[i];
	}
	for (int i = 1; i <= n; i++){
		while (t[i]){
			int k = (double)a[i] * t[i];
			ans ^= k;
			t[i]--;
		}
	}
	cout << ans;
	return 0;
} 
//kcr AK IOI orz

T2

对我来说是一道最难的题了,居然是个分组背包,虽然我也想到了,可是代码实现有问题。

#include<bits/stdc++.h>
#define int long long
#define N 2005

using namespace std;

inline int read(){register int x = 0, f = 1;register char c = getchar();while (c < '0' || c > '9'){if (c == '-') f = -1;c = getchar();}while (c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return x * f;}
inline void write(int x){if (x < 0) putchar('-'), x = -x;if (x > 9) write(x / 10);putchar(x % 10 + '0');}

int n, m, k, tot;
int sum[N][N][2], dp[N][N][2], a[N][N];
bool c[N][N];

signed main(){
	n = read(), m = read(), k = read();
	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= m; j++){
			char x;
			a[i][j] = read();
			scanf("%c", &x);
			if (x == 'Y'){
				c[i][j] = 1;
			}else{
				c[i][j] = 0;
			}
		}
		getchar();
	}
	for (int i = 1; i <= m; i++){
		int zd = 0;
		for (int j = n; j > 0; j--){
			if (c[j][i]){
				sum[i][zd][1] += a[j][i];
			}else{
            	zd++;
				sum[i][zd][1] = sum[i][zd-1][1] + a[j][i];
				sum[i][zd][0] = sum[i][zd-1][1] + a[j][i];
			}
		}
	}
	for (int i = 1; i <= m; i++){
		for (int j = 0; j <= k; j++){
			for (int l = 0; l <= min(n, j); l++){
				dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - l][1] + sum[i][l][1]);
                if (l){
                	dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - l][1] + sum[i][l][0]);
				}
                if (j > l){
                	dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - l][0] + sum[i][l][1]);
				}
			}
		}	
	}
	write(dp[m][k][0]);
	return 0;
}

T3

有点简单,书上原题,看我暴打标程

#include<iostream>
#include<stack>
#define int long long
#define N 1005

using namespace std;

int n, m, ans;
bool a[N][N];
int h[N];
int l[N], r[N];

stack<int> stk;

signed main(){
	cin >> n >> m;
	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= m; j++){
			char c;
			cin >> c;
			if (c == '*'){
				a[i][j] = 0;
			}else{
				a[i][j] = 1;
			}
		}
	}
	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= m; j++){
			if (!a[i][j]){
				h[j] = 0;
			}else{
				h[j] = h[j] + 1;
			}
		}
		for (int j = 1; j <= m; j++){
			r[j] = m + 1;
		}
		for (int j = 1; j <= m; j++){
			while (!stk.empty() && h[j] < h[stk.top()]){
				r[stk.top()] = j;
				stk.pop();
			}
			stk.push(j);
		}
		while (!stk.empty()){
			stk.pop();
		}
		for (int j = 1; j <= m; j++){
			l[j] = 0;
		}
		for (int j = m; j >= 1; j--){
			while (!stk.empty() && h[j] <= h[stk.top()]){
				l[stk.top()] = j;
				stk.pop();
			}
			stk.push(j);
		}
		while (!stk.empty()){
			stk.pop();
		}
		for (int j = 1; j <= m; j++){
			ans += (j - l[j]) * (r[j] - j) * h[j];
		} 
	}
	cout << ans;
	return 0;
}
//kcr AK IOI orz

T4

爽死了,做过,直接一波 AC

#include<iostream>
#include<climits>
#include<queue>
#define int long long
#define N 10001
#define M 50001
#define INF LLONG_MAX

using namespace std;

int n, m, s, t, c;
int f[N];

struct edge{
	int v, w, nxt;
}e[M << 1];

int head[N], cnt;

void add(int u, int v, int w){
	cnt++;
	e[cnt].v = v;
	e[cnt].w = w;
	e[cnt].nxt = head[u];
	head[u] = cnt;
}

int dis[N];

struct node{
	int s, d;
	bool operator < (const node &x) const{
		return x.d < d;
	}
};

priority_queue<node> q;

bool dij(int x){
	while (!q.empty()){
		q.pop();
	}
	for (int i = 1; i <= n; i++){
		dis[i] = INF;
	}
	dis[s] = 0;
	q.push((node){s, 0});
	if (f[s] > x){
		return 0;
	}
	while (!q.empty()){
		int u = q.top().s, d = q.top().d;
		q.pop();
		if (dis[u] != d){
			continue;
		}
		for (int i = head[u]; i; i = e[i].nxt){
			int v = e[i].v;
			if (f[v] <= x && dis[u] + e[i].w < dis[v]){
				dis[v] = dis[u] + e[i].w;
				q.push((node){v, dis[v]});
			}
		}
	}
	return dis[t] <= c;
}

signed main(){
	cin >> n >> m >> c;
	s = 1, t = n;
	int l = 0, r = 0;
	for (int i = 1; i <= n; i++){
		cin >> f[i];
		r = max(r, f[i]);
	}
	for (int i = 1; i <= m; i++){
		int u, v, w;
		cin >> u >> v >> w;
		add(u, v, w);
		add(v, u, w);
	}
	while (l < r){
		int mid = (l + r) >> 1;
		if (dij(mid)){
			r = mid;
		}else{
			l = mid + 1;
		}
	}
	if (dij(l)){
		cout << l;
	}else{
		cout << "AFK";
	}
	return 0;
} 
//kcr AK IOI orz

总结

我 AK 了

这次考试 240 分,rank 8,别问我为啥没有三百。(我才不会告诉你时限为 0.1s

惊喜

差点某人要请我吃饭。

本文作者:bryce_yyds

本文链接:https://www.cnblogs.com/bryceyyds/p/16603180.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   bryce_yyds  阅读(46)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起