题面

题目描述

Farmer John 计划建造 \(N\)(\(1 \leq N \leq 10^5\))个农场,用 \(N−1\) 条道路连接,构成一棵树(也就是说,所有农场之间都互相可以到达,并且没有环)。每个农场有一头奶牛,品种为更赛牛或荷斯坦牛之一。

Farmer John 的 \(M\) 个朋友(\(1 \leq M \leq 10^5\))经常前来拜访他。在朋友 \(i\) 拜访之时,Farmer John 会与他的朋友沿着从农场 \(A_i\) 到农场 \(B_i\) 之间的唯一路径行走(可能有 \(A_i=B_i\))。除此之外,他们还可以品尝他们经过的路径上任意一头奶牛的牛奶。由于 Farmer John 的朋友们大多数也是农场主,他们对牛奶有着极强的偏好。他的有些朋友只喝更赛牛的牛奶,其余的只喝荷斯坦牛的牛奶。任何 Farmer John 的朋友只有在他们访问时能喝到他们偏好的牛奶才会高兴。

请求出每个朋友在拜访过后是否会高兴。

输入

输入的第一行包含两个整数 \(N\) 和 \(M\)。

第二行包含一个长为 \(N\) 的字符串。如果第 \(i\) 个农场中的奶牛是更赛牛,则字符串中第 \(i\) 个字符为 G,如果第 \(i\) 个农场中的奶牛是荷斯坦牛则为 H

以下 \(N−1\) 行,每行包含两个不同的整数 \(X\) 和 \(Y\)(\(1 \leq X,Y \leq N\)),表示农场 \(X\) 与 \(Y\) 之间有一条道路。

以下 \(M\) 行,每行包含整数 \(A_i,B_i\),以及一个字符 \(C_i\)。\(A_i\) 和 \(B_i\) 表示朋友 \(i\) 拜访时行走的路径的端点,\(C_i\) 是 GH 之一,表示第 \(i\) 个朋友喜欢更赛牛的牛奶或是荷斯坦牛的牛奶。

输出

输出一个长为 \(M\) 的二进制字符串。如果第 \(i\) 个朋友会感到高兴,则字符串的第 \(i\) 个字符为 1,否则为 0

样例输入输出

输入:

5 5
HHGHG
1 2
2 3
2 4
1 5
1 4 H
1 4 G
1 3 G
1 3 H
5 5 H

输出:

10110

这是笔者今天考试时的一道,并非常蒟蒻地得了 \(56pts\)。

老师讲完后顿有所悟,故作此篇。

\(P.S.\) 复制题面+改 \(\LaTeX\) 好烦。

思考

1. 考试时思路

考试时脑子一抽,觉得要用什么高大上的算法,估摸估摸有了个 LCA。

当时的想法是,记录某个节点到根节点的“长度”,这里长度指的是把更赛牛看做 1,把荷斯坦牛看做 0,从某节点到根节点的所有节点的权值之和。然后询问时先看路径上有几个点,再看路径长度多少(LCA),然后比较一下。

最后,就得到了 \(56pts\) 的代码:(代码已丢失啊啊啊啊啊)

2. 老师讲思路

就……标色法,DFS,碰到不同种类的牛就换种颜色继续标……踢死就是所有想通的同种类的牛标记为同一种颜色(哇我好蒻居然没有想到)

于是,我兴冲冲地提交了第一份代码:

#include <bits/stdc++.h>
using namespace std; const int MS=100005;
int n,m,col[MS];
int head[MS],nxt[MS*2],vet[MS*2],edgenum;
char s[MS];
void addedge(int u,int v) {
vet[++edgenum]=v;
nxt[edgenum]=head[u];
head[u]=edgenum;
return ;
}
void dfs(int u,int fa) {
int p=0;
for(int e=head[u];e;e=nxt[e]) {
int v=vet[e];
if(v==fa) continue;
if(s[u]==s[v]) col[v]=col[u];
else col[v]=col[u]+(++p);
dfs(v,u);
}
return ;
}
char ans[MS]; int main() {
scanf("%d%d%s",&n,&m,s+1);
int x,y;
for(int i=1;i<n;i++) {
scanf("%d%d",&x,&y);
addedge(x,y),addedge(y,x);
}
dfs(1,0);
char ch;
for(int i=0;i<m;i++) {
scanf("%d%d",&x,&y);
cin>>ch;
if(col[x]!=col[y]||s[x]==ch) ans[i]='1';
else ans[i]='0';
}
printf("%s\n",ans);
return 0;
}

