20190728三人开黑517codingACM模拟赛
三人组队开黑ACM膜你赛

果然我最蔡
我就写了ACF所以就写这些吧awa
Problem A

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

第一种情况(p1),蜡烛的y相等:这时候,我们可以从x较小的蜡烛的“底部”切到x较大的蜡烛的顶部
第二种情况(p2),蜡烛的x相等:这时候,可以从y较小的蜡烛的有“右端”切到y较大的蜡烛的左端
剩下的情况都是x和y都不相等的了,我们称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个选手的CodeCoder与TopForces的Rating,如果一个人的两个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,就把A向B连单向边
然后样例建完图后是这样的:

小朋友:好了好了快点告诉我怎么求答案
我们发现,从第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的纸片1和w×h的纸片2,问纸片1至少要折叠多少次才能变成纸片2
如果不能,就输出-1
首先把w和h、W和H变成w为宽、h为长的形式,方便比较
如果\(W<w\)或者\(H<h\),说明纸片1比纸片2要小,输出-1
然后来看剩下的:
每次折叠最多能缩小一般的长度,那么我们每次缩小一半不就一定次数最少了么...
坑点1:如果长度为9那么直接除以2等于4,但是如果这样折叠那折去的那一面不久是5么...所以每次的操作为\(x=x-(x>>1)\)而不是\(x>>=1\).
坑点2:
如果单是这样操作,还是有点问题的:

按照我们的方法来做,这应该要两次折叠才能完成啊
那如果这样呢:

好像只要1次就可以了
emm
把W和H给swap一下然后和原来的取个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模拟赛的更多相关文章
- 20190708三人开黑CF模拟赛
7月8号晚上8点和两位巨佬开了一场虚拟cf: [Helvetic Coding Contest 2018 online mirror (teams allowed, unrated)] 我这么蔡,只A ...
- 20190710双人开黑CF模拟赛
Codeforces Round #571 (Div. 2) 日常被tanao_大佬带飞,我AC了A和C(B题没了...否则tanao_大佬肯定把我吊打) A. Vus the Cossack and ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- 两个乒乓球队进行比赛,各出三人。 甲队为a,b,c三人,乙队为x,y,z三人。 已抽签决定比赛名单。 有人向队员打听比赛的名单。 a说他不和x比,c说他不和x,z比, 请编程序找出三队赛手的名单。
题目:两个乒乓球队进行比赛,各出三人. 甲队为a,b,c三人,乙队为x,y,z三人. 已抽签决定比赛名单. 有人向队员打听比赛的名单. a说他不和x比,c说他不和x,z比, 请编程序找出三队赛手的名单 ...
- 计蒜客T2202 数三角形(提高组2017模拟赛(三)day2T3) LZOJ3878攻略
今天模拟赛考了一道计蒜客NOIP2017模拟赛(三)day2T3的数三角形,原题链接 https://nanti.jisuanke.com/t/T2202 ,LZOJ3878攻略.场上想了很久都没转化 ...
- 代码实现:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。 已抽签决定比赛名单。有人向队员打听比赛的名单。 a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单
/*两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人. 已抽签决定比赛名单.有人向队员打听比赛的名单. a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单.*/ ...
- python基础练习题(题目 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单)
day14 --------------------------------------------------------------- 实例022:比赛对手 题目 两个乒乓球队进行比赛,各出三人. ...
- NOIp2018模拟赛三十六
好久没打模拟赛了...今天一样是两道国集,一道bzoj题 成绩:13+0+95=108 A题开始看错题了...导致样例都没看懂,结果xfz提醒我后我理解了一个我自认为正确的题意(事实证明我和xfz都错 ...
- 冲刺$\mathfrak{CSP-S}$集训模拟赛总结
开坑.手懒并不想继续一场考试一篇文. 既没必要也没时间侧边栏的最新随笔题解反思相间也丑 而且最近越来越懒了竟然都不写题解了……开坑也是为了督促自己写题解. 并不想长篇大论.简要题解也得写啊QAQ. 目 ...
随机推荐
- windows下mysql免安装版配置(踩过的坑)简记
下载 从官网(https://dev.mysql.com/downloads/mysql/)下载 这里的免安装版本的,相对来说干净,但是需要自己来配置很多东西. 配置 首先是注册windows的服务. ...
- 微信支付与支付宝支付java开发注意事项
说明:这里只涉及到微信支付和淘宝支付 以官网的接口为准,主要关注[网关].[接口].[参数][加密方式][签名][回调] 第一步,了解自己的项目要集成的支付方式 常见的有扫码支付.网页支付.APP支付 ...
- 开源项目SMSS开发指南
SMSS是一个由我个人发起的开源项目,目的是建立一套轻量化,高可用,高安全和方便扩展的业务支撑框架.SMSS面向TCP/IP层开发,适合扩展上层业务接口.数据结构传输序列化通过Protobuf实现.传 ...
- ffmpeg参数编码大全
ffmpeg version N-49044-g89afa63 Copyright (c) 2000-2013 the FFmpeg developers built on Jan 19 2013 2 ...
- ip转十进制(PHP、MySQL)
mysql与php中都提供了IP转换十进制数函数 1. IP 由点分格式,转换为数字格式,代码如下: mysql> select inet_aton('127.0.0.1'); +------- ...
- SpringBoot入门(一)
1 简介 Spring Boot是快速搭建Spring工程的脚手架,简化配置与依赖关系(约定大于配置),让我们把精力集中在业务部分 2 简单入门事例 创建一个Hello World的Web工程 2.1 ...
- 如何在ArcGIS中恢复注记文字
文字标注是地图上一种特殊的视觉元素,可通过文字表达图形符号难以说明的地图内容,它与图形符号结合在一起存在于地图上,是关乎地图构图美的关键因素之一. MapGIS软件下子图对象和注释对象统统保存在点文件 ...
- graphviz 的使用教程
node 节点属性如下 : Name Default Values color black node shape color comment any string (format-dependen ...
- python爬虫——scrapy的使用
本文中的知识点: 安装scrapy scrapy的基础教程 scrapy使用代理 安装scrapy 由于小哥的系统是win7,所以以下的演示是基于windows系统.linux系统的话,其实命令都一样 ...
- OpenCV图像数字化
灰度图像数字化 我们平时使用PS或者其它图像处理的软件打开一个要处理的图像,当我们将图像放大的足够大的时候我们会发现很多个灰度程度不同的小方格,其中每个方格就相当于一个像素,水平方向的方格数代表这个图 ...