传送门

首先(想了很久之后)注意到一个性质:同一条边有多种颜色的话保留3种就可以了,这是因为假如最优解要求当前位置与相邻两条边都不相同,那么只要有3条边,就肯定可以满足这一点。

完事就做一个nlogn*3^4的倍增dp就行了……实际肯定是跑不满的(而且cc机子快)。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define MN 510000
using namespace std; int n,m,l[MN],F[MN][],_F[MN][],v[MN][][][],num=,x,y,w,C[MN][],de[MN];
struct na{
int y,w,ne;
}b[MN<<];
inline void add(int x,int y,int w){b[++num].y=y;b[num].w=w;b[num].ne=l[x];l[x]=num;}
void dfs(int x,int f){
if (F[x][]) return;
F[x][]=x;F[x][]=f;
for (int i=;i<;i++)
if (!(F[x][i]=F[F[F[x][i-]][i-]][])) break;
_F[x][]=f;
for (int i=;i<;i++)
if (!(_F[x][i]=_F[_F[x][i-]][i-])) break; for (int i=l[x];i;i=b[i].ne)
if (b[i].y!=f){
dfs(b[i].y,x);
if (!C[b[i].y][]) C[b[i].y][]=b[i].w;else
if (!C[b[i].y][]) C[b[i].y][]=b[i].w;else
if (!C[b[i].y][]) C[b[i].y][]=b[i].w;
}
}
void DFS(int x,int f){
if (de[x]) return;
de[x]=de[f]+; for (int a=;a<;a++)
for (int b=;b<;b++)
if (a!=b) v[x][][a][b]=-1e8; int tmp1,tmp2,tmp3;
for (int i=;i<;i++)
if (_F[x][i])
for (int a=;a<;a++)
if (C[x][a])
for (int b=;b<;b++)
if (C[F[x][i]][b])
for (int A=;A<;A++)
if (C[F[x][i-]][A])
if ((tmp1=v[x][i-][a][A])>=)
for (int B=;B<;B++)
if (C[_F[x][i-]][B])
if ((tmp2=v[_F[x][i-]][i-][B][b])>=)
if (v[x][i][a][b]<(tmp3=tmp1+tmp2+(C[F[x][i-]][A]!=C[_F[x][i-]][B]))) v[x][i][a][b]=tmp3; for (int i=l[x];i;i=b[i].ne)
if (b[i].y!=x) DFS(b[i].y,x);
}
inline int ask(int x,int y){
if (de[x]>de[y]) swap(x,y);
int ans[][],la[];
memset(ans,,sizeof(ans));
memset(la,,sizeof(la));
for (int i=;i>=;i--)
if (de[_F[y][i]]>=de[x]){
if (la[]==){
for (int a=;a<;a++)
for (int b=;b<;b++)
if (ans[][b]<v[y][i][a][b])
ans[][b]=v[y][i][a][b];
la[]=F[y][i];
y=_F[y][i];
}else{
int tmp[]={,,},TMP;
for (int a=;a<;a++)
if (C[la[]][a])
for (int b=;b<;b++)
if (C[y][b])
for (int c=;c<;c++)
if (C[F[y][i]][c])
if (tmp[c]<(TMP=ans[][a]+v[y][i][b][c]+(C[la[]][a]!=C[y][b]))) tmp[c]=TMP;
for (int a=;a<;a++) ans[][a]=tmp[a]; la[]=F[y][i];
y=_F[y][i];
}
}
if (x==y){
int tmp=;
for (int a=;a<;a++) if (ans[][a]>tmp) tmp=ans[][a];
return tmp;
}
int st[]={x,y};
for (int i=;i>=;i--)
if (_F[st[]][i]!=_F[st[]][i]){
for (int j=;j<;j++){
if (la[j]==){
for (int a=;a<;a++)
for (int b=;b<;b++)
if (ans[j][b]<v[st[j]][i][a][b])
ans[j][b]=v[st[j]][i][a][b];
la[j]=F[st[j]][i];
st[j]=_F[st[j]][i];
}else{
int tmp[]={-,-,-},TMP;
for (int a=;a<;a++)
if (C[la[j]][a])
for (int b=;b<;b++)
if (C[st[j]][b])
for (int c=;c<;c++)
if (C[F[st[j]][i]][c])
if (tmp[c]<(TMP=ans[j][a]+v[st[j]][i][b][c]+(C[la[j]][a]!=C[st[j]][b]))) tmp[c]=TMP;
for (int a=;a<;a++) ans[j][a]=tmp[a]; la[j]=F[st[j]][i];
st[j]=_F[st[j]][i];
}
}
}
int i=;
for (int j=;j<;j++){
if (la[j]==){
for (int a=;a<;a++)
for (int b=;b<;b++)
if (ans[j][b]<v[st[j]][i][a][b])
ans[j][b]=v[st[j]][i][a][b];
la[j]=F[st[j]][i];
st[j]=_F[st[j]][i];
}else{
int tmp[]={-,-,-},TMP;
for (int a=;a<;a++)
if (C[la[j]][a])
for (int b=;b<;b++)
if (C[st[j]][b])
for (int c=;c<;c++)
if (C[F[st[j]][i]][c])
if (tmp[c]<(TMP=ans[j][a]+v[st[j]][i][b][c]+(C[la[j]][a]!=C[st[j]][b]))) tmp[c]=TMP;
for (int a=;a<;a++) ans[j][a]=tmp[a]; la[j]=F[st[j]][i];
st[j]=_F[st[j]][i];
}
}
int tmp=;
for (int a=;a<;a++)
for (int b=;b<;b++)
if (tmp<ans[][a]+ans[][b]+(C[la[]][a]!=C[la[]][b])) tmp=ans[][a]+ans[][b]+(C[la[]][a]!=C[la[]][b]);
return tmp;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);add(y,x,w);
}
dfs(,);DFS(,);
//printf(">_<%d %d %d\n",C[3][0],C[3][1],C[3][2]);
/*for (int i=1;i<=n;i++,puts("")){
printf("%d:",i);
for (int j=0;j<3;j++) printf("%d ",C[i][j]);
}*/
//printf("%d %d\n",v[6][2][0][0],_F[6][2]);
scanf("%d",&m);
while(m--){
scanf("%d%d",&x,&y);
printf("%d\n",ask(x,y));
}
}