嗯嗯?为什么 \(31pts\)?其实很简单~

3. 进一步思考

首先!我发现了一个问题:当上面的程序遇到如下样例时,就会出 BUG 。

询问:2 3 H?显然,从 2 到 3 的路径上是 H 牛的(1)。但是为什么输出 0 呢?

观察一下,发现其实 2 和 3 两点不应同为 1。为什么?因为它们并不相连。于是,我们对以上代码进行优化,添加随机数,使两个节点颜色相同的概率大大降低。

以下是代码:

#include <bits/stdc++.h>
using namespace std; const int MS=100005;
typedef long long ll;
int n,m;
ll col[MS];
int head[MS],nxt[MS*2],vet[MS*2],edgenum;
char s[MS];
mt19937 rng(1234567);
void addedge(int u,int v) {
vet[++edgenum]=v;
nxt[edgenum]=head[u];
head[u]=edgenum;
return ;
}
void dfs(int u,int fa) {
for(int e=head[u];e;e=nxt[e]) {
int v=vet[e];
if(v==fa) continue;
if(s[u]==s[v]) col[v]=col[u];
else col[v]=col[u]+rng();
dfs(v,u);
}
return ;
}
char ans[MS]; int main() {
scanf("%d%d%s",&n,&m,s+1);
int x,y;
for(int i=1;i<n;i++) {
scanf("%d%d",&x,&y);
addedge(x,y),addedge(y,x);
}
dfs(1,0);
char ch;
for(int i=0;i<m;i++) {
scanf("%d%d",&x,&y);
cin>>ch;
if(col[x]!=col[y]||s[x]==ch) ans[i]='1';
else ans[i]='0';
}
printf("%s\n",ans);
return 0;
}

(\(max 156ms\))

完!

