三人组队开黑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. 初始Redis与简单使用

    初始Redis: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(so ...

  2. 20191107-8 beta week 2/2 Scrum立会报告+燃尽图 07

    此作业要求参见 http://edu.cnblogs.com/campus/nenu/2019fall/homework/9960 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶,梅 ...

  3. Git安装--Windows

    Git安装配置 在使用Git前我们需要先安装 Git.Git 目前支持 Linux/Unix.Solaris.Mac和 Windows 平台上运行. Git 各平台安装包下载地址为:http://gi ...

  4. Spring MVC 请求处理过程

    1.  2. 3. 4. 5. 6.

  5. 聊聊Python中的描述符

    描述符是实现描述符协议方法的Python对象,当将其作为其他对象的属性进行访问时,该描述符使您能够创建具有特殊行为的对象. 通常,描述符是具有“绑定行为”的对象属性,其属性访问已被描述符协议中的方法所 ...

  6. docker-none

    禁用容器的网络连接 如果要完全禁用容器上的网络堆栈,可以--network none在启动容器时使用该标志.在容器内,仅创建环回设备.以下示例说明了这一点. 创建容器. $ docker run -- ...

  7. Using TFRecords and tf.Example

    -----这篇其实是TensorFlow的官方tutorials,由于没有翻译,笔者姑且翻译一下,用来日后思考.------- 原址:https://www.tensorflow.org/tutori ...

  8. docker 修改实例名称

    docker 容器(服务)重命名只要一个命令就可以: docker rename 原容器名 新容器名 如:

  9. PHP计算每月几周,每周的开始结束日期

    PHP计算每月几周,每周的开始结束日期 因为项目中需要一个每周工作计算的功能,具体日期的算法是,把每月拆分成几个周,最后一个星期这个月份的天数不够就补上下个月的. 列如今天8月27星期一,这个月有31 ...

  10. 「newbee-mall新蜂商城开源啦」1000 Star Get !仓库Star数破千!记录一下

    新蜂商城已经开源了 3 个多月左右的时间,在 2019 年的年末,仓库的 Star 数量冲破了 1000,整理本篇文章的时间是 2020 年 1 月 12 日,目前的 Star 数量是 1180 左右 ...