题目:https://codeforces.com/contest/1092/problem/D1

https://codeforces.com/contest/1092/problem/D2

https://codeforces.com/contest/1092/problem/E

很有趣的题;

对于D1,首先发现两种砖的放法和高度的奇偶性有关(!);

而竖着放的砖不改变一列的奇偶性,也就是确定一列的奇偶性后,它的高度是可以任意的,那么我们就不用考虑实际高度的问题了;

然后发现,如果两列奇偶性相同的列相邻了,那么它们就“无敌”了,可以变成任意高度;

而两列可以合并,只能是它们相邻且奇偶性相同;

这就很像两组括号序列啊!奇数是 (),偶数是 [],那么整个序列就是 (, ), [, ] 相间的;

只要栈顶能完成一个匹配,就弹栈表示这两列“无敌”了;

所以最后要是栈里没有元素或只剩下一个元素,序列就是合法的,否则不合法;

这么简单就做完了!

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=2e5+;
int n,sta[xn],top;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int main()
{
n=rd();
for(int i=,x;i<=n;i++)
{
x=rd();
if(top&&(x&)==(sta[top]&))top--;
else sta[++top]=x;
}
if(top<=)puts("YES");
else puts("NO");
return ;
}

D1

对于D2,只能放横着的砖;

那就更简单了,每次先填满最低的一段,如果其长度是奇数就不合法了,否则就和旁边的合并成一段;

