首页 > 其他分享 >Codeforces Round 976 (Div. 2)

Codeforces Round 976 (Div. 2)

时间:2024-10-03 11:11:42浏览次数:8  
标签:976 10 int scanf Codeforces long ++ while Div

一万五参赛,VP赛时629(唐了,E没想出来)

A. Find Minimum Operations

简单题。注意特判,用除法统计答案即可。

#include<bits/stdc++.h>
using namespace std;
int T, n, k;

int main() {
	scanf("%d", &T);
	while(T --) {
		scanf("%d%d", &n, &k);
		if(k == 1 || n < k) printf("%d\n", n);
		else {
			int ans = 0;
			while(n) {
				int t = 1;
				while(1ll * t * k <= n) t *= k;
				ans += n / t;
				n %= t;
			}
			printf("%d\n", ans);
		}
	}
	return 0;
}

B. Brightness Begins

结论题。模拟一下可以发现,只有完全平方数的灯是灭的,因为其他数因数都是两两出现。

有单调性,二分即可。(数学不好,不想推式子)

#include<bits/stdc++.h>
using namespace std;
long long T, k;

int main() {
	scanf("%lld", &T);
	while(T --) {
		scanf("%lld", &k);
		long long l = k, r = 2 * k;
		while(l < r) {
			long long mid = (l + r + 1) >> 1;
			if(mid - (int)sqrt(mid) >= k) r = mid - 1;
			else l = mid;
		}
		printf("%lld\n", l + 1);
	}
	return 0;
}

C. Bitwise Balancing

位运算不同位互不影响。按位考虑,最后拼起来即可。(感觉不如 B 题难度)

#include<bits/stdc++.h>
using namespace std;
long long T, b, c, d;

long long get_ans(long long b, long long c, long long d) {
	long long res = 0;
	for(int i = 62; i >= 0; i --) {
		if ((1 | (b >> i & 1)) - (1 & (c >> i & 1)) == (d >> i & 1)) res += 1ll << i;
		else if ((0 | (b >> i & 1)) - (0 & (c >> i & 1)) != (d >> i & 1)) return -1;
	}
	return res;
}

int main() {
	scanf("%lld", &T);
	while(T --) {
		scanf("%lld%lld%lld", &b, &c, &d);
		printf("%lld\n", get_ans(b, c, d));
	}
	return 0;
}

D. Connect the Dots

注意到 d 很小。因此可以把操作按照起点(1 ~ d)和间距,归为 d * d 类,进行差分。

最后进行前缀和,相邻均不为零的点用并查集合并即可。

一个 tip :相邻不为零的点并不一定都需要合并(原因略)。在每两个点间加一个点隔开即可。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int T, n, m, s[11][10][N * 2], f[N];
bool vis[N];

int find(int x) {
	if(x == f[x]) return x;
	return f[x] = find(f[x]);
}

int main() {
	scanf("%d", &T);
	while(T --) {
		scanf("%d%d", &n, &m);
		for(int i = 1; i <= 10; i ++)
			for(int j = 0; j < i; j ++) {
				int t = (n / i + 1) * 2;
				for(int k = 0; k <= t; k ++)
					s[i][j][k] = 0;
			}
				
		for(int i = 1; i <= n; i ++) vis[i] = false;
		while(m --) {
			int a, d, k;
			scanf("%d%d%d", &a, &d, &k);
			s[d][a % d][(a / d) * 2] ++;
			s[d][a % d][(a / d + k + 1) * 2 - 1] --;
		}
		for(int i = 1; i <= n; i ++) f[i] = i;
		for(int i = 1; i <= 10; i ++)
			for(int j = 0; j < i; j ++) {
				int t = (n / i + 1) * 2;
				for(int k = 2; k <= t; k += 2) {
					s[i][j][k - 1] += s[i][j][k - 2];
					s[i][j][k] += s[i][j][k - 1];
					if(s[i][j][k] && s[i][j][k - 1])
						f[find(j + k / 2 * i)] = find(j + (k / 2 - 1) * i);
				}
			}
		int ans = 0;
		for(int i = 1; i <= n; i ++)
			if(!vis[find(i)]) ans ++, vis[find(i)] = true;
		printf("%d\n", ans);
	}
	return 0;
}

E. Expected Power

(赛后补题)

f(S) 比较好求,按位枚举,计算概率即可。

对于 (f(S))2 ,用二进制思维考虑乘法,其实就是二进制下每一位相乘。

因此计算 f[i][j][k][p][q] 数组,表示考虑前 i 个数,第 j 位和第 k 位分别为 p 和 q 的概率。

最后计算 (1 << (i + j)) * f[n][i][j][1][1] 的值即可。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
int T, n, a[N], p1[N], p2[N];
int f[10][10][2][2];

int qpow(int a, int b) {
	int res = 1;
	while(b) {
		if(b & 1) res = 1ll * res * a % mod;
		b >>= 1;
		a = 1ll * a * a % mod;
	}
	return res;
}