GFOJ-1808 牛奶访客的更多相关文章

  1. 一个典型的MapRuduce实例------webcount(网站统计访客信息)

    统计某一特定网站的某个时辰访客人数 所用版本:hadoop2.6.5 数据样式如下: 111.111.111.111 - - [16/Dec/2012:05:32:50 -0500] "GE ...

  2. 《点石成金-访客至上的web和移动可用性设计秘籍》读书笔记

      简介 作者Steve Krug,惯例先去了解一下本书的作者,发现书中介绍的并不多,百度一下后发现这本书比作者出名.好吧,百度就是这样子,作者自称web可用性咨询师,手上这本书是第三版再版,第一版2 ...

  3. 10步教你来优化WordPress速度 为服务器和访客减压

    1.Cookie的静态化制作 约有80%至90%的时间,访客要花费大量的时间等你的WordPress加载静态内容.这意味着,有大部分的时间,用户浏览您的网站,他们正在等待加载,如:图像,CSS,JS脚 ...

  4. PHP判断访客是否移动端浏览器访问

    今天要给大家分享一段PHP代码,该代码的功能是用来判断访客是否移动端浏览器访问,该功能的实现思路是通过HTTP_X_WAP_PROFILE. HTTP_VIA.HTTP_USER_AGENT等信息来判 ...

  5. 在线获取访客QQ号码的原理及实现方法

    原文地址:http://www.piaoyi.org/network/get-qq-haoma-js.html 正 文: 最近,飘易收到不少在线获取网站访客QQ号码的促销推广邮件,有不少商用网站挖掘了 ...

  6. PHP和JAVASCRIPT判断访客终端是电脑还是手机

    当用户使用手机等移动终端访问网站时,我们可以通过程序检测用户终端类型,如果是手机用户,则引导用户访问适配手机屏幕的移动站点.本文将介绍分别使用PHP和JAVASCRIPT代码判断用户终端类型. PHP ...

  7. PV(访问量)、UV(独立访客)、IP(独立IP) (转)

    网站统计中的PV(访问量):UV(独立访客):IP(独立IP)的定义与区别今天使用了雅虎统计,看到里面就有这个,就说说,其实里面的uv大家可能觉得很新奇,但是和站长统计里的独立访客是一样的嘛.---- ...

  8. 多说【最近访客】JS插件通用代码使用方法

    多说[最近访客]JS插件可以显示近期访问过你的博客并且已经使用向多说授权过的社交网络账号登录的用户头像,效果如下图所示. 最近访客JS插件的添加步骤如下: 1. 添加多说公用JS代码,每个页面只需添加 ...

  9. JS获取访客IP+判断归属地+自动跳转

    由于公司业务需要,需要对网站特定地区的访客进行不同跳转.比如,上海的用户跳转到“shanghai.url.cn”,南京的用户跳转到“nanjing.url.cn”.下面就是我的实现方法,分享出来,顺便 ...

  10. 【竞价网站绝技】根据访客ip,页面显示访客所属城市的html代码(借用YY IP地址库)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. 【记录】MATLAB|Python NumPy|两种语言的数组/矩阵中元素修改方式的总结和对比

    文章目录 二维矩阵 操作 1. 将数组大于0的数全部加1 2. 删除元素 ①删除单个元素 ②删除一列元素 3. 添加一行或多行 ①添加一行 ②添加多行 4. 获取行/列数 5. 格式化输出数组 结构数 ...

  2. vue3 学习-初识体验-组件 component

    组件可以简单理解为 "页面构成的一部分". 组件化是 Vue 最为重要的设计理念之一吧. 早期的前端页面基本上就拆分为一个个的html, css, js 文件, 然后不断" ...

  3. System.Drawing.Point与System.Windows.Point的异同

    在C#中,System.Drawing.Point 和 System.Windows.Point 是两个不同的结构,分别属于不同的命名空间,用于表示二维平面中的点.尽管它们的功能相似,但在使用场景和实 ...

  4. Dify实战案例《AI面试官》更新,支持语音交互+智能知识库+随机题库+敏感词过滤等...

    大模型应用课又更新了,除了之前已经完结的两门课(视频+图文): <Spring AI 从入门到精通> <LangChain4j 从入门到精通> 还有目前正在更新的 <Di ...

  5. vue3和ts和vue-cropper 实现图片裁剪预览

    ​​Vue-Cropper​​ 是一个基于 Vue.js 的图片裁剪组件库,专为 Web 应用设计.当你在网上搜索的时候发现还有一个叫cropper的库,下面是他们的区别: 二.快速上手 //npm ...

  6. [安洵杯 2019]easy_serialize_php 1 WP

    [安洵杯 2019]easy_serialize_php 1 WP 这道题目考察的主要是序列化与反序列化过程中,对象逃逸的一个漏洞. 说是对象逃逸,我觉得可能叫对象注入比较形象. 首先题目上来可以看到 ...

  7. 由 Array.includes 函数引发对引用数据类型的思考

    `` 数组的includes方法在日常的编程中比较常用到,其作用就是判断某一数据是否在数组中,通常来说,数组中的数据如果是数字,布尔值,或者字符串的话,都是能够进行判断的 例如: [1,2,3,4]. ...

  8. ShadowSql之表达式树

    ShadowSql的主要思想通过表和字段的影子来拼写sql .net中的表达式树是作为模型类的影子,非常契合ShadowSql 拿表达式树来拼写sql就和EF类似 一.nuget包 nuget安装Sh ...

  9. CF1983E I Love Balls

    Problem - E - Codeforces 爱丽丝和鲍勃玩摸球游戏.有 \(n\) 个球,其中 \(k\) 个是特殊球.每个球都有其价值. 他们轮流且不放回地摸球,每回合随机摸一个球并获得该球的 ...

  10. win10 hyper-v 配置教程

    非家庭版跳过以下这一步. pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hv.txt ...