这个过程可以用单调栈维护。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=2e5+;
int n,sta[xn],top,len[xn],a[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int main()
{
n=rd();
for(int i=;i<=n;i++)a[i]=rd();
for(int i=,l,j;i<=n;i=j+)
{
j=i; l=;
while(a[i]==a[j+])j++;
while(top&&a[i]>sta[top])
{
if(len[top]&){puts("NO"); return ;}
l=len[top]; top--;
if(top&&sta[top]<a[i])len[top]+=l;
else break;
}
while(top&&sta[top]==a[i])l+=len[top--];
sta[++top]=a[i]; len[top]=l+(j-i+);
//printf("sta[%d]=%d len=%d\n",top,sta[top],len[top]);
}
int l=;
while(top>)
{
l+=len[top--];
if(l&){puts("NO"); return ;}
}
puts("YES");
return ;
}

D2

E题要最小化连通块合成的树的直径,还要输出连边方案;

结论就是找到所有连通块(小树)的直径中点,最大的直径的中点连接所有其他中点;

想想果然很有道理,因为这样其实最终的直径还是最大连通块的直径,除非有几个连通块一样都是最大;

而其他连法都可能让直径更大;

所以只需要找直径中点即可,看了看提交记录,发现可以写得很优美,就是 dfs 同时找直径端点、长度和中点;

因为如果从一端 dfs 到另一端,那么中点一定在路径上,返回的时候记录一下即可;

然后注意特别判断有两个或三个一样大的最大连通块;

直径的性质要好好利用。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define pb push_back
using namespace std;
int const xn=;
int n,hd[xn],ct,to[xn<<],nxt[xn<<],dis[xn],mx,d;
int vis[xn];
struct N{
int x,d;
N(int x=,int d=):x(x),d(d) {}
bool operator < (const N &y) const
{return d<y.d;}
};
vector<N>v;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
void dfs(int x)
{
vis[x]=;
if(dis[x]>mx)mx=dis[x],d=x;
for(int i=hd[x],u;i;i=nxt[i])
if(vis[u=to[i]]!=)dis[u]=dis[x]+,dfs(u);
}
bool dfsx(int x)
{
vis[x]=; bool ret=;
if(dis[x]>mx)mx=dis[x],ret=;
for(int i=hd[x],u;i;i=nxt[i])
if(vis[u=to[i]]!=)
{
dis[u]=dis[x]+;
if(dfsx(u))ret=;
}
if(ret&&dis[x]==mx/)d=x;//
return ret;
}
int main()
{
n=rd(); int m=rd(); int ans=;
for(int i=,x,y;i<=m;i++)x=rd(),y=rd(),add(x,y),add(y,x);
for(int i=;i<=n;i++)
if(!vis[i])
{
dis[i]=; mx=-; dfs(i);
dis[d]=; mx=-; dfsx(d);
ans=max(ans,mx); v.pb(N(d,mx));
}
sort(v.begin(),v.end()); int siz=v.size();
if(siz>)
{
ans=max(ans,(v[siz-].d+)/+(v[siz-].d+)/+);//
if(siz>)ans=max(ans,(v[siz-].d+)/+(v[siz-].d+)/+);//
}
printf("%d\n",ans);
int u=v[siz-].x;
for(int i=;i<siz-;i++)
printf("%d %d\n",u,v[i].x);
return ;
}

E

CF1092 D & E —— 思路+单调栈,树的直径的更多相关文章

  1. 牛客小白月赛13-H(单调栈+树状数组)

    题目链接:https://ac.nowcoder.com/acm/contest/549/H 题意:给一个柱状图,包括每个矩阵的宽度和高度,求能组成的最大矩阵的面积. 思路:显然最大矩阵的高一定为n个 ...

  2. bzoj 4826: [Hnoi2017]影魔【单调栈+树状数组+扫描线】

    参考:https://www.cnblogs.com/lcf-2000/p/6789680.html 这是一个相对码量少的做法,用到了区间修改区间查询的树状数组,详见:www.cnblogs.com/ ...

  3. CodeForces 548D 单调栈

    Mike and Feet Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Subm ...

  4. ☆ [POJ2559] Largest Rectangle in a Histogram 「单调栈」

    类型:单调栈 传送门:>Here< 题意:给出若干宽度相同的矩形的高度(条形统计图),求最大子矩形面积 解题思路 单调栈的经典题 显然,最终的子矩形高度一定和某一个矩形相等(反证).因此一 ...

  5. 【BZOJ4826】【HNOI2017】影魔(扫描线,单调栈)

    [BZOJ4826][HNOI2017]影魔(扫描线,单调栈) 题面 BZOJ 洛谷 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他 ...

  6. [POJ2559&POJ3494] Largest Rectangle in a Histogram&Largest Submatrix of All 1’s 「单调栈」

    Largest Rectangle in a Histogram http://poj.org/problem?id=2559 题意:给出若干宽度相同的矩形的高度(条形统计图),求最大子矩形面积 解题 ...

  7. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

  8. poj2631 求树的直径裸题

    题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...

  9. hdu 2196 Computer 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem ...

随机推荐

  1. Lorenzo Von Matterhorn(STL_map的应用)

    Lorenzo Von Matterhorn time limit per test 1 second memory limit per test 256 megabytes input standa ...

  2. EasyNVR无插件直播服务器软件览器低延时播放监控摄像头视频(EasyNVR播放FLV视频流)

    背景描述 EasyNVR的使用者应该都是清楚的了解到,EasyNVR一个强大的功能就是可以进行全平台的无插件直播.主要原因在于rtsp协议的视频流(默认是需要插件才可以播放的)经由EasyNVR处理可 ...

  3. 关于Spring学习解析顺序

    最高接口BeanFactory开始解析,暂定为一级接口! 从上往下进行分析学习! 分析的Spring源码版本是:4.3.3

  4. Win10 Edge浏览器 应用商店 IE浏览器 无法访问页面 0x8000FFFF 问题解决

  5. Python菜鸟之路:sqlalchemy/paramiko进阶

    前言:ORM中的两种创建方式 数据库优先:指的是先创建数据库,包括表和字段的建立,然后根据数据库生成ORM的代码,它是先创建数据库,再创建相关程序代码 代码优先:就是先写代码,然后根据代码去生成数据库 ...

  6. c#的const可以用于引用类型吗

    答案是可以的.不过用const修饰的类实例只能是null. class A{ public int a=0; } class B{ const A constA=null; const object ...

  7. JVM类加载流程

    1.加载 a.装载类的第一个阶段 b.取得类的二进制流 c.转为方法区数据结构 d.在Java堆中生成对应的java.lang.Class对象 2.链接 a.验证(保证Class流的格式是正确的) 文 ...

  8. 用swift创建各种UI控件【iSwifting社区】

    为了方便大家学习,www.iSwifting.com社区为大家准备了创建各种UI控件的代码.開始看着语法可能有些别扭,当用习惯了,就认为还是非常不错的. 社区还添加了问答专区.有问题的朋友.虽然问.大 ...

  9. SUBMIT 用法

    [转自http://lz357502668.blog.163.com/blog/static/16496743201241195817597/] 1.最普通的用法 *Code used to exec ...

  10. JVM性能优化, Part 1 ―― JVM简介

    JVM性能优化这些列文章共分为5章,是ImportNew上面翻译自Javaworld: 第1章:JVM技术概览 第2章:编译器 第3章:垃圾回收 第4章:并发垃圾回收 第5章:可伸缩性 众所周知,Ja ...