前言

今天主要是补题,牛客,杭电和落下的cf

一、杭电补题

1、Shortest Path in GCD Graph

答案只有1和2,开始想用最短路,最后还是没能解决,这不是一个最短路问题,算是思维题,找与给定两个数都互质的数,就是对a,b分解质因数,符合题目要求的中转数就是不含这些因数的数,容斥处理

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int>f;
const int N = 1e7+10,mod = 998244353;
int phi[N],primes[N];
bool st[N];
int n, m, len ;
ll ans;
int cnt;
void get_eulers(int n)
{st[1] = 1;for (int i = 2; i <= n; i++){if (!st[i]){primes[cnt++] = i;phi[i] = i; }for (int j = 0; primes[j] * i <= n; j++){st[primes[j] * i] = 1;phi[primes[j] * i] = primes[j];if (i % primes[j] == 0){break;}}}
}function<void(int, int, int) > dfs = [&](int u, int mul, int sign){//容斥暴力写法if (u == len){ans = (ans + 1LL * sign * (n / mul)) % mod;return;}dfs(u + 1, mul, sign);if (1LL * mul * f[u] <= n) dfs(u + 1, mul * f[u], mod - sign);
};void slove(){scanf("%d%d",&n,&m);get_eulers(n);while(m--){int u,v;scanf("%d%d",&u,&v);// if(u > v) swap(u,v);int sx = __gcd(u,v);if(sx == 1){printf("1 1\n");continue ;}f.clear();while(u > 1) f.push_back(phi[u]),u /= phi[u];while(v > 1) f.push_back(phi[v]),v /= phi[v];sort(f.begin(),f.end());f.erase(unique(f.begin(),f.end()),f.end());len = f.size();ans = 0;if(sx == 2) ans = 1;dfs(0, 1, 1);printf("2 %d\n",ans);}}int main(){slove();return 0;
}

2、Matryoshka Doll

dp,参考大佬的思路代码

我们定义 dp[i][j] 为 [1...i] 中分成 j 组的方案数。

我们可以 O(n2) 处理出,对于每个 a[i] ,左边有多少个数是不能放在同一组的。我们定义为 L[i] 。

那么显然,剩下的 i−L[i] 的数,都可以和 a[i] 放到同一组。(注意题目是有序的

a[i] 不能和这 L[i] 数一组,并且这 L[i] 个数,也是不能放到同一组的

那么转移。我们考虑 dp[i][j] 可以如何转移?

(1) a[i] 直接一组,那么有 dp[i][j]+=dp[i−1][j−1]

(2) a[i] 和前面的一些数组成一组,前面 [1...i−1] 已经组成了 j 组了。前面 a[i] 可以选择的组数为 j−L[i] 。(L[i] 个数不能和 a[i] 同组,并且这 L[i] 个数都位于不同的组

dp[i][j]+=dp[i−1][j]∗(j−L[i])

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5010,mod = 998244353;
int n, k, r;
int a[N],L[N];
int f[N][N];void slove() {cin >> n >> k >> r;for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 1; i <= n; i++) {L[i] = 0;for (int j = i - 1; j >= 1; j--)if (abs(a[i] - a[j]) < r) {L[i]++;}}for (int i = 0; i <= n + 2; i++)for (int j = 0; j <= n + 2; j++)f[i][j] = 0;f[0][0] = 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {f[i][j] = f[i - 1][j - 1] + ((ll)f[i - 1][j] * (j - L[i])) % mod;f[i][j] %= mod;}}cout << f[n][k] << endl;
}int main(){int tt;cin >> tt;while(tt--){slove();}return 0;
}

二、牛客补题

1、Everyone is bot

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3+10;
vector<int>v;
ll n, m;
ll a[N][N];int slove()
{cin >> n >> m;for(int i = 1; i <= n; i ++)for(int j = 1; j <= n; j ++)cin >> a[i][j];for(int i = 1; i <= n % m; i ++) cout << a[i][i] << " ";for(int i = n % m + 1; i <= n; i ++)cout << 0 << " ";return 0;
}int main(){slove();return 0;
}

2、Maimai DX 2077

题目有点难懂,理解后还是很简单的

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int>v;
const int N = 1;
int n, m ;
double ans1 = 0,ans2 =0,res1 = 0,res2 = 0;
void slove(){int a,b,c,d,e;cin >> a >> b >> c >> d >> e;ans1 += (a * 1.0 + b * 1.0 + c * 0.8 + d * 0.5);ans2 += (a +b + c + d + e) * 1.0;cin >> a >> b >> c >> d >> e;ans1 += (a* 2.0 + b * 2.0 + c * 1.6 + d * 1.0);ans2 += (a +b + c + d + e) * 2.0;cin >> a >> b >> c >> d >> e;ans1 += (a * 3.0 + b * 3.0 + c * 2.4 + d * 1.5);ans2 += (a +b + c + d + e) * 3.0;cin >> a >> b >> c >> d >> e;ans1 += (a* 5.0 + b * 5.0 + c * 2.5 + d * 2.0);ans2 += (a +b + c + d + e) * 5.0;res1 += (a * 1.0 + b * 0.5 + c * 0.4 + d * 0.3);res2 += (a +b + c + d + e) * 1.0;printf("%.10lf\n",ans1 / ans2 * 100 + res1 / res2);}int main(){slove();return 0;
}

3、Here is an Easy Problem of Zero-chan

以为是lca题目,写了好久,直接lca是必然t的,转换思路,如下

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 +10;
const ll mod = 1e13;int n,m;int h[N],e[N*2],ne[N*2],idx;
int depth[N],fa[N];//depth深度数组,fa[i][j]记录i走2^j步后的祖先
int q[N];//数组模拟队列
int tol;
ll sx,sy;
bool st1[N],st2[N];
int a[N],b[N],sa;
int cnt[2][N];
void init(){for(int i = 1; i < N; i ++){int j = i;int s = 0;while(j % 2 == 0){s ++;j /= 2;}cnt[0][i] = s;s = 0;while(j % 5 == 0){s ++;j /= 5;}cnt[1][i] = s;}
}void add(int a,int b){e[++idx] = b, ne[idx] = h[a], h[a] = idx;
}void dfs(int u,int f)//u根节点
{fa[u] = 1;for(int i = h[u]; i; i = ne[i]){int j = e[i];if(j == f) continue;dfs(j,u);fa[u] += fa[j];}
}void dfs1(int u,int f){for(int i = h[u]; i; i = ne[i]){int j = e[i];if(j == f) continue;int te = fa[u] - fa[j];a[j] += a[u] + te * cnt[0][u];b[j] += b[u] + te * cnt[1][u];dfs1(j,u);}
}int main(){scanf("%d %d",&n,&m);init();for(int i = 1; i < n; i ++){int a,b;scanf("%d%d",&a,&b);add(a,b),add(b,a);}dfs(1,0);dfs1(1,0);while(m--){int su;scanf("%d",&su);if(su == 1) puts("0");else{sx = a[su] + fa[su] * cnt[0][su];sy = b[su] + fa[su] * cnt[1][su];printf("%lld\n",min(sx,sy));}   }return 0;
}

4、想要更多的0

dp+二分

数位dp求[l,r]区间内的0的个数,但是因为单个0也算一个0,所以需要check判断

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
int n,m,t,k;int f[20][20];
int a[50];ll dp(int id,int d,int sum,int tag,int lead)
{if(!id) return sum;if(!tag&&lead&&~f[id][sum]) return f[id][sum];ll res=0,maxx=tag?a[id]:9;for(int i=0;i<=maxx;i++){res+=dp(id-1,d,sum+((i||lead)&&(i==d)),tag&&a[id]==i,lead||i);}if(!tag&&lead) f[id][sum]=res;return res;
}int calc(int x,int d)
{memset(f,-1,sizeof f);int cnt=0;while(x) a[++cnt]=x%10,x/=10;return dp(cnt,d,0,1,0);
}int check(int x)
{if(x==0) return calc(n,0)>=k-1;  //x为0时,则只需大于等于k-1,减去单独的0else return calc(n,0)-calc(x-1,0)>=k;}void solve()
{cin>>n>>k;int l=0,r=n;while(l<r){int mid=(l+r+1)>>1;if(check(mid)) l=mid;else r=mid-1;}if(!check(l)) cout<<"-1"<<endl;else cout<<l<<endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);solve();return 0;
}

三、cf补题

1、A. Chip Game

签到题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int>v;int n, m ;
void slove()
{cin>>n>>m;if((n+m)%2 == 0) cout<<"Tonya"<<endl; else cout<<"Burenka"<<endl;
}int main(){int tt;cin >> tt;while(tt--){slove();}return 0;
}

2、B. Mathematical Circus

如果 k 是奇数,一定有合适的方案——将所有奇数作为 ai ,所有偶数作为 bi 。

如果 k 是偶数, k 就不能改变数字的奇偶性。

  • 若 k 是 4 的倍数,则 (ai+k)∗bi≡ai∗bi(mod4) 。这样问题无解。

    • 这是因为,每个奇数只能与 4 的倍数配对,而奇数有 n/2 个, 4 的倍数小于 n/4 个
  • 若 k≡2(mod4) ,合适的方案为:将所有 4 的倍数作为 bi ,与奇数配对,其他偶数作为 ai ,与奇数配对,凑出 n/2 对。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int>v;
int n, m ;
void slove()
{int n, k; cin>>n>>k;if(k%2 == 1){cout<<"YES\n";for(int i=1;i<=n;i+=2) cout<<i<<" "<<i+1<<endl; return;}else{if(k%4 == 2){cout<<"YES\n";for(int i=2;i<=n;i+=2){if(i%4 == 2) cout<<i<<" "<<i-1<<endl;else cout<<i-1<<" "<<i<<endl;}} else cout<<"NO\n";}
}int main(){int tt;cin >> tt;while(tt--){slove();}return 0;
}

三、C. Fighting Tournament

待。。。。。。

明天继续


总结

数位dp,明天学习。这些思维题,需要再多看看,去想想为什么别人能去这么想呢

八月十七日个人训练小结(补题)相关推荐

  1. 林大5.1训练赛补题

    林大5.1训练赛补题 A.凸多边形曼哈顿 E.矩阵快速幂 I.线段dp A.凸多边形曼哈顿 题意:给你一个凸多边形,问你当其中K边形的最大dis[]是多少? 思路:首先是要发现K>=4的时候答案 ...

  2. 1.23山师训练赛补题

    文章目录 C - [The__Flash]的电影 D - [The__Flash]的排序 K - [The__Flash]的牛牛 L - [The__Flash]的鲨鲨 C - [The__Flash ...

  3. 10.23训练赛补题

    A.P1551 亲戚 思路:并查集 AC代码: (并查集暂时不会) #include<iostream> using namespace std; int n, m, p, a[5005] ...

  4. 2021年度训练联盟热身训练赛第三场赛后补题

    2021年度训练联盟热身训练赛第三场赛后补题 A Circuit Math [题目分析] [代码展示] B Diagonal Cut [题目分析] [代码展示] C Gerrymandering [题 ...

  5. 2019/4/2UPC团队训练题解(A,B,E,G,I,K,L)加补题(C,D)

    问题 A: 篮球队选拔 时间限制: 1 Sec  内存限制: 128 MB 提交: 501  解决: 188 [提交] [状态] [命题人:外部导入] 题目描述 云南中医学院坐落于风景秀丽.四季如春的 ...

  6. QLU—新生训练赛002补题

    I.十进制中的二进制 解题方法:直接把给定范围内的有0和1组成的数暴力输出,然后开个数组把这些数放进去,进而在数组中找要求的范围内符合条件的数就行了(一开始做的时候还以为有什么规律...一直在找规律, ...

  7. 2018-2019赛季多校联合新生训练赛第五场补题与题解(中石油)

    总结:这场比赛比的我很迷啊,刚开始一个多小时就a了七道题,然后往后怎么做都做不出来题了...我也不知道为什么,反正比赛途中因为一个题做不出来直接自闭(疯狂锤头),通过这场比赛我发现一件事情:打比赛的时 ...

  8. 备战省赛组队训练赛第一场(补题)E 不存在的泳池

    问题 E: 不存在的泳池时间限制: 1 Sec 内存限制: 128 MB 提交: 553 解决: 239 [提交] [状态] [命题人:外部导入]题目描述小w是云南中医学院的同学,有一天他看到了学校的 ...

  9. 2019 CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题记录

    一篇来自ACM入门者的补题记录 最近有点懒,想着还有最后一篇博客没完成,是我最大的补题动力. 不过终于在camp过去三个月的时候完成了所有的补题博客,有点欣慰,下一个目标应该是补一补一年前暑期训练的题 ...

最新文章

  1. 链表问题15——将搜索二叉树转换成双向链表
  2. python用途与前景-Python的发展前景及干货!!
  3. python menu实例_Python高级进阶#019 pyqt5菜单menu应用,新建多窗体
  4. ML之LiRLassoR:利用boston房价数据集(PCA处理)采用线性回归和Lasso套索回归算法实现房价预测模型评估
  5. 尘锋2021产品发布会圆满落幕,双向赋能引领行业发展
  6. 8-13 刷题 复习 知识点集合
  7. 【2012百度之星/资格赛】H:用户请求中的品牌
  8. [原]win32 rundll32 应用列表
  9. shell进入特权模式_shell的各种运行模式?
  10. JAVA小项目实例源码—学习娱乐小助手
  11. 【IDEA】idea中maven项目Resource目录下的资源文件无法编译
  12. JavaScript之流程控制
  13. JDK GUI对应的c文件
  14. webpack项目使用eslint建立代码规范
  15. C语言图形库——easyx的使用
  16. 【MATLAB】创建网格图和曲面图
  17. 【EXLIBRIS】#小词旮旯#
  18. 【精品】机器学习模型可解释的重要及必要性
  19. Virtualbox如何配置Linux的网络连接
  20. 《人工智能杂记》人工智能简史

热门文章

  1. 先验分布:(三)Dirichlet分布的应用——LDA模型
  2. 诚迈科技携智达诚远出席高通汽车技术与合作峰会
  3. 数字图像处理知识点复习(上)
  4. ReactNative之Image组件自适应高度,图片自适应大小
  5. 支付宝请求签名php,支付宝APP之php后台签名以及验签实现方法
  6. HINSTANCE数据类型
  7. ByteBuffer中的flip()、clear()、compact()
  8. 第 5 章 Resizable(调整大小)组件
  9. Android 仿微信雷达搜索好友
  10. python使用线程解决窗口卡顿问题