三人组队开黑ACM膜你赛

果然我最蔡

我就写了ACF所以就写这些吧awa

Problem A

人话:给你一个w×h的矩形蛋糕,然后告诉你两个蜡烛的坐标,两个蜡烛都在网格点上且不在蛋糕边缘,问如何切一刀能把蛋糕分成两块且两块分别有一个蜡烛

分类讨论:

第一种情况(p1),蜡烛的y相等:这时候,我们可以从x较小的蜡烛的“底部”切到x较大的蜡烛的顶部

第二种情况(p2),蜡烛的x相等:这时候,可以从y较小的蜡烛的有“右端”切到y较大的蜡烛的左端

剩下的情况都是xy都不相等的了,我们称x较小的点位\(P_1\),另一个为\(P_2\)

第三种情况(p3),\(P_2\)的y大于\(P_1\)的y:这时候,我们可以从\(P_1\)的”顶端“切到\(P_2\)的”底端“

第四种情况(p4),\(P_2\)的y小于\(P_1\)的y:这时候,我们可以从\(P_1\)的”底端“切到\(P_2\)的”顶端“

这题不难,Code:

// This code Write By chtholly_micromaker(MicroMaker)
#include <cstdio>
#include <cctype>
#include <iostream>
#define reg register
using namespace std;
template <class t> inline void rd(t &s)
{
s=0;
reg char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c))
s=(s<<3)+(s<<1)+(c^48),c=getchar();
return;
}
signed main(void)
{
freopen("anniversary.in","r",stdin);
freopen("anniversary.out","w",stdout);
int ax,ay,bx,by;
int w,h;
cin>>w>>h>>ax>>ay>>bx>>by;
if(ax>bx)
swap(ax,bx),swap(ay,by);
if(ay==by)
{
if(ax>bx)
swap(ax,bx);
cout<<ax<<" 0 "<<bx<<" "<<h<<endl;
return 0;
}
if(ax==bx)
{
if(ay>by)
swap(ay,by);
cout<<"0 "<<ay<<" "<<w<<" "<<by<<endl;
return 0;
}
if(ay>by)
{
cout<<ax<<" 0 "<<bx<<" "<<h<<endl;
return 0;
}
else
{
cout<<bx<<" 0 "<<ax<<" "<<h<<endl;
return 0;
}
return 0;
}

Problem C

这大概是我们做的题目中最难的一题了(我好蔡啊)

人话:告诉你N个选手的CodeCoderTopForcesRating,如果一个人的两个Rating中有一个高于另一个人,那么他就可以在luogu咕值排名系统中吊打那个人

输出N行,第i行表示第i个选手能吊打的人数

小朋友:贪心搞一搞,\(nlogn\)水过

那样会有重叠的统计啊,如何处理?

小朋友:emm

这里要注意一点,如果A你能在Rating 上吊打B,而B能在Rating上吊打C,那么A肯定吊打C

小朋友:I can hack it!

3
3 8
1 9
2 7

小朋友:你看2能吊打1,然后3能吊打2,可是3的两个Rating都没有1高啊

Unsuccessful hacking attempt

小朋友:???

3号选手:抱歉,在排名系统里这样就是可以为所欲为

那么既然存在这样一种食物链的情况,你想到了什么?对,建图DFS

A能在两个Rating中任意一个吊打B,就把AB连单向边

然后样例建完图后是这样的:

小朋友:好了好了快点告诉我怎么求答案

我们发现,从第i个点开始遍历所能达到的其他节点的数量就是那个节点代表的选手能吊打的数量

结束了?

结束了。

但这样复杂度好像要爆炸啊

没关系加个小贪心就变成\(O(n)\)了

Code:

