三人组队开黑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. saltstack的配置使用

    介绍 认证管理,使其可以用于编配, 远程执行, 配置管理等等.部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. 号称世界上最快的消息队列ZeroMQ使得 ...

  2. jmeter 5.1版本更新说明

    版本5.1 摘要 新的和值得注意的 不兼容的变化 Bug修复 改进 非功能性变化 已知问题和解决方法 谢谢 新的和值得注意的 核心改进 JDBC测试已得到改进,能够设置init SQL语句并添加与不支 ...

  3. HTML横向滚动条和文本超出显示三个小圆点

    我们这次要说的就是:现在有很多的公司以及很多的app软件经常使用的两个方法横向滚动条和文本超出三个小圆点 横向滚动条:顾名思义嘛,就是能够一块内容可以横着滑动. 文本超出三个小圆点:文本超出就是当文本 ...

  4. 小白学 Python 爬虫(33):爬虫框架 Scrapy 入门基础(一)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  5. Jmeter基础学习-下载及安装

    1. Jmeter下载路径:http://jmeter.apache.org/download_jmeter.cgi 进入Jmeter下载界面后英语不好+技术不灵的同学会蒙圈,下载那个呢? *Bina ...

  6. spring之整合Hibernate

    spring整合Hibernate整合什么? 1.让IOC容器来管理Hibernate的SessionFactory. 2.让Hibernate使用上spring的声明式事务. 整合步骤: 1.加入H ...

  7. Spring boot项目搭建及简单实例

    Spring boot项目搭建 Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point for ...

  8. InnoDB与MyISAM的区别(高性能MySQL笔记)

    1.InnoDB支持事务,MyISAM不支持,也就是说MyISAM不支持事务回滚操作,这个功能可能是致命的 2.InnoDB支持行锁,MyISAM只支持表锁,不过InnoDB的行锁是建立在索引之上的, ...

  9. MATLAB生成正弦波

    要求:选定采样频率,生成不同频率的正弦波 程序: f1=100;%生成正弦波的频率 fs=1000;%采样频率 N=100;%采样点数 n=0:N-1; t=n/fs;%时间序列 y=sin(2*pi ...

  10. Navicat10.1.11使用记录

    设计表的时候有个允许空值(null),如果不勾选,则无法插入null(但是可以插入‘null’),且默认值不能为null: 如果某个字段没有设置默认值,而插入时又没有给此字段赋值,则会提示warnin ...