因为一些原因题解迟到了,以后我争取当天或次日就搞定

A - A

CodeForces - 1027D

读完发现这题跟牛客练习赛41C题差不多啊,于是想了一下并查集但没什么思路

考虑到存在u->v的边那么u就不需要选择,但是当路径构成环的时候,我们只需

要取环上最小值就可以了。

 1 #define IO std::ios::sync_with_stdio(false);
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 typedef long long ll;
 5 typedef double db;
 6 int n;
 7 ll a[200005],g[200005],vis[200005];
 8 ll ans=0;
 9 ll mi,id;
10 void dfs(int u){
11     if(vis[u]){
12         id=u;
13         mi=a[u];
14         return;
15     }
16     vis[u]=1;
17     dfs(g[u]);
18     if(id==u)ans+=mi;
19     else mi=min(mi,a[u]);
20 }
21 int main(){
22     IO;
23     cin>>n;
24     for(int i=1;i<=n;i++)cin>>a[i];
25     for(int i=1;i<=n;i++)cin>>g[i];
26     for(int i=1;i<=n;i++){
27         if(!vis[i])dfs(i);
28     }
29     cout<<ans<<endl;
30 }

B - B

CodeForces - 1027B

有点恶心的水题,分情况讨论即可
 1 #define IO std::ios::sync_with_stdio(false);
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 typedef long long ll;
 5 typedef double db;
 6 ll n,q,x,y;
 7 int main(){
 8     IO;
 9     cin>>n>>q;
10     while(q--){
11         cin>>x>>y;
12         ll k=n*n/2;
13         if(n%2)k++;
14         if(n%2){
15             if((x+y)%2){
16                 if(x%2){
17                     ll h=(x-1)*n/2;
18                     h+=y/2;
19                     cout<<h+k<<endl;
20                 }
21                 else{
22                     ll h=(x-2)*n/2+n/2;
23                     h+=y/2+1;
24                     cout<<h+k<<endl;
25                 }
26             }
27             else{
28                 if(x%2){
29                     ll h=(x-1)*n/2;
30                     h+=y/2+1;
31                     cout<<h<<endl;
32                 }
33                 else{
34                     ll h=(x-2)*n/2+n/2+1;
35                     h+=y/2;
36                     cout<<h<<endl;
37                 }
38             }
39         }
40         else{
41             ll h=(x-1)*n/2;
42             if((x+y)%2){
43                 if(x%2)h+=y/2;
44                 else h+=y/2+1;
45                 cout<<h+k<<endl;
46             }
47             else{
48                 if(x%2)h+=y/2+1;
49                 else h+=y/2;
50                 cout<<h<<endl;
51             }
52         }
53     }
54 }

C - C

CodeForces - 1027C

设长为x,宽为y,现在要使p^2/s=4(x+y)^2/(x*y)=4(x/y+y/x)最小

显然当x与y差最小的时候原式最小,当x==y时也就是有一个数的出现了4次以上时

直接输出就好,其余情况我们可以先筛出现2次以上的数然后用double算一下更新答案

 1 #define IO std::ios::sync_with_stdio(false);
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 typedef long double ldb;
 5 typedef long long ll;
 6 typedef double db;
 7 int T,n;
 8 ll a[1000005],c[10005],b[10005];
 9 int main(){
10     IO;
11     cin>>T;
12     while(T--){
13         cin>>n;
14         memset(b,0,sizeof(b));
15         int v=0;
16         for(int i=1;i<=n;i++){
17             cin>>a[i];
18             b[a[i]]++;
19             if(b[a[i]]>=4&&!v){
20                 v=a[i];
21             }
22         }
23         if(v){
24             for(int i=1;i<=4;i++){
25                 cout<<v<<" ";
26             }
27             continue;
28         }
29         sort(a+1,a+1+n);
30         int h=unique(a+1,a+1+n)-a-1;
31         ll x,y,id;
32         int cnt=0;
33         for(int i=1;i<=h;i++){
34             if(b[a[i]]>=2)c[++cnt]=a[i];
35         }
36         db res=1e18;
37         for(int i=1;i<cnt;i++){
38             db k=(db)c[i]/c[i+1]+(db)c[i+1]/c[i];
39             if(k<res){
40                 res=k;
41                 x=c[i];
42                 y=c[i+1];
43             }
44         }
45         cout<<x<<" "<<x<<" "<<y<<" "<<y<<endl;
46     }
47 }