// This code Write By chtholly_micromaker(MicroMaker)
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define reg register
#define int long long
using namespace std;
const int MaxN=100050;
struct Node
{
int x,y,idx;
}a[MaxN];
struct Edge
{
int nxt,to;
}E[MaxN<<3];
template <class t> inline void rd(t &s)
{
s=0;
reg char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c))
s=(s<<3)+(s<<1)+(c^48),c=getchar();
return;
}
int hd[MaxN];
int ans[MaxN];
bool vis[MaxN];
int n,en,cnt;
inline void adde(int u,int v)
{
++en;
E[en].nxt=hd[u];
E[en].to=v;
hd[u]=en;
return;
}
inline bool cmp1(const Node &A,const Node &B)
{
return A.x<B.x;
}
inline bool cmp2(const Node &A,const Node &B)
{
return A.y<B.y;
}
inline void dfs(int u)
{
// printf("UUUUU %d\n",u);
// printf(">>>>>>>>>>>>>>>>> %d %d\n",u,fa);
for(int i=hd[u];~i;i=E[i].nxt)
{
reg int v=E[i].to;
if(vis[v])
continue;
// printf(">>>>>>>>. %d\n",v);
++cnt;
vis[v]=true;
dfs(v);
// vis[v]=false;
}
return;
}
signed main(void)
{
freopen("codecoder.in","r",stdin);
freopen("codecoder.out","w",stdout);
memset(hd,-1,sizeof hd);
int n;rd(n);
for(int i=1;i<=n;++i)
{
rd(a[i].x);rd(a[i].y);
a[i].idx=i;
}
sort(a+1,a+n+1,cmp1);
for(int i=1;i<n;++i)
adde(a[i+1].idx,a[i].idx);//,printf("adde: %d %d\n",a[i].idx,a[i+1].idx);
sort(a+1,a+n+1,cmp2);
for(int i=1;i<n;++i)
adde(a[i+1].idx,a[i].idx);//,printf("adde: %d %d\n",a[i].idx,a[i+1].idx);
for(int i=1;i<=n;++i)
{
// printf(">>>><<><><>II %d\n",a[i].idx);
if(!vis[a[i].idx])
// dfs(a[i].idx);
++cnt,vis[a[i].idx]=true,dfs(a[i].idx);
ans[a[i].idx]=cnt-1;
}
for(int i=1;i<=n;++i)
printf("%lld\n",ans[i]);
return 0;
}

Problem F

人话:给你W×H纸片1w×h纸片2,问纸片1至少要折叠多少次才能变成纸片2

如果不能,就输出-1

首先把w和hW和H变成w为宽、h为长的形式,方便比较

如果\(W<w\)或者\(H<h\),说明纸片1纸片2要小,输出-1

然后来看剩下的:

每次折叠最多能缩小一般的长度,那么我们每次缩小一半不就一定次数最少了么...

坑点1:如果长度为9那么直接除以2等于4,但是如果这样折叠那折去的那一面不久是5么...所以每次的操作为\(x=x-(x>>1)\)而不是\(x>>=1\).

坑点2:

如果单是这样操作,还是有点问题的:

按照我们的方法来做,这应该要两次折叠才能完成啊

那如果这样呢:

好像只要1次就可以了

emm

WHswap一下然后和原来的取个min不就好了。。。

Code:

// This code Write By chtholly_micromaker(MicroMaker)
#include <cstdio>
#include <cctype>
#include <iostream>
#define reg register
#define int long long
using namespace std;
template <class t> inline void rd(t &s)
{
s=0;
reg char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c))
s=(s<<3)+(s<<1)+(c^48),c=getchar();
return;
}
inline int getdis(int x,int y)
{
reg int res=0;
while(x>y)
x-=(x>>1),++res;
return res;
}
signed main(void)
{
freopen("folding.in","r",stdin);
freopen("folding.out","w",stdout);
int W,H,w,h;
rd(W);rd(H);rd(w);rd(h);
if(W<H)
swap(W,H);
if(w<h)
swap(w,h);
if(W<w||H<h)
return puts("-1"),0;
reg int ans=0x7fffffffffff;
ans=min(ans,getdis(W,w)+getdis(H,h));
ans=min(ans,getdis(W,h)+getdis(H,w));
printf("%lld\n",ans);
return 0;
}

Ended