int main() {
	scanf("%d", &T);
	while(T --) {
		for(int i = 0; i < 10; i ++)
			for(int j = 0; j < 10; j ++)
				for(int p = 0; p < 2; p ++)
					for(int q = 0; q < 2; q ++)
						f[i][j][p][q] = 0;
		scanf("%d", &n);
		for(int i = 1; i <= n; i ++)
			scanf("%d", &a[i]);
		for(int i = 1, P; i <= n; i ++) {
			scanf("%d", &P);
			p1[i] = 1ll * P * qpow(10000, mod - 2) % mod;
			p2[i] = (1 - p1[i] + mod) % mod;
		}
		for(int i = 0; i < 10; i ++)
			for(int j = 0; j < 10; j ++)
				f[i][j][0][0] = 1;
		for(int i = 1; i <= n; i ++) {
			for(int j = 0; j < 10; j ++)
				for(int k = 0; k < 10; k ++) {
					int t1 = a[i] >> j & 1;
					int t2 = a[i] >> k & 1;
					int temp[2][2];
					for(int p = 0; p < 2; p ++)
						for(int q = 0; q < 2; q ++)
							temp[p][q] = (1ll * f[j][k][p][q] * p2[i] + 1ll * f[j][k][p ^ t1][q ^ t2] * p1[i]) % mod;
					for(int p = 0; p < 2; p ++)
						for(int q = 0; q < 2; q ++)
							f[j][k][p][q] = temp[p][q];
				}
		}
		int ans = 0;
		for(int i = 0; i < 10; i ++)
			for(int j = 0; j < 10; j ++)
				ans = (ans + (1ll << (i + j)) * f[i][j][1][1]) % mod;
		printf("%d\n", ans);
	}
	return 0;
}

标签:976,10,int,scanf,Codeforces,long,++,while,Div
From: https://www.cnblogs.com/lingo12321/p/18445446

相关文章

  • Codeforces Round 976 (Div. 2) 题解
    CodeforcesRound976(Div.2)题解2020B一个常见的想法:开关灯=异或,虽然在这道题里没啥用注意到,第i盏灯的按钮被按的次数就是i的除它本身以外的因子个数而完全平方数的因子数为奇数,其他数的因子数为偶数点击查看更多信息#include<bits/stdc++.h>usingnamespacestd;voi......
  • 题解:CF1976D Invertible Bracket Sequences
    可以在cnblog中阅读。题意给一个合法括号序列,问有多少区间\([l,r]\),使得将区间内的每个括号翻转后,括号序列仍合法。分析十分套路地,我们将(看成\(+1\),将)看成\(-1\),则一个括号序列合法的充要条件是转换后的序列满足:前缀和任意位置非负;最后一项为\(0\)。考虑翻转......
  • CodeForces - 118D - dp
    这道题的思路可能来源于步兵后面必须跟骑兵,反之亦然,那么一个兵种当前的状态肯定是由另一个兵种上一个的状态推来的(即取用该当前取用的兵种之前)。接下来就要考虑怎么控制每次取用多少个人了,由题意可知,每次取用不得超过k1或k2,我们从1-n1和从1-n2表示骑兵和步兵当前的数量表示......
  • Codeforces Round 975 (Div. 2)
    一万四参赛,VP赛时60A.MaxPlusSize一定选择最大值,若有多个最大值,优先选在奇数位置的最大值,后间隔涂上红色。#include<bits/stdc++.h>usingnamespacestd;constintN=105;intT,n,a[N];intmain(){ scanf("%d",&T); while(T--){ scanf("%d",&n); intm......
  • 【LGR-197-Div.2】洛谷 10 月月赛 I &「SFMOI」Round I(A,B,C)
    A.StrangeCakeGame对于小W,往下走最赚,对于小M往右走最赚,于是路线形成了个折线,直接对应竖坐标位置去看看横坐标符不符合要求即可#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<queue>#include<deque>#include<math.h>#include<m......
  • Codeforces Global Round 19 E. Best Pair
    \(cnt\)的取值种类数不超过\(\sqrtn\)。因此我们可以枚举\(cnt\)然后贪心选最大的值。#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;voidsolve()......
  • CF2020(Codeforces Round 976 (Div. 2))
    CF2020A.FindMinimumOperations难度:红转换进制,每一位上数字相加。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;llt,n,k,ans;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>t;while(t--){cin&......
  • [LeetCode] 1497. Check If Array Pairs Are Divisible by k
    Givenanarrayofintegersarrofevenlengthnandanintegerk.Wewanttodividethearrayintoexactlyn/2pairssuchthatthesumofeachpairisdivisiblebyk.ReturntrueIfyoucanfindawaytodothatorfalseotherwise.Example1:Input:arr......
  • pbootcms编辑器过滤div代码解决办法
    在使用PbootCMS建站时,如果需要在专题内容中加入含有HTML代码的文字,但发现编辑器将 div 标签转换成了 p 标签,可以通过以下步骤进行修改。修改步骤修改 ueditor.all.js 文件找到 core->extend->ueditor->ueditor.all.js 文件。在大约第10830行,将 allowDivTransToP......
  • Codeforces Round 956 (Div. 2)
    无法评价,不知道是我傻逼还是题傻逼。A.ArrayDivisibility题意让你构造一个长度为\(n\)的序列,满足对于每一个\(i\)\((i\in[1,n])\),让\(a_j\)之和为\(i\)的倍数,\(j\)能被\(i\)整除。换句话说,让你构造一个长度为\(n\)的序列,满足\(\sum_{j|i}a_j\)能被\(i\)......