2019年CCSU训练赛一(A到L题解)
因为一些原因题解迟到了,以后我争取当天或次日就搞定
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题解)相关推荐
- UPC-2021个人训练赛第20场-部分题解
目录 RGB Triplets 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 Select Half 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 心灵的抚 ...
- 2022年寒假训练赛(2020级)题解
文章目录 出题人 A<关于508的门老是被反锁这件事> 思路 AC代码 B 昆虫关系 思路1:带权并查集 AC代码 思路2:种类并查集 AC代码2 思路3:二分图染色 AC代码3 C 谁输 ...
- 【2019杭电多校训练赛】HDU6681 / 1002-Rikka with Cake 题解(扫描线)
[2019杭电多校训练赛]HDU6681 / 1002-Rikka with Cake 题解 题意 思路 代码 题目来自于:HDU6681 Rikka with Cake 题意 题目的大意是给定你一个 ...
- bistuacm 2019年第⑦场新生训练赛题解
比赛链接:bistuacm 新生训练赛 第七场 难度:cf 900~1400 A 知识点:枚举 题意:寻找距离数组某个数最接近的a[i]<=k且b[i]=1的数. 解法:按题意模拟即可. #in ...
- 2019年Robomaster江苏省赛总结
2019年RM江苏省赛总结 文章目录 2019年RM江苏省赛总结 一 场地 二 调试工具 无线键鼠+小显示屏 2.4G连接 有线键鼠+大显示屏 putty+Xming实现笔记本的图形界面显示 VNC+ ...
- 中国石油大学ACM俱乐部开放训练赛
文章目录 中国石油大学ACM俱乐部开放训练赛 A. sciorz画画(凸多边形最优三角型剖分,区间DP) B. 奎奎发红包(贪心) C. 关于我转生变成史莱姆这档事(DFS) F. 求和(矩阵构造+矩 ...
- 2019燕山大学程序设计新生赛(二)
2019燕山大学程序设计新生赛(二) 绝地武士 参考代码 织梦岛 参考代码 谍战风云 参考代码 绝地武士 天赋异禀的绝地武士安纳金·天行者受西斯大帝达斯·西迪厄斯蛊惑,堕入原力黑暗面,随后被派去绝地圣 ...
- 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FFT)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FF ...
- ACM训练赛--递推专题
1001: Buy the Ticket Problem Description The "Harry Potter and the Goblet of Fire" will be ...
最新文章
- archlinux常用的包管理器
- Anaconda入门使用指南(一)
- 从某次测试过程中,得到的MySQL性能优化的建议,和定位问题的方法
- XCode环境变量及路径设置
- 【2012百度之星/资格赛】E:C++ 与Java
- SAP云平台开启Kyma功能时发送到后台的HTTP请求
- LVM逻辑卷,RAID磁盘阵列
- Activiti 监听器的配置使用
- CSS3 Flex布局弹性容器的属性
- sqlite 复合唯一索引_SQLite 索引(Index)
- Spring MVC JSR-303验证框架之Hibernate-Validator
- 创建一个优质可用的Hyper-V虚拟机模板
- Pytorch学习笔记总结
- DateFormat与SimpleDateFormat区别和使用详解
- 通达信交易接口分时做T的指标公式分享
- C# 关于winFrom控制网页的自动登录的问题(网页刷屏器的制作原理)
- PHP中使用gRPC客户端
- macbook卡在进度条开不了机_mac开机卡在进度条的问题
- JavaScript工具类:util.js用法实例
- 直播+迎来重磅炸弹,网易推出音乐+直播服务look直播,直播+是大趋势