20190728三人开黑517codingACM模拟赛的更多相关文章

  1. 20190708三人开黑CF模拟赛

    7月8号晚上8点和两位巨佬开了一场虚拟cf: [Helvetic Coding Contest 2018 online mirror (teams allowed, unrated)] 我这么蔡,只A ...

  2. 20190710双人开黑CF模拟赛

    Codeforces Round #571 (Div. 2) 日常被tanao_大佬带飞,我AC了A和C(B题没了...否则tanao_大佬肯定把我吊打) A. Vus the Cossack and ...

  3. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  4. 两个乒乓球队进行比赛,各出三人。 甲队为a,b,c三人,乙队为x,y,z三人。 已抽签决定比赛名单。 有人向队员打听比赛的名单。 a说他不和x比,c说他不和x,z比, 请编程序找出三队赛手的名单。

    题目:两个乒乓球队进行比赛,各出三人. 甲队为a,b,c三人,乙队为x,y,z三人. 已抽签决定比赛名单. 有人向队员打听比赛的名单. a说他不和x比,c说他不和x,z比, 请编程序找出三队赛手的名单 ...

  5. 计蒜客T2202 数三角形(提高组2017模拟赛(三)day2T3) LZOJ3878攻略

    今天模拟赛考了一道计蒜客NOIP2017模拟赛(三)day2T3的数三角形,原题链接 https://nanti.jisuanke.com/t/T2202 ,LZOJ3878攻略.场上想了很久都没转化 ...

  6. 代码实现:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。 已抽签决定比赛名单。有人向队员打听比赛的名单。 a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单

    /*两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人. 已抽签决定比赛名单.有人向队员打听比赛的名单. a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单.*/ ...

  7. python基础练习题(题目 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单)

    day14 --------------------------------------------------------------- 实例022:比赛对手 题目 两个乒乓球队进行比赛,各出三人. ...

  8. NOIp2018模拟赛三十六

    好久没打模拟赛了...今天一样是两道国集,一道bzoj题 成绩:13+0+95=108 A题开始看错题了...导致样例都没看懂,结果xfz提醒我后我理解了一个我自认为正确的题意(事实证明我和xfz都错 ...

  9. 冲刺$\mathfrak{CSP-S}$集训模拟赛总结

    开坑.手懒并不想继续一场考试一篇文. 既没必要也没时间侧边栏的最新随笔题解反思相间也丑 而且最近越来越懒了竟然都不写题解了……开坑也是为了督促自己写题解. 并不想长篇大论.简要题解也得写啊QAQ. 目 ...

随机推荐

  1. mysql主从之基于mycat实现读写分离

    一 环境 1.1 结构 192.168.132.125 mycat 192.168.132.121  master 192.168.132.122  slave 主从已经配置完成 1.2 安装myca ...

  2. 跟我一起学QT_QT标准对话框_字体选择框

    标准对话框 QT的标准对话框分为以下几种 颜色对话框 文件对话框 字体对话框 输入对话框 消息对话框 进度对话框 错误信息对话框 向导对话框 字体选择框 字体选择框位于 QFontDialog 类中 ...

  3. Appium环境搭建超详细教程

    前言: 本系列教程会从软件的基本安装开始,最终目的是通过完成几个案例后, 大家实现自由抓取App中想要的资源. 本系列以后会更的: Appium基本使用及控制真机及安卓模拟器 Mitmproxy抓包工 ...

  4. oracle中使用pl/sql进行的文件读写操作

    第一次知道,可以使用pl/sql来进行文件的读写操作,嘿嘿,简单的试了下可行. 基本步骤如下: SQL> conn sys/sys@orcl as sysdba 已连接. SQL> cre ...

  5. Hadoop以及组件介绍

    一.背景介绍 在接触过大数据相关项目的时候常常都会听到Hadoop这个东西,简单来说,他是一个用分布式计算来处理大数据的开源软件,下面包含了许多的组件和子项目,这篇文章将会介绍Hadoop的原理以及一 ...

  6. CentOS 安装图形化界面后重启出现许可等事项操作

    这是CentOS内核的初始设置页面,下面给出中文解释及操作方法. 1.CentOS Linux 7 初始设置(核心) 1)[!]许可证信息 (没有接受许可证) 请您选择[‘1’ 输入许可证信息 | ‘ ...

  7. oracle mysql sql 根据一张表更新另一张表

    update CDINFO.Dept_Dict tab1 set PART_FLAG = (select PART_FLAG from DICT.DEPARTMENT_DICT@zyhis4 tab2 ...

  8. 《C++Primer》第五版习题解答--第四章【学习笔记】

    [C++Primer]第五版习题解答--第四章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/11 第四章:表达式 练习4. ...

  9. Ubuntu1804下安装Gitab

    部署gitlab 1.配置仓库源 # vim /etc/apt/sources.listdeb http://mirrors.aliyun.com/ubuntu/ bionic main restri ...

  10. Spring Boot2 系列教程 (九) | SpringBoot 整合 Mybatis

    前言 如题,今天介绍 SpringBoot 与 Mybatis 的整合以及 Mybatis 的使用,本文通过注解的形式实现. 什么是 Mybatis MyBatis 是支持定制化 SQL.存储过程以及 ...