返回顶部

AtCoder Beginner Contest 186

A Brick


int n, m;
int main()
{
	scanf("%d%d", &n, &m);
	printf("%d\n", n / m);	
	return 0;
} 

B Blocks on Grid


int n, m;
int a[N][N];
int main()
{
	int sum = 0x3f3f3f3f;

	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++ i) 
		for(int j = 1; j <= m; ++ j)
		{
			scanf("%d", &a[i][j]);
			sum = min(sum, a[i][j]);
		}
	int res = 0;
	for(int i = 1; i <= n; ++ i) 
		for(int j = 1; j <= m; ++ j)
		{
			res += a[i][j] - sum;
		}
	printf("%d\n", res);
	return 0;
} 

C Unlucky 7


bool check(int x)
{
	int t = x;
	while(x) 
	{
		if(x % 10 == 7) return 1;
		x /= 10;
	}
	while(t)
	{
		if(t % 8 == 7) return 1; 
		t /= 8;
	}
	return 0;
}

int main()
{
	scanf("%d", &n);
	int res = 0;
	for(int i = 7; i <= n; ++ i)
		if(check(i)) res ++;
	printf("%d\n", n - res);
	return 0;
} 

D Sum of difference


int n;
int a[SZ], b[SZ];
int main()
{
	LL sum = 0;
	scanf("%d", &n);
	for(int i = 1; i <= n; ++ i) 
		scanf("%d", &a[i]);
	sort(a + 1, a + n + 1);
	for(int i = 1; i <= n; ++ i)
		sum += (LL)a[i] * (2 * i - 1 - n);
	printf("%lld\n", sum);
	return 0;
} 

E Throne

\(s + k * x = n * y\)


int n, s, k;
LL exgcd(LL a, LL b, LL &x, LL &y)
{
	if(!b) 
	{
		x = 1, y = 0;
		return a;
	} 
	LL d = exgcd(b, a % b, y, x);
	y -= a / b * x;
	return d;
}

int main()
{
	int __;
	scanf("%d", &__);
	while(__ -- )
	{
		LL x, y;
		scanf("%d%d%d", &n, &s, &k);
		LL d = exgcd(k, n, x, y);
		if(s % d) puts("-1");
		else 
		{
			x *= - s / d;
			LL t = abs(n / d);
			printf("%lld\n", (x % t + t) % t);
		}
	}
	return 0;
} 

F Rook on Grid

每一次移动可以往下或往右走任意步数,但遇到墙要停,初始位置在(1,1),问走两步以内能够覆盖的路径有多少个格子.
首先考虑第一步向下走,把第二步向右走可以到达的位置统计。
然后考虑第一步向右走,第二步向下走且第一种情况未到达的位置:
即到当前列第一个障碍这些行中,在前面列出现障碍的行数,统计完后把当前列的障碍更新上去,可以用一个树状数组维护.


int tr[N];
int n, m, k;
int row[N];
int column[N];
vector<int> v[N];

int lowbit(int x) { return x & -x; }

void add(int x, int v) { for(int i = x; i <= n; i += lowbit(i)) tr[i] += v; }

int query(int x) { int res = 0; for(int i = x; i; i -= lowbit(i)) res += tr[i]; return res; }

int main()
{
	scanf("%d%d%d", &n, &m, &k);
	for(int i = 1; i <= n; ++ i) row[i] = m + 1;
	for(int i = 1; i <= m; ++ i) column[i] = n + 1;
	for(int i = 1; i <= k; ++ i)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		row[x] = min(row[x], y);
		column[y] = min(column[y], x);
	}
	LL res = 0;
	int flag = 0;
	for(int i = 1; i <= n; ++ i)
	{
		if(flag == 1) { row[i] = 1; continue; }
		if(row[i] == 1) { flag = 1; continue; }
		res += row[i] - 1; 
	}
	for(int i = 1; i <= n; ++ i) v[row[i]].push_back(i);
	for(int i = 1; i <= m; ++ i)
	{
		if(column[i] == 1) break;
		res += query(column[i] - 1);
		for(auto j: v[i]) add(j, 1);
	}
	printf("%lld\n", res);
	return 0;
} 

2021.1.20

posted @ 2021-01-20 21:29  __October  阅读(47)  评论(0编辑  收藏  举报