Gym.102059: 2018-2019 XIX Open Cup, Grand Prix of Korea(寒假gym自训第一场)
整体来说,这一场的质量比较高,但是题意也有些难懂。
E.Electronic Circuit
题意: 给你N个点,M根线,问它是否是一个合法的电路。
思路: 一个合法的电路,经过一些串联并联关系,最后有一个点是正极,一个是负极,我们就来模拟这个串联的过程即可,并联的关系会因为我们使用了set而抵消,所以可以不去管它。 模拟串联: 我们选择一个度数为2的点,删去它与两边的点u,v的连线,然后连接u-v,知道不存在度数为2的点。 最后当有两个点度数为1,而且不存在度数为大于大于2的点,则合法。
(选择set其实比较巧妙,因为不用考虑并联。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
set<int>S[maxn]; queue<int>q;
int main()
{
int N,M,u,x,y;
scanf("%d%d",&N,&M);
rep(i,,M){
scanf("%d%d",&x,&y);
S[x].insert(y); S[y].insert(x);
}
rep(i,,N) if(S[i].size()==) q.push(i);
while(!q.empty()){
u=q.front(); q.pop();
if(S[u].size()!=) continue;
x=*S[u].begin(); S[u].erase(S[u].begin());
y=*S[u].begin(); S[u].erase(S[u].begin());
S[x].erase(u); S[y].erase(u);
S[x].insert(y); S[y].insert(x);
if(S[x].size()==) q.push(x);
if(S[y].size()==) q.push(y);
}
int cnt=,ok=;
rep(i,,N) {
if(S[i].size()==) cnt++;
if(S[i].size()>) ok=;
}
if(ok&&cnt==) puts("Yes");
else puts("No");
return ;
}
F .Fake Plastic Trees
题意:让你建造一棵树,使得它有N个叶子节点,而且需要满足对于每个节点,它的左子树大小等于右子树大小,或者左子树大小比右边大1。
每次你构造一棵树,你可以选择之前构造过的树作为它的儿子。 现在让你构造不超过125棵树,满足上诉条件。
输出的方式是,输出V,表示构造的树的多少。 接下来V上,每行表示左子树的标号和右子树的编号。 最后输出根节点的标号。
(读了好久才懂了题意,主要是输出这里,我们构造的东西每次都是重复利用了之前的子树的。
思路:每次除2构造即可。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int x[maxn],y[maxn],tot; map<ll,int>mp;
void get(ll num)
{
if(mp.find(num)!=mp.end()) return ;
if(num==1LL) {
x[++tot]=-; y[tot]=-; mp[num]=tot;
return ;
}
ll mid=num/;
get(num-mid); get(mid);
tot++; x[tot]=mp[num-mid]; y[tot]=mp[mid];
mp[num]=tot;
}
int main()
{
int T; ll N;
scanf("%d",&T);
while(T--){
scanf("%lld",&N);
tot=-; mp.clear(); get(N);
printf("%d\n",tot+);
rep(i,,tot) printf("%d %d\n",x[i],y[i]);
printf("%d\n",tot);
}
return ;
}
H .Fractions
题意:求多少对(x,y),满足A<=x<=B ; C<=y<=D,而且(x+y)/gcd(x,y)<1000;
思路:水题,我们枚举化简后的x'=x/gcd; y'=y/gcd;然后看有多少gcd可以在给定区间即可。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int main()
{
ll A,B,C,D,ans=;
scanf("%lld%lld%lld%lld",&A,&B,&C,&D);
rep(i,,)
rep(j,,-i){
if((__gcd(i,j))==){
//A<=ix<=B c<=jx<=D
ll tmp=min(D/j,B/i)-max((A-)/i,(C-)/j);
if(tmp>) ans+=tmp;
}
}
printf("%lld\n",ans);
return ;
}
I .Game on Plane
题意:给定N个点,围成一个圈,每次玩家选择两个点连线,不得与之前连的线相交。 如果玩家连线形成了一个多边形或者没有选的点,输。
思路:sg函数,每次连线会把大圈分为两个小圈,跑sg即可。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int sg[maxn],vis[maxn];
void init()
{
sg[]=; sg[]=;
rep(i,,){
rep(j,,i-){
vis[sg[j]^sg[i--j]]=i;
}
rep(j,,) {
if(vis[j]!=i) { sg[i]=j; break;}
}
}
}
int main()
{
init();
int T,N; scanf("%d",&T);
while(T--){
scanf("%d",&N);
if(!sg[N]) puts("Second");
else puts("First");
}
return ;
}
L .Timsort
题意:给定长度为N的数组a[],Q次询问,每次给出长度L,让你按照规定跑。 每次从当前位置出发,一直跑不降序列,或者下降序列。跑完后,如果大于等于L,从下一个位置继续开始,否则要凑齐长度L,同时累计凑数的个数。
思路:预处理,每次按照规定跑即可,因为我们可以记忆化,所以我们可以假设每次的问题是不一样的,最坏的情况下是N/1+N/2+N/3...+N/N~=NlogN,所以就ok了,想不到这一点,这个水题就跑掉了。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep2(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=;
int a[maxn],R[maxn][],ans[maxn][];
int main()
{
int N,Q,x;
scanf("%d",&N);
rep(i,,N) scanf("%d",&a[i]);
rep2(i,N,) {
R[i][]=R[i][]=;
if(i+<=N&&a[i]<=a[i+]) R[i][]=R[i+][]+;
if(i+<=N&&a[i]>a[i+]) R[i][]=R[i+][]+;
}
scanf("%d",&Q);
while(Q--){
scanf("%d",&x);
if(ans[x][]) printf("%d %d\n",ans[x][],ans[x][]);
else {
int A=,B=;
rep(i,,N){
A++; if(i==N) break;
int t=R[i][a[i]>a[i+]];
if(t<x){
if(i+x-<=N) B+=x-t;
else B+=N-(i+t-);
i=i+x-;
}
else i=i+t-;
}
ans[x][]=A; ans[x][]=B;
printf("%d %d\n",A,B);
}
}
return ;
}
Gym.102059: 2018-2019 XIX Open Cup, Grand Prix of Korea(寒假gym自训第一场)的更多相关文章
- 【GYM 102059】2018-2019 XIX Open Cup, Grand Prix of Korea
vp了一场gym,我又开心地划水了. A. Coloring Roads 题意:给定一棵树,树边一开始都是无色的,每次操作可以把一个点到根的路径染成某个颜色,每次询问当前树上出现过某个次数的颜色种数. ...
- 2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2) GYM 102058 F SG函数
http://codeforces.com/gym/102058/problem/F 题意:平面上n个点 两个人轮流在任意两个点之间连一条线但是不能和已有的线相交,先围成一个凸多边形的获胜,先手赢还 ...
- Gym - 102059D 2018-2019 XIX Open Cup, Grand Prix of Korea D. Dumae 贪心+堆
题面 题意:有3e5个人排成一列,然后Li,Ri表示每个人可以站在[Li,Ri]中的一个,然后M(1e6)个限制条件,某个人一定要在某个人前面,求一种合法方案,无解输出-1 题解:首先可以想到对于限制 ...
- Codeforces gym102058 J. Rising Sun-简单的计算几何+二分 (2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2))
J. Rising Sun time limit per test 1.0 s memory limit per test 1024 MB input standard input output st ...
- 2018-2019 XIX Open Cup, Grand Prix of Korea B - Dev, Please Add This!
B - Dev, Please Add This! 思路: 对于每一个经过 '*' 的横线和竖线看成一个整体,设他们分别为分量x和分量y 用2-sat考虑这个问题, 如果要经过 '*' ,那么x和y至 ...
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Korea
A. Donut 扫描线+线段树. #include<cstdio> #include<algorithm> using namespace std; typedef long ...
- 【推导】【数学期望】【冒泡排序】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem C. Earthquake
题意:两地之间有n条不相交路径,第i条路径由a[i]座桥组成,每座桥有一个损坏概率,让你确定一个对所有桥的检测顺序,使得检测所需的总期望次数最小. 首先,显然检测的时候,是一条路径一条路径地检测,跳跃 ...
- 【线段树】【扫描线】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem A. Donut
题意:平面上n个点,每个点带有一个或正或负的权值,让你在平面上放一个内边长为2l,外边长为2r的正方形框,问你最大能圈出来的权值和是多少? 容易推出,能框到每个点的 框中心 的范围也是一个以该点为中心 ...
- 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest (XXI Open Cup, Grand Prix of Belarus) 题解
题目列表 C. Brave Seekers of Unicorns D. Bank Security Unification G. Biological Software Utilities I. B ...
随机推荐
- android开发环境搭建教程
首先安装jdk,然后下载android studio,双击安装即可. 官网:http://www.android-studio.org/ 直接下载链接:https://dl.google.com/dl ...
- shell历史简介
shell也叫做终端.命令行. shell的基本作用是供用户输入命令.解析用户所输入命令.呈现命令执行结果. shell有多种不同的shell其语法会有差异,这也是严谨的sh文件会在首行以“#!/bi ...
- Android面试优雅地介绍自己的项目
本文转载:m.blog.csdn.net/iamsamzhang/article/details/51916584 先说句题外话,很多公司16年秋招的内推已经开始啦,我目前知道的在北京有网易.百度和微 ...
- !important 的绝对控制样式
<head> <style type="text/css"> div{background-color: blue !important;} </st ...
- Use of undefined constant FTP_BINARY - assumed 'FTP_BINARY
用Laravel中的filesystems里面的ftp上传文件时报错.在windows上开发,文件上传的时候碰到上面的问题,搜了些资料,发现是php7的ftp拓展默认未开启. 第一步:检查extens ...
- javascript 数组函数
声明数组 var tmp=[];//简写模式 var tmp= new Array();//直接new一个 var tmp=array(); //直接new一个 在new数组的时候可以传入一个参数,表 ...
- 人机交互之QQ拼音
随着电脑系统的不断更新,电脑自带的系统输入法也越来越适应广大群众了,那为什么其他的输入法还能占有大量的用户呢? 首先系统输入法是面向大众的,个性化方面略显不足. 其次系统输入法功能不够全面,比如说手写 ...
- day24-python操作数据库四
#!/usr/bin/env python # -*- coding:utf-8 -*- # @time: 2017/11/23 23:10 # Author: caicai # @File: dem ...
- 几种序列化与get、set方法的关系
若get开头且第四个字母是大写的方法中有空指针异常时(无论有没有对应属性) 1.阿里巴巴的FastJson会出现空指针异常,证明与get开头的方法有关 2.Google的Gson不会出现异常,因为只和 ...
- java.util.concurrent ThreadPoolExecutor源码分析
实现的接口:Executor, ExecutorService 子类:ScheduledThreadPoolExecutor 这类为java线程池的管理和创建,其中封装好的线程池模型在Executor ...