D - D

CodeForces - 1027A

显然当差为2或0时可以转换,其余都不可以

 1 #define IO std::ios::sync_with_stdio(false);
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 typedef long long ll;
 5 typedef double db;
 6 int T,n;
 7 char s[1005];
 8 int main(){
 9     IO;
10     cin>>T;
11     while(T--){
12         cin>>n;
13         cin>>s+1;
14         int flag=0;
15         for(int i=1;i<=n/2;i++){
16             int h=abs(s[i]-s[n-i+1]);
17             if(h>2||h==1){
18                 flag=1;
19                 break;
20             }
21         }
22         if(flag)cout<<"NO"<<endl;
23         else cout<<"YES"<<endl;
24     }
25 }

E - E

CSU - 1022

送分题,从上到下dp取最大,应该没有比这还简单的dp了。。。代码不写了(随便写都能过)

F - F

CSU - 1219

看到数据n<=100,直接枚举每个点跑最短路就完事了,代码略

G - G

CSU - 1104

这题我当时在纸上博弈发现n=1,3,7时先手必败,

发现当n为2^k-1时必输,其余情况先手必胜。

后来发现好多人都是直接看n的奇偶性。。。

然后还全过了。。。。。

然后就有人发现return 0就可以ac。。。

最后发现E,F也是这样。。。

所以中南oj管理员删库跑路了?

H - H

CodeForces - 444C

本场最难的题,用到了xls最喜欢的线段树,罗总的题解写得很好,大家可以看一下

https://www.cnblogs.com/luowentao/p/10443364.html

I - I

HDU - 5804

仔细读题发现只要当前钱数大于商品价格总和就一定可以满足要求

 1 #define IO std::ios::sync_with_stdio(false);
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 typedef long long ll;
 5 int T;
 6 int n,m;
 7 ll x;
 8 ll a[100005];
 9 int b[100005];
10 int main(){
11     IO;
12     cin>>T;
13     while(T--){
14         cin>>n>>m;
15         ll res=0;
16         for(int i=1;i<=n;i++){
17             cin>>x;
18             res+=x;
19         }
20         int cnt=0;
21         while(m--){
22             cin>>x;
23             if(x>res)b[++cnt]=1;
24             else b[++cnt]=0;
25         }
26         for(int i=1;i<=cnt;i++){
27             cout<<b[i];
28         }
29         cout<<endl;
30     }
31 }

J - J

HDU - 5805

一开始都错题以为拿出数会拿很多轮然后感觉不可做,后来发现只有一轮。。。

那么我们可以单独考虑拿第一个数和最后一个数的期望,

然后预处理出相隔两个数的差的前缀和以及后缀和

最后再取最大值加入到答案里就ok

 1 #define IO std::ios::sync_with_stdio(false);
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 typedef long long ll;
 5 typedef double db;
 6 int T,n;
 7 int a[100005],b[100005],c[100005];
 8 int main(){
 9     IO;
10     cin>>T;
11     while(T--){
12         cin>>n;
13         for(int i=1;i<=n;i++){
14             cin>>a[i];
15             b[i]=c[i]=0;
16         }
17         for(int i=2;i<=n;i++){
18             b[i]=max(b[i-1],abs(a[i]-a[i-1]));
19         }
20         for(int i=n-1;i>=1;i--){
21             c[i]=max(c[i+1],abs(a[i]-a[i+1]));
22         }
23         ll ans=b[n-1]+c[2];
24         for(int i=2;i<n;i++){
25             int h=max(b[i-1],c[i+1]);
26             ans+=max(abs(a[i-1]-a[i+1]),h);
27         }
28         cout<<ans<<endl;
29     }
30 }

