VP 第11届蓝桥省赛A/B组

VP 第11届蓝桥省赛A/B组

2022-4-4 19:02:30。

A,2065. 整除序列 (AC)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>

#define debug(x) cout<<#x<<":"<<x<<endl
#define all(x) (x).begin(),(x).end()

using namespace std;

typedef long long ll;
typedef pair<int,int>PII;

int main(){
	ll n;cin>>n;
	while(n>0){
		cout<<n<<" ";
		n/=2;
	}
	return 0;
}

B,2066. 解码 (AC)

感觉是天梯里边那道题的翻版,而且要简单很多。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>

#define pb push_back
#define debug(x) cout<<#x<<":"<<x<<endl
#define all(x) (x).begin(),(x).end()

using namespace std;

typedef long long ll;
typedef pair<int,int>PII;

int main(){
	string s;cin>>s;
	string ans;
	char last;
	for(int i=0;i<s.size();i++){
		if(isdigit(s[i])){
			int t = s[i]-'0';
			t--;
			while(t--){
				ans.pb(last);
			}
		}
		else{
			last = s[i];
			ans.pb(last);
		}
	}
	cout<<ans;
	return 0;

}

C,2067. 走方格 (AC)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>

#define pb push_back
#define debug(x) cout<<#x<<":"<<x<<endl
#define all(x) (x).begin(),(x).end()

using namespace std;

typedef long long ll;
typedef pair<int,int>PII;

ll ans;
ll f[40][40];
int main(){
	int n,m;
	cin>>n>>m;
	f[1][1]=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(i==j&&i==1)continue;
			if(i%2==0&&j%2==0)continue;
			f[i][j] = f[i-1][j] + f[i][j-1];
		}
	}
	cout<<f[n][m]<<endl;
	return 0;
}
D,2068. 整数拼接 (突然想到了Acwing周赛曾经出过一道类似的数字拼接的题目) (WA! 3/11)

组合数学,感觉G了 又感觉是DP。

//O(n^2)的暴力
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>

#define pb push_back
#define debug(x) cout<<#x<<":"<<x<<endl
#define all(x) (x).begin(),(x).end()

using namespace std;
const int N = 1e5+10;
typedef long long ll;
typedef pair<int,int>PII;

ll cnt,k;
ll a[N];

ll f(ll a,ll b){
	ll t = b;
	ll len=0;
	while(b){
		b/=10;
		len++;
	}
	while(len--){
		a = a*10;
	}
	return a+t;
}

int main(){
	int n;cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			ll ck = f(a[i],a[j]);
			ll kc = f(a[j],a[i]);
//			cout<<i<<" "<<j<<" "<<ck<<" "<<kc<<endl;
			if(ck%k==0)cnt++;
			if(kc%k==0)cnt++;
		}
	}
	cout<<cnt<<endl;
	return 0;
}

把longlong 改成了 ull,成功TLE (4/11)

学到了一个trick,快速得到一个数的位数。

int x ; 
int len = to_string(x).size();
11个Hash,用到了数论同于的一点知识
//O(n^2)的暴力
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>

#define pb push_back
#define debug(x) cout<<#x<<":"<<x<<endl
#define all(x) (x).begin(),(x).end()
using namespace std;
const int N = 1e5+10;
//typedef long long ll;
typedef pair<int,int>PII;
typedef unsigned long long ll;
ll ans,k;
ll a[N];
ll cnt[12][N],Pow10[12];
ll f(ll b){
    return to_string(b).size();
}

int main(){	
	Pow10[0]=1;
	for(int i=1;i<=10;i++){
		Pow10[i] = Pow10[i-1]*10;
	}
	int n;cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=0;i<=10;i++){
		for(int j=1;j<=n;j++){
			ll t = (a[j]* Pow10[i]) %k;
			cnt[i][t]++;// 存储了 a[1~n] * Pow(10,i) % k 的值 
		}
	}

	//一个关键点,A_j  !=  A_i 
	for(int i=1;i<=n;i++){
		ll len = f(a[i]);
//		cout<<a[i]<< " "<<len<<endl;
		// 如果第i个数,也在第len(i) 的hash表当中,需要不计算这个数字。 
		ll t = (a[i]%k*(Pow10[len]%k))%k;
		if(t%k == ((k-a[i]%k)%k))ans--;
	
		ans+=cnt[len][((k-a[i]%k)%k)];
	}
	cout<<ans<<endl;
	return 0;
}
E,2069. 网络分析 (TLE 7/10)

并查集可以维护吗?

可以这样,将一个区域的信息存储到祖宗节点中,最后询问的时候,直接去询问祖宗节点有多少信息即可。

上边是错的。

遇事不决,先打暴力。

打了暴力就改输入。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>

#define pb push_back
#define debug(x) cout<<#x<<":"<<x<<endl
#define all(x) (x).begin(),(x).end()

using namespace std;
const int N = 1e5+10, M = 2e5+10;
typedef long long ll;
typedef pair<int,int>PII;

int h[N],e[M],ne[M],idx;
int w[N];
int n,m;
bool st[N];
void dfs(int u,int wit){
	st[u]=1;
	w[u]+=wit;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		//cout<<u<<" "<<j<<endl;
		if(st[j])continue;
		dfs(j,wit);
	}
}

void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

int main(){
	memset(h,-1,sizeof h);
	cin>>n>>m;
	for(int i=0;i<m;i++){
		int op,a,b;
		cin>>op>>a>>b;
		if(op==1){
			if(a==b)continue;
			add(a,b);
			add(b,a);
		}
		else{
			// 我怎么广播?
			for(int i=1;i<=n;i++)st[i]=0;
			dfs(a,b);
		}
	}
	for(int i=1;i<=n;i++){
		cout<<w[i]<<" ";
	}
	return 0;
}

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5+10;

int fa[N],n,m,d[N];

int find(int x){ // 递归很妙
    if(x==fa[x])return x;
    if(fa[x] == fa[fa[x]]) return fa[x];// x的父节点就是祖宗节点。
    
    // 先将x 的父节点路径压缩
    int r = find(fa[x]);
    d[x] += d[fa[x]];
    fa[x] = r;
    return r;
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=0;i<m;i++){
        int op,a,b;
        cin>>op>>a>>b;
        if(op==1){
            a = find(a);
            b = find(b);
            
            if(a==b)continue;
            
            fa[a] = b;
            d[a]-=d[b];
        }
        else{
            a = find(a);
            d[a]+=b;        
        }
    }
    
    for(int i=1;i<=n;i++){
        if(i == find(i)){
            cout<<d[i]<<" ";
        }
        else
            cout<<d[i]+d[find(i)]<<" ";
    }
    
    return 0;
}
F,2875. 超级胶水 (AC)

还没读题呢,一眼DP。 妈的, N 范围太大,不是区间DP。

通过找规律,发现他是一道数学题。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>

#define pb push_back
#define debug(x) cout<<#x<<":"<<x<<endl
#define all(x) (x).begin(),(x).end()

using namespace std;
const int N = 1e5+10;
typedef long long ll;
typedef pair<int,int>PII;

int n;
ll a[N];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	ll last = a[1];
	ll ans=0;
	for(int i=2;i<=n;++i){
		ans += last*a[i];
		last+=a[i];
	}
	cout<<ans<<endl;
	return 0;
}

2022-4-4 19:58:33 用时 :1h

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值