Solved Pro.ID Title Ratio(Accepted / Submitted)
1001 Calculus 23.59%(852/3611) (数学,签到,结论)
1002 Kanade Loves Maze Designing 35.26%(880/2496) (暴力,dfs树)
1003 Cycle Binary 27.94%(19/68)
1004 Display Substring 17.73%(187/1055)
1005 Didn’t I Say to Make My Abilities Average in the Next Life?! 14.62%(63/431)
1006 Directed Minimum Spanning Tree 22.22%(6/27)
1007 Increasing Subsequence 9.72%(35/360)
1008 Lawn of the Dead 18.41%(405/2200) (线段树×, 模拟大法好√)
1009 License Plate Recognition 30.21%(819/2711) (暴力,模拟)
1010 Pony Running 52.63%(10/19)
1011 Travel on Tree 3.81%(11/289)

1001 Calculus 23.59%(852/3611)

题意:

  • 给出一个字符串s表示f(x), f(x)仅由8种基本函数相加构成,记S(x)为f(1)+f(2)+…+f(x),求判断S(x)趋向于∞时是否收敛。

思路:

  • 注意到题中所给的所有函数均为发散。所以只需要检查是否所有的构成函数的系数均为 0 即可。
#include<bits/stdc++.h>
using namespace std;
int main(){int T;  cin>>T;while(T--){string s;  cin>>s;int ok = 1;for(char ch : s){if(ok){if(ch=='0')ok=0;else break;}if(ch=='+')ok = 1;}if(ok==0)cout<<"YES\n";else cout<<"NO\n";}return 0;
}

1002 Kanade Loves Maze Designing 35.26%(880/2496)

题意:

  • 给出一棵n个点的树,每个点有权值ci,记A(i,j)表示点i和j之间路径上的不同权值个数,求f(i,x)=∑(j=1->n) A(i,j)*x^{j−1},x=19560929, mod1=1e9+7, mod2=1e9+9.

思路:

  • 因为n<2e3,可以n^2做,所以直接dfs暴力把所有的a[i][j] 枚举出来即可,O(n)枚举每个点,对于每个点dfs到其他所有点跑一遍O(n), 递归的时候开个数组记录路径上的不同权值个数,回溯的时候减掉即可。
  • 对于最后的取模运算,因为多组数据所以可以提前预处理。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;LL a[2020][2020], c[2020];