K - k

HDU - 5806

首先求出>=m的数的个数的前缀和,然后计算以i为起点的序列的个数

直接枚举会超时,考虑到前缀和肯定是单调递增的,那么我们二分查找刚好有k个数>=m的位置h,

那么以第h到第n之间的数结尾的都是满足条件的序列。

 1 #define IO std::ios::sync_with_stdio(false);
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 typedef long long ll;
 5 typedef double db;
 6 int T,n,m,k;
 7 int a[200005],b[200005];
 8 int main(){
 9     IO;
10     cin>>T;
11     while(T--){
12         cin>>n>>m>>k;
13         for(int i=1;i<=n;i++){
14             cin>>a[i];
15             b[i]=b[i-1];
16             if(a[i]>=m)b[i]++;
17         }
18         ll ans=0;
19         for(int i=1;i<=n-k+1;i++){
20             int x=b[i-1];
21             if(x+k>b[n])break;
22             int h=lower_bound(b+i,b+1+n,k+x)-b;
23             ans+=n-h+1;
24         }
25         cout<<ans<<endl;
26     }
27 }

L - L

HDU - 5807

本场第二难得题,看网上题解才补出来,用到了分段式dp,d[i][j][k][p]表示三个人分别在i,j,k城得时候第p个人准备移动时得方案数

为什么从后往前dp呢?这道题没有初始状态因为题目里说了每个边u->v都有v>=u,那么最后当所有人都在n城就是一个确定的最终状态,

由此我们可以从后往前转移状态,时间复杂度n^4。

 1 #define IO std::ios::sync_with_stdio(false);
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 typedef long long ll;
 5 typedef double db;
 6 const int N=55;
 7 ll mod=998244353;
 8 ll T,n,m,h,q,x,y,z;
 9 ll d[N][N][N][4];
10 ll w[N],g[N][N];
11 void add(ll &x,ll y){
12     x=(x+y)%mod;
13 }
14 int main(){
15     IO;
16     cin>>T;
17     while(T--){
18         memset(g,0,sizeof(g));
19         memset(d,0,sizeof(d));
20         cin>>n>>m>>h>>q;
21         for(int i=1;i<=n;i++)cin>>w[i];
22         for(int i=1;i<=m;i++){
23             cin>>x>>y;
24             g[x][y]=1;
25         }
26         for(int i=n;i>=1;i--){
27             for(int j=n;j>=1;j--){
28                 for(int k=n;k>=1;k--){
29                     if(abs(w[i]-w[j])<=h&&abs(w[i]-w[k])<=h&&abs(w[j]-w[k])<=h){
30                         add(d[i][j][k][1],1);
31                     }
32                     else d[i][j][k][1]=0;
33                     if(d[i][j][k][1]){
34                         for(int z=1;z<i;z++){
35                             if(g[z][i])add(d[z][j][k][3],d[i][j][k][1]);
36                         }
37                     }
38                     if(d[i][j][k][2]){
39                         for(int z=1;z<j;z++){
40                             if(g[z][j])add(d[i][z][k][1],d[i][j][k][2]);
41                         }
42                     }
43                     if(d[i][j][k][3]){
44                         for(int z=1;z<k;z++){
45                             if(g[z][k])add(d[i][j][z][2],d[i][j][k][3]);
46                         }
47                     }
48                 }
49             }
50         }
51         while(q--){
52             cin>>x>>y>>z;
53             cout<<d[x][y][z][1]<<endl;
54         }
55     }
56 }

转载于:https://www.cnblogs.com/ccsu-kid/p/10478446.html

