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