题解 \(by\;zj\varphi\)

颜色数很少,考虑枚举颜色数。

建出来一棵最小生成树,可以证明在最小生成树上,一个点到另一个点的路径上的最大权值最小(易证,考虑 \(\rm kruskal\) 的原理)。

在最小生成树上 \(dfs\) 一遍,求出到达每种颜色的最小权值,询问时枚举每种颜色即可。

Code:
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf,OPUT[100];
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++;
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(!isdigit(ch)) {if (ch=='-') f=0;ch=gc();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
template<typename T>inline void print(T x,char t) {
if (x<0) putchar('-'),x=-x;
if (!x) return putchar('0'),(void)putchar(t);
ri cnt(0);
while(x) OPUT[p(cnt)]=x%10,x/=10;
for (ri i(cnt);i;--i) putchar(OPUT[i]^48);
return (void)putchar(t);
}
}
using IO::read;using IO::print;
namespace nanfeng{
#define FI FILE *IN
#define FO FILE *OUT
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
typedef long long ll;
static const int N=5e5+7;
int c[N],first[N],fa[N],dis[N],vis[N],st[N],cnt,t=1,n,m,q,opt,x,MOD;
ll ans;
struct edge{int v,nxt,w;}I[N],e[N<<1];
inline void add(int u,int v,int w) {
e[t].v=v,e[t].w=w,e[t].nxt=first[u],first[u]=t++;
e[t].v=u,e[t].w=w,e[t].nxt=first[v],first[v]=t++;
}
inline int operator<(const edge &e1,const edge &e2) {return e1.w<e2.w;}
int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
inline void kruskal() {
sort(I+1,I+m+1);
for (ri i(1);i<=n;p(i)) fa[i]=i;
for (ri i(1);i<=m;p(i)) {
int u=I[i].v,v=I[i].nxt,w=I[i].w;
if (find(u)==find(v)) continue;
fa[find(u)]=v;
add(u,v,w);
}
}
void dfs(int x,int fa,int mx) {
dis[c[x]]=cmin(dis[c[x]],mx);
for (ri i(first[x]),v;i;i=e[i].nxt) {
if ((v=e[i].v)==fa) continue;
dfs(v,x,cmax(mx,e[i].w));
}
}
inline int main() {
//FI=freopen("nanfeng.in","r",stdin);
//FO=freopen("nanfeng.out","w",stdout);
read(n),read(m),read(q),read(x),read(opt);
if (opt) read(MOD);
for (ri i(1);i<=n;p(i)) {
read(c[i]);
if (!vis[c[i]]) vis[c[i]]=1,st[p(cnt)]=c[i];
}
for (ri i(1);i<=m;p(i)) read(I[i].v),read(I[i].nxt),read(I[i].w);
kruskal();
memset(dis,127,sizeof(dis));
dfs(x,0,0);
for (ri i(1);i<=q;p(i)) {
register ll l,r;
read(l),read(r);
if (opt) {
(l^=ans)%=MOD,(r^=ans)%=MOD;
l+=1,r+=1;
if (l>r) swap(l,r);
}
ans=0;
for (ri j(1);j<=cnt;p(j)) {
if (dis[st[j]]<=l) ans+=r-l+1;
else if (dis[st[j]]<=r) ans+=r-dis[st[j]]+1;
}
print(ans,'\n');
}
return 0;
}
}
int main() {return nanfeng::main();}

