ABC470 赛后总结

共 753 字
7 分钟
0 次阅读

都怪 dmy 害我报了 469 unr。你赔我的简单题。你赔我的上分。

A Fizz

这也是题?

:::success[code]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>
#define fs first
#define sc second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		if(i%3==0)puts("Fizz");
		else printf("%d\n",i);
	}
}
/*
*/

:::

B Monocolor

等下,这不是 dmy 分班考原题吗。

:::success[code]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<bits/stdc++.h>
#define fs first
#define sc second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int cnt[105];
int main(){
	int n;
	scanf("%d",&n);
	int maxv=0;
	for(int i=1;i<=n;i++){
		int t;
		scanf("%d",&t);
		cnt[t]++;
		maxv=max(maxv,cnt[t]);
	}
	printf("%d\n",n-maxv);
}
/*
*/

::::

C Inc,Dec,Xor

被 C 题卡了。这么神秘。

我的想法和官解差不多,但官解是维护所有满足条件的索引,而我是预先把每个数分配给操作,反正线性。

:::success[code]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<bits/stdc++.h>
#define fs first
#define sc second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int a,ls[500005];
vector<int>expi[500005];
int main(){
	int n,q;
	scanf("%d%d",&n,&q);
	int ans=0,cnt=0;
	while(q--){
		int op;
		scanf("%d",&op);
		if(op==1){
			int x;
			scanf("%d",&x);
			ans^=a[x];
			a[x]++;
			ans^=a[x];
			ls[x]=max(cnt,ls[x])+1;
			expi[ls[x]].push_back(x);

		}else{
			cnt++;
			for(int x:expi[cnt]){
				ans^=a[x];
				a[x]--;
				ans^=a[x];
			}
		}
		printf("%d\n",ans);
	}
}
/*
CYX's Brain is busy now, please try again later.
*/

:::

D Inverse and Swap

史上最简单 D。

考虑一个排列的逆排的逆排就是他本身,直接两个都维护不就好了。

:::success[code]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<bits/stdc++.h>
#define fs first
#define sc second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int a[2][500005];
int now=0,lst=1;
int n,q;
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)scanf("%d",&a[0][i]),a[1][a[0][i]]=i;
	while(q--){
		int op;
		scanf("%d",&op);
		if(op==2)swap(now,lst);
		else{
			int x,y;
			scanf("%d%d",&x,&y);
			swap(a[lst][a[now][x]],a[lst][a[now][y]]);
			swap(a[now][x],a[now][y]);
		}
	}
	for(int i=1;i<=n;i++)printf("%d ",a[now][i]);
}
/*
*/

:::

E Concentration

期望 DP。$dp_{i,j,k}$ 表示还有 $i$ 对待配对的,已经知道了 $j$ 张,还有 $k$ 条命。当然记忆化搜索。

:::success[code]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<bits/stdc++.h>
#define fs first
#define sc second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
constexpr double eps=1e-10;
double dp[205][205][205];
bool v[205][205][205];
int n,l;
double dfs(int pr,int sg,int lf){
	if(v[pr][sg][lf])return dp[pr][sg][lf];
	if(pr==0||lf==0)return 0.0;
	double prf=(double)pr,sgf=(double)sg;
	// 开到了一张已有的,直接爽飞
	double ans=0;
	if(sg>=1)ans=sgf/(prf*2.0-sgf)*(1.0+dfs(pr-1,sg-1,lf));
	// 开到了一张新的
	double pnew=2.0*(prf-sgf)/(2*prf-sgf);
	if(pnew>0){
		double res=0;
		// 在剩下的牌里抽到了配对的
		if(2.0*prf-sgf-1.0>=eps&&pr>=1)res+=1.0/(2.0*prf-sgf-1.0)*(1.0+dfs(pr-1,sg,lf));
		// 抽到了已有的一张
		if(lf>1){
			if(sg!=0&&2.0*prf-sgf-1.0>=eps)res+=sgf/(2.0*prf-sgf-1.0)*(1.0+dfs(pr-1,sg,lf-1));
		}
		// 抽到了全新的
		if(lf>1){
			if(prf-sgf-1.0>=eps&&(2.0*prf-sgf-1.0>=eps))res+=2.0*(prf-sgf-1.0)/(2.0*prf-sgf-1.0)*dfs(pr,sg+2,lf-1);
		}
		ans+=res*pnew;
	}
	v[pr][sg][lf]=1;
	return dp[pr][sg][lf]=ans;
}
int main(){
	scanf("%d%d",&n,&l);
	int sum=0;
	for(int i=1;i<=n;i++){
		int t;
		scanf("%d",&t);
		sum+=t;
	}
	printf("%.10lf",(double)sum/(double)n*dfs(n,0,l));
}
/*
i,j,k 表示还有 i 对没开出来,开出来了 j 个单张,生命值为 k
*/

:::

F Googol Swap

写题解了。这里就不放了。

G ΣШX

啦!!!这就是我们 abc 的命题质量!!!

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计