2019年CCSU训练赛一(A到L题解)相关推荐

  1. UPC-2021个人训练赛第20场-部分题解

    目录 RGB Triplets 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 Select Half 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 心灵的抚 ...

  2. 2022年寒假训练赛(2020级)题解

    文章目录 出题人 A<关于508的门老是被反锁这件事> 思路 AC代码 B 昆虫关系 思路1:带权并查集 AC代码 思路2:种类并查集 AC代码2 思路3:二分图染色 AC代码3 C 谁输 ...

  3. 【2019杭电多校训练赛】HDU6681 / 1002-Rikka with Cake 题解(扫描线)

    [2019杭电多校训练赛]HDU6681 / 1002-Rikka with Cake 题解 题意 思路 代码 题目来自于:HDU6681 Rikka with Cake 题意 题目的大意是给定你一个 ...

  4. bistuacm 2019年第⑦场新生训练赛题解

    比赛链接:bistuacm 新生训练赛 第七场 难度:cf 900~1400 A 知识点:枚举 题意:寻找距离数组某个数最接近的a[i]<=k且b[i]=1的数. 解法:按题意模拟即可. #in ...

  5. 2019年Robomaster江苏省赛总结

    2019年RM江苏省赛总结 文章目录 2019年RM江苏省赛总结 一 场地 二 调试工具 无线键鼠+小显示屏 2.4G连接 有线键鼠+大显示屏 putty+Xming实现笔记本的图形界面显示 VNC+ ...

  6. 中国石油大学ACM俱乐部开放训练赛

    文章目录 中国石油大学ACM俱乐部开放训练赛 A. sciorz画画(凸多边形最优三角型剖分,区间DP) B. 奎奎发红包(贪心) C. 关于我转生变成史莱姆这档事(DFS) F. 求和(矩阵构造+矩 ...

  7. 2019燕山大学程序设计新生赛(二)

    2019燕山大学程序设计新生赛(二) 绝地武士 参考代码 织梦岛 参考代码 谍战风云 参考代码 绝地武士 天赋异禀的绝地武士安纳金·天行者受西斯大帝达斯·西迪厄斯蛊惑,堕入原力黑暗面,随后被派去绝地圣 ...

  8. 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FFT)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FF ...

  9. ACM训练赛--递推专题

    1001: Buy the Ticket Problem Description The "Harry Potter and the Goblet of Fire" will be ...

最新文章

  1. archlinux常用的包管理器
  2. Anaconda入门使用指南(一)
  3. 从某次测试过程中,得到的MySQL性能优化的建议,和定位问题的方法
  4. XCode环境变量及路径设置
  5. 【2012百度之星/资格赛】E:C++ 与Java
  6. SAP云平台开启Kyma功能时发送到后台的HTTP请求
  7. LVM逻辑卷,RAID磁盘阵列
  8. Activiti 监听器的配置使用
  9. CSS3 Flex布局弹性容器的属性
  10. sqlite 复合唯一索引_SQLite 索引(Index)
  11. Spring MVC JSR-303验证框架之Hibernate-Validator
  12. 创建一个优质可用的Hyper-V虚拟机模板
  13. Pytorch学习笔记总结
  14. DateFormat与SimpleDateFormat区别和使用详解
  15. 通达信交易接口分时做T的指标公式分享
  16. C# 关于winFrom控制网页的自动登录的问题(网页刷屏器的制作原理)
  17. PHP中使用gRPC客户端
  18. macbook卡在进度条开不了机_mac开机卡在进度条的问题
  19. JavaScript工具类:util.js用法实例
  20. 直播+迎来重磅炸弹,网易推出音乐+直播服务look直播,直播+是大趋势

热门文章

  1. GRE隧道是什么?他的作用是什么?
  2. mybaits的原理和应用
  3. 【Golang】Golang基本介绍
  4. 基于Jquery编写的背单词app
  5. 8K 视频 采集、压缩编码、传输、显示系统总结
  6. 新浪微博面试(2018.4.29)
  7. openGauss安全(下)
  8. css给图片设置阴影效果
  9. 虚幻与Unity引擎 之 ✨ 为什么国内那么多开发者喜欢用虚幻或者Unity?
  10. 文本数据的传统特征提取方法