NOIP 模拟 $27\; \rm 牛半仙的妹子图$的更多相关文章

  1. NOIP 模拟 $27\; \rm 牛半仙的妹子Tree$

    题解 \(by\;zj\varphi\) 很妙的虚树题. 考虑若没有操作 \(2\),那么直接记录一下扩散到它的最短时间和询问时间相比即可,可以当作一个树上最短路. 有 \(2\) 操作怎么办,将操作 ...

  2. NOIP 模拟 $27\; \rm 牛半仙的妹子序列$

    题解 \(by\;zj\varphi\) 明显一道极长上升子序列的题. 直接线段树维护单调栈,最后单调栈求出可以贡献的序列,答案相加就行. Code #include<bits/stdc++.h ...

  3. 2020牛客NOIP赛前集训营-提高组(第三场) C - 牛半仙的妹子Tree (树链剖分)

    昨天教练问我:你用树剖做这道题,怎么全部清空状态呢?    我:???不是懒标记就完了???    教练:树剖不是要建很多棵线段树吗,不止log个,你要一个一个清?    我:为什么要建很多棵线段树? ...

  4. 7.29考试总结(NOIP模拟27)[牛半仙的妹子图·Tree·序列]

    前言 从思路上来讲是比较成功的,从分数上就比较令人失望了. 考场上是想到了前两个题的正解思路,其实最后一个题是半个原题,只可惜是我看不懂题... 这波呀,这波又是 语文素养限制OI水平.. 改题的时候 ...

  5. 2021.7.29考试总结[NOIP模拟27]

    T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...

  6. noip模拟27[妹子图·腿·腰](fengwu半仙的妹子们)

    \(noip模拟27\;solutions\) 这次吧,我本来以为我能切掉两个题,结果呢??只切掉了一个 不过,隔壁Varuxn也以为能切两个,可惜了,他一个都没切...... 确实他分比我高一点,但 ...

  7. 2020牛客NOIP赛前集训营-提高组(第三场)C-牛半仙的妹子Tree【虚树,最短路】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7609/C 题目大意 给出\(n\)个点的一棵树,\(m\)个时刻各有一个操作 标记一个点,每个点被标记后的每 ...

  8. 2021.5.22 noip模拟1

    这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...

  9. NOIP模拟3

    期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...

随机推荐

  1. Java 内存泄漏知多少?

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员.我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 面试的时候内存管理是不是很多面 ...

  2. angular小记

    declarations:包装组件或指令等 providers:依赖注入 imports:导入其他模块 bootstrap:设置根组件 exports:导出组件或指令等 app.component.t ...

  3. sql通用行列转换

    -- 行转列 select 姓名, SUM(case 课程 when '语文' then 分数 else 0 end) as 语文, SUM(case 课程 when '数学' then 分数 els ...

  4. bat自动创建快捷方式并更换图标

    1 :: 此脚本主要的作用创建1.自动创建快捷方式:2.自动更换快捷方式图标 2 @echo off 3 >nul 2>&1 "%SYSTEMROOT%\system32 ...

  5. C语言:逻辑运算符||

    #include <stdio.h> //逻辑运算符||特点:左右两边的表达式先做左边,如果左边为1则右边不用执行,整个结果为1:如果左边为0,再执行右边: main() { int x= ...

  6. C语言:特殊点

    编译器给变量分配内存在函数外部定义的变量叫做全局变量(Global Variable),在函数内部定义的变量叫做局部变量(Local Variable)一个变量,即使不给它赋值,它也会有一个默认的值, ...

  7. Leetcode:559. N叉树的最大深度

    Leetcode:559. N叉树的最大深度 Leetcode:559. N叉树的最大深度 Talk is cheap . Show me the code . /* // Definition fo ...

  8. P5350 序列

    P5350 序列 题意 维护一个序列,支持区间求和.赋值.加值.复制.交换.翻转操作,其中交换和复制操作保证两段区间长度相等且不交.答案对 \(1e9+7\) 取模. 思路 对于区间求和.赋值.加值. ...

  9. cookie详解(八)

    一.什么是cookie 1.大概了解 什么是 Cookie?针对不同用户,做出不同的响应.,这就是Cookie的原理.是浏览器储存在用户的机器上的(可见免用户名登录)1. Cookie翻译过来是饼干的 ...

  10. [考试总结]noip模拟21

    中位数要排序!!!!!! 中位数要排序!!!!!! 中位数要排序!!!!!! 中位数要排序!!!!!! 中位数要排序!!!!!! 分差不加绝对值!!!! 分差不加绝对值!!!! 分差不加绝对值!!!! ...