ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ABC 258 上分记录

2022-07-02 22:01:40  阅读:133  来源: 互联网

标签:ABC int ll signed vis 258 ans 上分 main


A

模拟,注意特判前导零。

signed main() 
{
	int x; cin >> x;
	int h = x / 60;
	x %= 60;
	printf("%d:", h + 21);
	if(x <= 10) printf("0");
	printf("%d",x);
	return 0;
}

B

我们发现他能够将这个矩形给复制成 \(9\) 份。

然后在复制后的矩形里去找最大值就行了。


const int dx[] = {0, -1, -1, -1, 0, 0, 1, 1, 1};
const int dy[] = {0, -1, 0, 1, -1, 1, -1, 0, 1};
bitset <1000> vis[1000];
ll Ans = -0x3f3f3f3f;
 
void dfs(int x, int y, int fx, ll ans, int step) {	
	if(step == n + 1) return Ans = max(Ans, ans), void();
	int xx = x + dx[fx], yy = y + dy[fx];
	if(xx >= 1 && xx <= 3 * n && yy >= 1 && yy <= 3 * n) {
//		vis[xx][yy] = 1;
		dfs(xx, yy, fx, ans * 10 + mp[xx][yy], step + 1);
//		vis[xx][yy] = 0;
	}
}
 
signed main() 
{
	n = read();
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= n; j++) {
			scanf("%1d", &mp[i][j]);
		}
	}
	for(int i = 1; i <= n; i++) {
		for(int j = n + 1; j <= 2 * n; j++) {
			mp[i][j] = mp[i][j - n];
		}
	}
	for(int i = 1; i <= n; i++) {
		for(int j = 2 * n + 1; j <= 3 * n; j++) {
			mp[i][j] = mp[i][j - 2 * n];
		}
	}
	for(int i = n + 1; i <= 2 * n; i++) {
		for(int j = 1; j <= n; j++) {
			mp[i][j] = mp[i - n][j];
		}
	}
	for(int i = n + 1; i <= 2 * n; i++) {
		for(int j = n + 1; j <= 2 * n; j++) {
			mp[i][j] = mp[i][j - n];
		}
	}
	for(int i = n + 1; i <= 2 * n; i++) {
		for(int j = 2 * n + 1; j <= 3 * n; j++) {
			mp[i][j] = mp[i][j - 2 * n];
		}
	}
	for(int i = 2 * n + 1; i <= 3 * n; i++) {
		for(int j = 1; j <= n; j++) {
			mp[i][j] = mp[i - 2 * n][j];
		}
	}
	for(int i = 2 * n + 1; i <= 3 * n; i++) {
		for(int j =  n + 1; j <= 2 * n; j++) {
			mp[i][j] = mp[i][j - n];
		}
	}
	for(int i = 2 * n + 1; i <= 3 * n; i++) {
		for(int j = 2 * n + 1; j <= 3 * n; j++) {
			mp[i][j] = mp[i][j - 2 * n];
		}
	}
	for(int k = 1; k <= 8; k++) {
		for(int i = 1; i <= 3 * n; i++) {
			for(int j = 1; j <= 3 * n; j++) {
				dfs(i, j, k, 0, 1);
			}
		}
	}
//	printf("\n");
	cout << Ans;
	return 0;
}

C

sb 题,把字符串复制一遍,用一个指针来维护当前状态下的字符串。

其实可以对这个字符串建个主席树

signed main() {
	int n, Q;
	cin >> n >> Q;
	cin >> s;
	s += s;
	int l = 0;
	for (int i = 1; i <= Q; i++) {
		int opt = read(), x = read();
		if(opt & 1) l = (l + n - x) % n;
		}
		else cout << s[l + x - 1] << "\n";
	}
	return 0;
}

D

还是sb题,直接贪心就行了。

用一个前缀和还有前缀最小值来搞。

老套路了。

ll a[N], b[N];
ll ans = 2e18, qzh[N], c[N];

signed main() 
{
	int n = read(), x = read();
	c[0] = 1e18;
	for(int i = 1; i <= n; i++) {
		a[i] = read(), b[i] = read();
		qzh[i] = qzh[i - 1] + a[i] + b[i], c[i] = min(b[i] * 1ll, c[i - 1]);
	}
	for(int i = 1; i <= n; i++) {
		ll m = qzh[i];
		ans = min(ans, m + c[i] * (x - i));
	}
	cout << ans;
	return 0;
}

G

计数题。

暴力做法是 \(\mathcal(O)(n^3)\)

我们发现用一个 bitset 就做到了 \(\mathcal(O)(\frac{n^3}{w})\)

bitset <4000>  vis[4000];

signed main() 
{
	int n = read();
	for(int i = 1; i <= n; i++) {
		for(int j = n - 1; j >=  0; j--) {
			int x;
			scanf("%1d", &x);
			vis[i].set(j, x);
		}
	}
	ll ans = 0;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= n; j++) {
			if(vis[i][n - j]) ans += (vis[i] & vis[j]).count();
		}
	}
	cout << ans / 6;
	return 0;
}

标签:ABC,int,ll,signed,vis,258,ans,上分,main
来源: https://www.cnblogs.com/tttttttle/p/16438673.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有