Codechef July Challenge 2018 : Subway Ride的更多相关文章

  1. Codechef July Challenge 2018 : Picking Fruit for Chefs

    传送门 好久没写题解了,就过来水两篇. 对于每一个人,考虑一个序列$A$,$A_I$表示当k取值为 i 时的答案. 如果说有两个人,我们可以把$(A+B)^k$二项式展开,这样就发现把两个人合并起来的 ...

  2. Codechef October Challenge 2018 游记

    Codechef October Challenge 2018 游记 CHSERVE - Chef and Serves 题目大意: 乒乓球比赛中,双方每累计得两分就会交换一次发球权. 不过,大厨和小 ...

  3. Codechef September Challenge 2018 游记

    Codechef September Challenge 2018 游记 Magician versus Chef 题目大意: 有一排\(n(n\le10^5)\)个格子,一开始硬币在第\(x\)个格 ...

  4. codechef February Challenge 2018 简要题解

    比赛链接:https://www.codechef.com/FEB18,题面和提交记录是公开的,这里就不再贴了 Chef And His Characters 模拟题 Chef And The Pat ...

  5. Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal

    原文链接http://www.cnblogs.com/zhouzhendong/p/9010945.html 题目传送门 - Codechef STMINCUT 题意 在一个有边权的无向图中,我们定义 ...

  6. Codechef August Challenge 2018 : Chef at the River

    传送门 (要是没有tjm(Sakits)的帮忙,我还真不知道啥时候能做出来 结论是第一次带走尽可能少的动物,使未带走的动物不冲突,带走的这个数量就是最优解. 首先这个数量肯定是下界,更少的话连第一次都 ...

  7. Codechef August Challenge 2018 : Safe Partition

    传送门 (虽然是A了但是不知道复杂度是不是正确的 考虑以某个位置为结尾的合法划分 先考虑min,带来的影响是限制了最小长度,预处理出这个最小长度后,这可以在处理到这个数时,把不能算的部分去掉(不满足m ...

  8. Codechef August Challenge 2018 : Interactive Matrix

    传送门 首先整个矩阵可以被分为很多小矩阵,小矩阵内所有行的单调性是一样的,所有列的单调性是一样的. 考虑如何在这样一个小矩阵中找出答案.我的策略是每次取四个角中最大值和最小值的点,这样可以每次删掉一行 ...

  9. Codechef August Challenge 2018 : Lonely Cycles

    传送门 几波树形dp就行了. #include<cstdio> #include<cstring> #include<algorithm> #define MN 5 ...

随机推荐

  1. solr的搜索

    主要讲一下solr面板的使用: 查询 q:     查询用  语法: name:刘中华      支持通配符 ? 表示单个任意字符的通配 * 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号 ...

  2. 纯js Ajax 请求

    var XMLHttpReq; function createXMLHttpRequest() { if(window.ActiveXObject ) { try { XMLHttpReq = new ...

  3. 第十三节:HttpHander扩展及应用(自定义扩展名、图片防盗链)

    一. 自定义扩展名 1. 前言 凡是实现了IHttpHandler接口的类均为Handler类,HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...

  4. [译]Ocelot - Load Balancer

    原文 可以对下游的服务进行负载均衡. 提供了下面几种负载均衡: LeastConnection - tracks which services are dealing with requests an ...

  5. 基于scrapy-redis分布式爬虫的部署

    redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...

  6. 第三周 数据分析之概要 Pandas库数据特征分析

    数据的排序: 数据的基本统计分析 : 数据的累计统计分析: 数据的相关分析: 单元小结

  7. 【原创】大叔问题定位分享(18)beeline连接spark thrift有时会卡住

    spark 2.1.1 beeline连接spark thrift之后,执行use database有时会卡住,而use database 在server端对应的是 setCurrentDatabas ...

  8. iOS -- Effective Objective-C 阅读笔记 (9)

    // 将类的实现方法代码反三到便于管理的数个分类之中.        // 类中经常容易填满各种方法, 而这些方法的代码则全部堆在一个巨大的实现文件中, 有时这么做事不合理的,因为即使通过重构把这个类 ...

  9. django 实战篇之视图层

    视图层(views.py) django必会三板斧 HttpResponse >>> 返回字符串 render >>> 支持模板语法,渲染页面,并返回给前端 red ...

  10. Spring设置定时任务时,关于执行时间的规则设置

    been需要在xml文件中进行配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE bean ...