vector<int>G[2020];int rt, cnt, ma[2020];
void dfs(int x, int fa){if(ma[c[x]]==0)cnt++;ma[c[x]]++; a[rt][x] = cnt;for(int to : G[x]){if(to!=fa)dfs(to,x);}ma[c[x]]--;if(ma[c[x]]==0)cnt--;
}const LL p1=1e9+7, p2=1e9+9;
LL pow2(LL a,LL b,LL mod){LL r=1;while(b){if(b&1)r=r*a%mod;a=a*a%mod;b>>=1;}return r%mod;}
LL x=19560929;
LL xa[2005],xb[2005];int main(){    for(int i=0;i<=2000;i++)xa[i]=pow2(x,i,1e9+7),xb[i]=pow2(x,i,1e9+9);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;  cin>>T;while(T--){int n;  cin>>n;for(int i = 1; i <= n; i++)G[i].clear();//initfor(int i = 2; i <= n; i++){int x;  cin>>x;G[i].push_back(x); G[x].push_back(i);}for(int i = 1; i <= n; i++)cin>>c[i];for(int i = 1; i <= n; i++){rt = i;  dfs(i,0);}for(int i = 1; i <= n; i++){LL ans1 = 0, ans2 = 0;for(int j = 1; j <= n; j++){ans1 = ((ans1+a[i][j]*xa[j-1]%p1)%p1+p1)%p1;ans2 = ((ans2+a[i][j]*xb[j-1]%p2)%p2+p2)%p2;}cout<<ans1<<" "<<ans2<<"\n";}}return 0;
}

1009 License Plate Recognition 30.21%(819/2711)

题意:

  • 给出一个30*100的图案,包括1个中文字符和6个英文数字字符,求每个字符的左右边界。

思路:

  • 将所有字符垂直投影到一维空间,有符号的记为1,没符号的记为0,然后寻找每个字符对应的左右边界即可。
  • 根据图像可以发现,所有数字和字符一定是连续的,但是汉字不一定,如"川"、“鄂”。解决方法是从右向左先找数字和英文字母的对应区间,剩下的即为汉字。
#include<bits/stdc++.h>
using namespace std;
int cc[110], anl[10], anr[10];
int main(){int T;  cin>>T;for(int _w=1; _w <= T; _w++){memset(cc,0,sizeof(cc));for(int i = 1; i <= 30; i++){string s;  cin>>s;for(int j = 0; j < 100; j++)if(s[j]=='#')cc[j+1]++;}int p = 100;for(int i = 7; i >= 2; i--){while(p>=1 && !cc[p])p--;  anr[i]=p;while(p>=1 && cc[p])p--;  anl[i]=p+1;}while(p>=1 && !cc[p])p--;  anr[1]=p;p=1; while(p<=100 && !cc[p])p++;  anl[1]=p;cout<<"Case #"<<_w<<":\n";for(int i = 1; i <= 7; i++)cout<<anl[i]<<" "<<anr[i]<<"\n";}return 0;
}

1008 Lawn of the Dead 18.41%(405/2200)

题意:

  • 给出n*m的地图,k个地雷的坐标,从(1,1)出发,只能向下或向右走,求能走到多少个点。

思路1:

  • 考虑所有点的个数减去不能到达的点的个数,根据题意,有地雷的地方是不可以到达的。由于僵尸只会向右和向下走,当某个点的左边和上方都不可达时,该点不可达,并会对自己右边的点和下方的点造成影响
  • 由于空间很大但地雷数有限,可以从上往下逐行对每一行的地雷排序后进行处理。对每个地雷,找到从自己的右上角点(x-1, y+1) 开始的从左往右的连续不可达区域的范围,那么这行的这个范围也不可达。可以用线段树来实现区间查询和区间覆盖。每一行处理完后查询该行不可达的点数,累加后用总点数减即得到答案。

思路2:

  • 考虑直接计算能到达的点的个数,对于一行一段连续的区间,什么情况下我们才能走这段区间的点呢?可以发现,只要上面一段区间与当前判断区间有交集,那么我就能从上面那段区间下来,访问下面区间上的点。
  • 即对于当前区间找到上一行中与当前区间有交集的区间,①如果找不到,那么这段区间访问不到。②如果找到了,左端点取一个最大值(与上一行的交集区间),然后右端点就是原判定区间的右端点,(因为只能往下或往右走,所以此时左端点处不相交的部分就走不到了,但是右边是可以的),,保存这段区间,以便进行下一行的判断。可以直接二分求得上一行区间左端点恰好大于当前判定区间左端点的那个区间。
  • 这样的话,我们就能得到这样一条思路:①首先特判第一行,保存第一段可行区间②每一行都保存这一行的地雷坐标(注意是按行保存),最后每行再加入一个m + 1列的地雷以便判断最后一段区间③然后我们枚举行数,每次判断两个地雷之间的地雷即可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e5+10;
const int inf = 1e9+7;vector<int>a[maxn];//保存每一行的地雷位置
struct node{int l, r;node(int l=0,int r=0):l(l),r(r){}};
vector<node>ok; //保存上一行的可行区间
bool check(node a, int l, int r){if(a.l<=l)return a.r>=l;else if(a.l<=r)return 1;else return 0;
}
int calc(int st, int ed){int l =0, r=ok.size()-1, ans=ok.size()-1;while(l <= r){//二分到ans区间恰好在[st,ed]附近的int mid= (l+r)/2;if(ok[mid].l <= st)l=mid+1;//找anl>st的else r=mid-1,ans=r; }int res=inf, tmp=st;for(int i=ans-5; i <= ans+5; i++){//枚举前后区间if(i<0 || i>=ok.size())continue;if(check(ok[i],st,ed)){//判断是否有交集tmp = max(tmp, ok[i].l);//与上一行的交集区间的左端点res = min(res, tmp);//所有左端点里取最靠左的(能走的更多)}}return res==inf?-1:res;
}int main(){ios::sync_with_stdio(0);int T;  cin>>T;while(T--){int n, m, k;  cin>>n>>m>>k;for(int i =1; i<=n; i++)a[i].clear();for(int i =1; i<=k; i++){int x, y;  cin>>x>>y;a[x].push_back(y);}for(int i=1; i <=n; i++){a[i].push_back(m+1);sort(a[i].begin(),a[i].end());}ok.clear();ok.push_back(node(1,a[1][0]-1));LL ans = ok[0].r-ok[0].l+1, st = 1;//当前左端点for(int i = 2; i <= n; i++){vector<node>cur;st = 1;for(int j = 0; j < a[i].size(); j++){int ed = a[i][j];//当前右端点if(st >= ed){st = ed+1; continue;}//得到一个区间int st2=calc(st, ed-1);//如果有交集,返回新的左端点if(st2 == -1){st = ed+1; continue;}//没有交集,找下一个区间cur.push_back(node(st2,ed-1));//有交集,那么新的现在可以走的区间ans += ed-st2;//更新答案st = ed+1;}ok = cur;}cout<<ans<<"\n";}return 0;
}

【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(4)签到题4题相关推荐

  1. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(3)签到题3题

    2021"MINIEYE杯"中国大学生算法设计超级联赛(3) Start Time : 2021-07-27 12:00:00 End Time : 2021-07-27 17:0 ...

  2. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(1)签到题15869

    2021"MINIEYE杯"中国大学生算法设计超级联赛(1) Start Time : 2021-07-20 12:10:00 End Time : 2021-07-20 17:1 ...

  3. 7068 Dota2 Pro Circuit 杭电多校(2021“MINIEYE杯”中国大学生算法设计超级联赛9) [贪心+双指针]

    题目 Dota2 Pro Circuit *Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Oth ...

  4. 2021“MINIEYE杯”中国大学生算法设计超级联赛

    2021"MINIEYE杯"中国大学生算法设计超级联赛 1006 Given a sequence of integers of length n, find the shorte ...

  5. 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)

    2021"MINIEYE杯"中国大学生算法设计超级联赛(2) 1008 I love exam (类背包DP) 1010 I love permutation (数学构造,剩余系) ...

  6. 2021“MINIEYE杯”中国大学生算法设计超级联赛(1)个人解题报告

    文章目录 HDU6950 Mod, Or and Everything HDU6954 Minimum spanning tree HDU6958 KD-Graph HDU6957 Maximal s ...

  7. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(10)签到题2题

    Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Pty loves sequence 25.00%(52/208) 1002 Pty with ...

  8. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(9)签到题4题

    Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 NJU emulator 23.27%(37/159) 1002 Just another b ...

  9. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(8)签到题5题

    Current Server Time : 2021-08-12 17:17:29 Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 X-lik ...

  10. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(7)签到题5题

    Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Fall with Fake Problem 3.45%(3/87) 1002 Fall wi ...

最新文章

  1. 利用Windows自带服务架设免费邮件服务器
  2. OSChina 周一乱弹 —— 程序员进阶之路
  3. golang安装:GOPATH环境变量无需配置说明(>1.13)
  4. 七、Vue cli详解学习笔记——什么是Vue cli ,Vue cli的使用(安装,拉取2.x模板,初始化项目),Vue cli2详解,Runtime-Compiler和Runtime-only区别
  5. 8086CPU的8位寄存器数据存储情况
  6. 判断一颗二叉树是否是二叉排序树
  7. devops 解决了啥问题_您的DevOps有什么问题?
  8. 吴恩达《卷积神经网络》
  9. python多组输入第一行第一组t组表示有t组数据_python3的输入方式及多组输入方法...
  10. 爬虫中无头浏览器如何选择
  11. html表格序号自动增加
  12. android 打开默认浏览器,Android调用系统自带浏览器打开网页的实现方法
  13. linux的pending状态怎么退出,状态pending是什么意思
  14. u盘启动计算机的几种方式,U盘各种启动模式方法介绍 六种U盘启动模式
  15. 茄子快传和腾讯全民Wifi配合使用
  16. EasyUI项目之门户(添加查询购物车与清空购物车)
  17. 写作分册王诚pdf_后王诚时代|老铁们,管综写作还能跟谁?
  18. Linux、Windows、Mac非root普通用户使用秘钥免密SSH登录
  19. java三元运算符用的多不多_Java多个三元运算符
  20. python前面三个大于号是啥_在Python3里有的变量前面有个*号,是什么意思?

热门文章

  1. 生成式模型(generative) vs 判别式模型(discriminative)
  2. 概率图模型(PGM) —— 贝叶斯网络(Bayesian Network)
  3. Matlab Tricks(十一)—— padarray 关于边缘成镜像对称
  4. 布尔运算(Boolean Operations)
  5. Trick(十二)——统计 label(序列)各个标签值出现的次数以及出现次数最多的标签
  6. 私有成员变量理解的补充
  7. incrby redis 最大值_Redis 的 8 大数据类型,写得非常好!
  8. 为什么都建议学java而不是python-为什么java比python复杂,还是有很多人选择学习java?...
  9. python怎么读程序-python 怎么念
  10. python是什么意思-python是什么意思