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 ...
随机推荐
- vul/0day/shellcode/payload/poc/exp
vul--泛指漏洞 0day--未公开或虽已公开但还没有修复方法的漏洞 shellcode--远程溢出后执行的那段代码 payload--攻击载荷,送到远端机器执行的整段代码 poc--Proof o ...
- 简述Spring容器与SpringMVC的容器的联系与区别
简述Spring容器与SpringMVC的容器的联系与区别 2017年07月04日 10:55:07 阅读数:6260 摘要: 在Spring整体框架的核心概念中,容器的核心思想是管理Bean的整个生 ...
- 使用Swagger2构建强大的RESTful API文档(2)(二十三)
添加文档内容 在完成了上述配置后,其实已经可以生产文档内容,但是这样的文档主要针对请求本身,而描述主要来源于函数等命名产生,对用户并不友好,我们通常需要自己增加一些说明来丰富文档内容.如下所示,我们通 ...
- js如何简单实现汉字转成拼音的功能
最近项目需要一个功能,实现汉字转拼音功能,具体比如说输入一个“你好”,同时带出对应拼音“NiHao”,在此做一下记录 1.首先引入两个文件 <script src="jquery.mi ...
- 学习笔记-AngularJs(五)
之前的页面太丑了,后来我引入了bootstrap.css,把样式进行修了一番,如下图(一不小心,插入个链接,忽略,http://t.cn/RUbL4rP): (链接:http://www.live08 ...
- 两点(DFS)
福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”.基础级别的时候是在一个n×m单元上玩的.像这样: 每一个单元有包含一个有色点.我们将用不同的大写字母来表示不同的颜色. 这个游戏的关键是要找出一个包含 ...
- C++解析三
类的构造函数类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行.构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void.构造函数可用于为某些成员变量设置初始 ...
- java输入一个字符串,输出该字符串的所有的排序
public class Sort { public static void arrangeSequence(char[] strArr,int i){ char temp; ArrayList< ...
- python socket 网络编程selector用法 (实用)
Server端: import socketimport selectors class Server(object):def init(self,sel,sock):self.sel = selse ...
- SharePoint REST API - REST请求导航的数据结构
博客地址:http://blog.csdn.net/FoxDave 从一个既定的URL获取其他SharePoint资源 当你用SharePoint REST服务进行开发的时候,你经常会从指定的一个 ...