三人组队开黑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. Git是什么?

    Git是什么? Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控 ...

  2. [LINQ2Dapper]最完整Dapper To Linq框架(八)---导航属性

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  3. 牛客练习赛$48E$ 小$w$的矩阵前$k$大元素 堆

    正解:堆 解题报告: 传送门$QwQ$ 考虑把$b$从大往小排序,然后把$a_1+b_1,a_2+b_1,...,a_n+b_1$丢到堆里,顺便记录下$b$的下标 然后每次拿出一个最大值,设为$mx= ...

  4. $POJ1742\ Coins$ 多重背包+贪心

    Vjudge传送门 $Sol$ 首先发现这是一个多重背包,所以可以用多重背包的一般解法(直接拆分法,二进制拆分法...) 但事实是会TLE,只能另寻出路 本题仅关注“可行性”(面值能否拼成)而不是“最 ...

  5. linux入门基础指令大全(汇总)

    一.文件目录指令 1 pwd指令 pwd 显示当前所在的目录 2 ls指令 ls [选项] [目录或文件] 查看文件信息 ls -a 查看所有文件和目录,包括隐藏的 ls -l 以列表的方式显示 ll ...

  6. 微信小程序之双重循环(包含左滑删除,以及数据各项处理)

    <view wx:for="{{hommer}}" wx:for-item="item" wx:for-index="index" w ...

  7. Java BIO NIO 与 AIO

    回顾 上一章我们介绍了操作系统层面的 IO 模型. 阻塞 IO 模型. 非阻塞 IO 模型. IO 复用模型. 信号驱动 IO 模型(用的不多,知道个概念就行). 异步 IO 模型. 并且介绍了 IO ...

  8. map文件分析

    1.MAP文件基本概念 段(section):描述映像文件的代码和数据块 RO:Read-Only的缩写,包括RO-data(只读数据)和RO-code(代码) RW:Read-Write的缩写,主要 ...

  9. ReactNative: 自定义ReactNative API组件

    一.简介 在前面介绍了很多ReactNative中UI组件和API组件,这些都是Facebook团队封装好的基础组件,开发者可以直接使用.然而,在实际的开发过程中,面对复杂的需求,此时原生的Nativ ...

  10. 前端笔记6-js2

    1.break 和continue用法 break结束本次循环,如果想结束外层循环,可以通过这个label来指定要结束的循环. continue可以用来跳过当次循环,如果想跳过外次循环,也可以通过这个 ...