23.12.17周报(六级,重庆省赛)(vp 22辽宁) (kk)

星期一:

上完早八来机房,再敲遍dij先。 边摸鱼边敲,敲完11点半,先去吃个饭。

下午看了点prim算法和kk算法.

晚上又看了遍O(n²)的朴素dij算法,和堆优化的O(mlogn)略有不同.

星期二:

和李,强vp了场22年辽宁省赛,不仅进了银尾,而且收获颇丰。士气大涨,心情很好啊!

从头记录下做题顺序:

A题:

题意:如题

思路:签到,强写的

M:

题意:如题

思路:easy构造,无需多言,放个代码。

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;

const int N=1e6+10;
int n,m;
bool a[1010][1010];
void solve(){
	cin >> n;
	memset(a,1,sizeof a);
	int k;
	if(n&1) k=0;
	else k=1;
	for(int i=k;i<=n;i+=2) a[i][i]=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cout << a[i][j];
		}
		cout << endl;
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	cin >> _;
	while(_--) solve();
	return 0;
}
//make it count
//开ll plz

E题:

题意:如题

思路:究极签到被卡了老久,还wa了好多发,罚时被扣完了。wa就wa在一行的输入没有处理完就break了,导致输入的处理错乱了,也算吃一堑长一智,这种连续多组输入的,每个都得处理完。

B题:

题意:如题,n和m范围1e3以内

思路:大模拟,最开始强来写这道题,整了250行的代码,wa了两发,然后我们发现还是不能让强写模拟。

代码如下:

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;

const int N=2e5+10,M=1e5+10;
const int mod=998244353;
int n,m;
char c[1010][1010];
int a[1010][1010];
int ans1,ans2;
void check1(int x,int y,int num){
	if(x>n-4) return ;
	for(int i=x;i<x+5;i++){
		if(a[i][y]!=num) return ;
	}
	if(num&1) ans1++;
	else ans2++;
}
void check2(int x,int y,int num){
	if(y>m-4) return ;
	for(int j=y;j<y+5;j++){
		if(a[x][j]!=num) return ;
	}
	if(num&1) ans1++;
	else ans2++;
}
void check3(int x,int y,int num){
	if(x>n-4 || y>m-4) return ;
	for(int i=x,j=y;i<x+5;i++,j++){
		if(a[i][j]!=num) return ;
	}
	if(num&1) ans1++;
	else ans2++;
}
void check4(int x,int y,int num){
	if(x<5 || y>m-4) return ;
	for(int i=x,j=y;j<y+5;i--,j++){
		if(a[i][j]!=num) return ;
	}
	if(num&1) ans1++;
	else ans2++;
}
void solve(){
	cin >> n >> m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin >> c[i][j];
			if(c[i][j]=='0') a[i][j]=0;
			if(c[i][j]=='1') a[i][j]=1;
			if(c[i][j]=='2') a[i][j]=2;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			check1(i,j,1);
			check2(i,j,1);
			check3(i,j,1);
			check4(i,j,1);
			check1(i,j,2);
			check2(i,j,2);
			check3(i,j,2);
			check4(i,j,2);
		}
	}
	cout << ans1 << " " << ans2;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
//	cin >> _;
	while(_--) solve();
	return 0;
}
//make it count
//开ll plz

I题:

题意:如题

思路:我读完后没有思路,倒是后来强读后很快反应出来这是kk算法逆运用,刚好刚学kk算法,算是拿道板子题练练手了

代码如下:

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;

const int N=1e6+10,M=1e9+10;
struct nod{
	int u,v,w;
}eg[N];
int n,m;
int fa[N];
bool cmp1(nod a,nod b){
	return a.w>b.w;
}
int fnd(int x){
	return fa[x]==x?x:fa[x]=fnd(fa[x]);
}
void solve(){
	cin >> n >> m;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++){
		cin >> eg[i].u >> eg[i].v >> eg[i].w;
	}
	sort(eg+1,eg+n+1,cmp1);
	int cnt=0;
	for(int i=1;i<=m;i++){
		int x=eg[i].u,y=eg[i].v;
		x=fnd(x),y=fnd(y);
		if(x!=y){
			fa[x]=y;
			cnt++;
			if(cnt==n-1){cout << eg[i].w; return ;}
		}
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
//	cin >> _;
	while(_--) solve();
	return 0;
}
//make it count
//开ll plz

F题:

题意:如题

思路:刚开始试图找规律,强打了个表后发现,其实范围内与n互质的数特别好找,用for一路搜上去也就循环10次以内,所以算是一道暴力题。就不贴代码了。

最后一道,G题:

题意:如题

思路:三人一起想半天无果后,我决定写一发暴力,但强似乎有了思路,于是我俩在两台机子上写自己的,强写了会没实现出来,我第一发暴力也t了,但后来给算最大公约数剪了个枝,就很神奇的过了

先贴暴力代码:

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;

const int N=1e6+10;
int n;
vector<int>ve;
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
void solve(){
	cin >> n;
	while(n--){
		int op,x;cin >> op;
		if(op==1){
			cin >> x;
			ve.push_back(x);
		}else if(op==2){
			ve.pop_back();
		}else if(op==3){
			cout << ve[ve.size()-1] << "\n";
		}else{
			cin >> x;
			int gc=0;
			for(int i=ve.size()-1,cnt=x;cnt;cnt--,i--){
				gc=gcd(ve[i],gc);
				if(gc==1) break;//神之一手的剪枝
			}
			for(int i=ve.size()-1,cnt=x;cnt;cnt--,i--){
				ve[i]=gc;
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
//	cin >> _;
	while(_--) solve();
	return 0;
}
//make it count
//开ll plz

事后强试图寻找正解,好像找到了个线段树的解,等会研究下。

这次比赛不仅进了银牌尾,还收获颇丰,在此总结一下。

1.签到题不能急,三个人都确定了再交,宁愿多花1min让其他人理解好题意,万一wa了一发,20min罚时真的遭不住。

2.大模拟交给我来写。

3.如果想了很久都没什么思路,能暴力就先冲发暴力。

4.虽然强是代码手,但有必要时我也需要上机实现我的想法(如暴力),该果断时就得果断点。

补题感觉没啥好补的,g题线段树做法可以看看,但我现在不打算补.

星期四:

昨天在宿舍写了一晚数据结构项目的中期报告,代码一点没准备好,报告全靠编。

在pta上写了个拓扑排序,感觉纯排序的话确实挺好敲的。

暂时放弃线段树入门,入了星期天省赛大概率也用不出来。

晚上在acwing上看了01背包和完全背包

星期五:

早上来看了多重背包,中午继续看,晚上没干啥,早点回宿舍收拾,走前做了道基础构造

题意:如题

思路:情况判断即可

星期六:

早上和强小vp一把21年辽宁省赛。

记录一道签到题的收获:

int chan(char c){
	if(c>='a' && c<='z') return (int)c-('a'-'A');
	if(c>='A' && c<='Z') return (int)c-('A'-'a');
//	return 0;
}

如你所见,此函数的功能是更改字母大小写,但是如果只有两个if,在牛客上会编译不通过,初步判断为是因为,不能在任何情况下都确定有返回值,所以可以在下面加个  return 0;  。

考了个六级,感觉还可以,但分应该也不会很高。

周日:

省赛直接被拿下了,被“签到”卡了接近两小时才反应过来读错题,封榜后完成签到。

失败总是贯穿人生始终,这就是人生。

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值