Codeforces Round #430 (Div. 2) 总结
来源:互联网 发布:前端框架 知乎 编辑:程序博客网 时间:2024/05/23 15:06
这一场A了4道题…有一道在1:59的时候交上去,没想到A了23333..要不然只有3题加不了多少rating…看来以后我还要多加练习码力,不然..写代码和调代码的时间太长了。
最终排名:rank65,rating+=136,目前rating:1856,离紫名更进一步!
A. Kirill And The Game
题意:给你
5 个整数l,r,x,y,k ,问你是否在l∼r 中存在一个数,在x∼y 中存在一个数,使他们的比值等于k 。
思路&&题解:只要从x∼y 枚举一下,乘k 判断一下是否有一个值存在在l∼r 之间的,有就是Yes ,否则就是No 。
P.S.注意l,r,x,y,k 都是小于等于107 的,所以乘的时候要开longlong 。
代码如下:
#include<bits/stdc++.h>using namespace std;long long a,b,l,r,k; int main() { cin>>a>>b>>l>>r>>k; if(a*k>r) { puts("NO"); return 0; } else if(b*k<l) { puts("NO"); return 0; } for(long long i=l;i<=r;i++) { if(i*k>=a&&i*k<=b) { puts("YES"); return 0; } } puts("NO"); return 0;}
B. Gleb And Pizza
题意:给你一个pizza,以原点为圆心,半径为
r ,r−d 半径内的是没有脆皮的部分,r−d 到r 范围是有脆皮部分,香肠的圆心为(x,y) ,半径为sr ,问有多少个香肠完全在脆皮部分上。
思路&&题解:其实只要判断一下香肠的圆心到原点的距离dis ,然后只用判断dis−sr≥r−d and dis+sr≤r 就行了,如果这个式子成立,那么ans++ 就行了。
代码如下:
#include<bits/stdc++.h>using namespace std;typedef double ll;ll r,d;int tot=0;int t;ll x,y,nr;ll dis(ll a,ll b,ll c,ll d) { return sqrt((a-c)*(a-c)+(b-d)*(b-d));}int main() { cin>>r>>d; d=r-d; cin>>t; while(t--) { cin>>x>>y>>nr; ll dist=dis(0,0,x,y); if(dist-nr>=d&&dist+nr<=r) tot++; } cout<<tot<<endl; return 0;}
C. Ilya And The Tree
题意:有一个树,树上的每个点都有一个权值,对于一个点的魅力值来说,是他到根(即节点
1 )的路径上的所有点权值的最大公约数,对于每个路径上的点,你可以选择唯一点将他变为0 或者不做改变,现在希望你让每个点都获得尽可能大的魅力值,输出每个点的魅力值。
思路&&题解:我的做法非常玄学,玄学到我都不知道怎么证(但他A了…QAQ)就是求所有可能的gcd 值然后存在一个set 里,因为去掉一个数之后,最多有logn 个不同的结果..所以复杂度好像可以接受(雾)于是就这么写了一发..
代码如下:
#include <bits/stdc++.h>using namespace std;const int maxn = 200003;typedef set<int> Set;typedef Set::iterator iter;int n,a[maxn],answer[maxn];vector<int> e[maxn];inline int gcd(int a,int b) { if(a==0) return b; if(b==0) return a; return __gcd(a,b);}void solve(int x,int refer,int g,Set s) { Set ss; int gg=gcd(g,a[x]); ss.insert(g); for(iter i=s.begin();i!=s.end();++i) ss.insert(gcd(*i,a[x])); answer[x]=*(ss.rbegin()); for(int i=0;i<(int)e[x].size();++i) if(e[x][i]!=refer) solve(e[x][i],x,gg,ss);}int main() { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&(a[i])); int u,v; for(int i=1;i<n;++i) { scanf("%d%d",&u,&v); e[u].push_back(v); e[v].push_back(u); } set<int> sss; solve(1,0,0,sss); answer[1]=a[1]; for(int i=1;i<n;++i) printf("%d ",answer[i]); printf("%d\n",answer[n]); return 0;}
D. Vitya and Strange Lesson
题意:给出长度为
n 的非负整数序列,求该序列异或x 以后的mex 值。定义一个数列的mex 为这个数列中没出现的最小的自然数。
思路&&题解:这题就是典型的trie ,并且很多有异或的题都可以通过trie 来写。这题就是把没出现的按二进制搞进一棵trie 里,每次异或的时候在上面跑就行了。
代码如下:
#include <bits/stdc++.h>using namespace std;const int limit=1<<19,limit2=1<<23,tmpxor=1<<20;int n,m,x,p,nowxor;bool vis[limit],previs[limit2];void solve() { for(int j=19;j>=0;--j) { int tmp=1<<j; nowxor&tmp?(p=(previs[p*2+1]?p*2+1:p*2)):(p=(previs[p*2]?p*2:p*2+1)); }}void build(int x) { if(x==limit) return; if(!vis[x]) { p=1; for(int j=19;j>=0;--j) { p<<=1; if(x&(1<<j)) p|=1; previs[p]=true; } } build(x+1);}int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) { scanf("%d",&x); vis[x]=true; } build(0); nowxor=0; for(int i=1;i<=m;++i) { scanf("%d",&x); nowxor^=x; p=1; solve(); int ans=p^tmpxor^nowxor; println(ans); } return 0;}
- Codeforces Round #430 (Div. 2) 总结
- Codeforces Round #430 (Div. 2)
- Codeforces Round #430 (Div. 2)
- Codeforces Round #430 (Div. 2)
- Codeforces Round #430 (Div. 2)
- Codeforces Round #430 (Div. 2)
- Codeforces Round #430 (Div. 2)
- Codeforces Round #430 (Div. 2)
- Codeforces Round #161 (Div. 2)总结
- Codeforces Round #162 (Div. 2)总结
- Codeforces Round #170 (Div. 2)总结
- Codeforces Round #171 (Div. 2)总结
- Codeforces Round #172 (Div. 2)总结
- Codeforces Round #173 (Div. 2)总结
- Codeforces Round #176 (Div. 2)总结
- Codeforces Round #185 (Div. 2) 总结
- Codeforces Round #187 (Div. 2) 总结
- Codeforces Round #190 (Div. 2) 总结
- leetcode-145-LRU cache
- 通过超链接进入到另一个页面执行js
- Linux下命令行音乐播放器
- java中分布式架构的演变和介绍
- jquery 控制下拉列表
- Codeforces Round #430 (Div. 2) 总结
- 韩信点兵算法
- Python初学——窗口视窗Tkinter
- Ubuntu 中apt update和upgrade 的区别
- 似然函数
- PHP laravel系列之数据库
- mysql性能优化-慢查询分析、优化索引和配置
- 分布交互式CosiMate 8.1 2016.04多学科协同仿真计算平台
- 九大排序算法