7.18 NOI模拟赛 因懒无名 线段树分治 线段树维护直径
LINK:因懒无名
20分显然有\(n\cdot q\)的暴力。
还有20分 每次只询问一种颜色的直径不过带修改。
容易想到利用线段树维护直径就可以解决了。
当然也可以进行线段树分治 每种颜色存一下直径的端点即可。
考虑100分。
考虑到直径两个端点有区间可加性 所以直接外面套一个线段树维护区间端点即可。
修改采用上述做法两种均可。然后就做完了.
code
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<queue>
#include<deque>
#include<stack>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 100001
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007ll
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-4
#define sq sqrt
#define S second
#define F first
#define mod 1000000007
#define l(p) t[p].l
#define r(p) t[p].r
#define L(p) t[p].L
#define R(p) t[p].R
#define mx(p) t[p].mx
using namespace std;
char *fs,*ft,buf[1<<15];
inline char gc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;
}
const int MAXN=100010;
int n,m,len,Q,maxx,id,cnt,vv,ww,rt;
int c[MAXN],root[MAXN],d[MAXN];
int f[MAXN<<1][20],Log[MAXN<<1],dfn[MAXN],g[MAXN],pos[MAXN];
int lin[MAXN],nex[MAXN<<1],ver[MAXN<<1];
vector<int>w;
inline void add(int x,int y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
inline void dfs(int x,int fa)
{
f[++cnt][0]=x;dfn[x]=cnt;d[x]=d[fa]+1;
//f为ST表元素 ->dfn->cnt
g[++id]=x;pos[id]=x;//g为dfs序->pos->id;
go(x)if(tn!=fa)
{
dfs(tn,x);
f[++cnt][0]=x;
}
}
inline int cmp(int x,int y){return d[x]>d[y]?y:x;}
inline int LCA(int x,int y)
{
x=dfn[x];y=dfn[y];
if(x>y)swap(x,y);
int z=Log[y-x+1];
return cmp(f[x][z],f[y-(1<<z)+1][z]);
}
inline int dist(int x,int y)
{
if(!x||!y)return 0;
int lca=LCA(x,y);
return d[x]+d[y]-2*d[lca];
}
struct wy
{
int l,r,L,R;int mx;
inline wy friend operator +(wy a,wy b)
{
if(!b.L&&!b.R)return a;
if(!a.L&&!a.R)return b;
wy c;
if(a.mx>b.mx)c=a;else c=b;
if((ww=dist(a.L,b.L))>c.mx)c.L=a.L,c.R=b.L,c.mx=ww;
if((ww=dist(a.L,b.R))>c.mx)c.L=a.L,c.R=b.R,c.mx=ww;
if((ww=dist(a.R,b.L))>c.mx)c.L=a.R,c.R=b.L,c.mx=ww;
if((ww=dist(a.R,b.R))>c.mx)c.L=a.R,c.R=b.R,c.mx=ww;
return c;
}
}t[MAXN*60];
inline void insert(int &p,int l,int r,int x,int w)
{
if(!p)p=++vv;
if(l==r)
{
L(p)=R(p)=w;
return;
}
int mid=(l+r)>>1;
if(x<=mid)insert(l(p),l,mid,x,w);
else insert(r(p),mid+1,r,x,w);
int wl=l(p),wr=r(p);
t[p]=t[l(p)]+t[r(p)];
t[p].l=wl;t[p].r=wr;
}
inline void build(int &p,int l,int r)
{
p=++vv;
if(l==r){t[p]=t[root[l]];return;}
int mid=(l+r)>>1;
build(l(p),l,mid);
build(r(p),mid+1,r);
int wl=l(p),wr=r(p);
t[p]=t[l(p)]+t[r(p)];
t[p].l=wl;t[p].r=wr;
}
inline void change(int p,int l,int r,int x)
{
if(l==r)
{
t[p]=t[root[x]];
return;
}
int mid=(l+r)>>1;
if(x<=mid)change(l(p),l,mid,x);
else change(r(p),mid+1,r,x);
int wl=l(p),wr=r(p);
t[p]=t[l(p)]+t[r(p)];
t[p].l=wl;t[p].r=wr;
}
inline wy ask(int p,int l,int r,int L,int R)
{
if(!p)return t[0];
if(L<=l&&R>=r)return t[p];
int mid=(l+r)>>1;
if(R<=mid)return ask(l(p),l,mid,L,R);
if(L>mid)return ask(r(p),mid+1,r,L,R);
return ask(l(p),l,mid,L,R)+ask(r(p),mid+1,r,L,R);
}
int main()
{
freopen("noname.in","r",stdin);
freopen("noname.out","w",stdout);
get(n);get(m);get(Q);
rep(1,n,i)get(c[i]);
rep(2,n,i)
{
int get(x),get(y);
add(x,y);add(y,x);
}
dfs(1,0);
rep(2,cnt,i)Log[i]=Log[i>>1]+1;
rep(1,Log[cnt],j)rep(1,cnt-(1<<j)+1,i)f[i][j]=cmp(f[i][j-1],f[i+(1<<j-1)][j-1]);
rep(1,n,i)insert(root[c[i]],1,n,g[i],i);
build(rt,1,m);
rep(1,Q,i)
{
int get(op),get(L),get(R);
if(op==1)
{
insert(root[c[L]],1,n,g[L],0);
change(rt,1,m,c[L]);
c[L]=R;
insert(root[c[L]],1,n,g[L],L);
change(rt,1,m,c[L]);
}
else put(ask(rt,1,m,L,R).mx);
}
return 0;
}
</details>
7.18 NOI模拟赛 因懒无名 线段树分治 线段树维护直径的更多相关文章
- 7.18 NOI模拟赛 树论 线段树 树链剖分 树的直径的中心 SG函数 换根
LINK:树论 不愧是我认识的出题人 出的题就是牛掰 == 他好像不认识我 考试的时候 只会写42 还有两个subtask写挂了 拿了37 确实两个subtask合起来只有5分的好成绩 父亲能转移到自 ...
- 计蒜客模拟赛 #5 (B 题) 动态点分治+线段树
虽然是裸的换根dp,但是为了在联赛前锻炼码力,强行上了点分树+线段树. 写完+调完总共花了不到 $50$ 分钟,感觉还行. code: #include <bits/stdc++.h> # ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- 6.28 NOI模拟赛 好题 状压dp 随机化
算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...
- 【2018.12.10】NOI模拟赛3
题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...
- NOI 模拟赛 #2
得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...
- 【NOI P模拟赛】最短路(树形DP,树的直径)
题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...
- NOI模拟赛Day5
T1 有and,xor,or三种操作,每个人手中一个数,求和左边进行某一种运算的最大值,当t==2时,还需要求最大值的个数. test1 20% n<=1000 O(n^2)暴力 test2 2 ...
- NOI模拟赛Day4
看到成绩的时候我的内心** woc第一题写错了呵呵呵呵呵呵呵呵 人不能太浪,会遭报应的** ------------------------------------------------------ ...
随机推荐
- MySQL分库分表的原则
一.分表 当一个表的数据达到几千万条的时候,每一次查询都会花费更长的时间,如果这时候在使用链表查询,那么我想应该会实在那里,那么我们应该如何解决这个问题呢? 1.为什么要分表: 分表的目的就是为了解决 ...
- python数据处理(七)之数据探索和分析
1.探索数据 1.1 安装agate库 1.2 导入数据 1.3 探索表函数 a.排序 b.最值,均值 c.清除缺失值 d.过滤 e.百分比 1.4 连结多个数据集 a.捕捉异常 b.去重 c.缺失数 ...
- Python之爬虫(二十五) Scrapy的中间件Downloader Middleware实现User-Agent随机切换
总架构理解Middleware 通过scrapy官网最新的架构图来理解: 这个图较之前的图顺序更加清晰,从图中我们可以看出,在spiders和ENGINE提及ENGINE和DOWNLOADER之间都可 ...
- JavaScript动画实例:螺旋线
数学中有各式各样富含诗意的曲线,螺旋线就是其中比较特别的一类.螺旋线这个名词来源于希腊文,它的原意是“旋卷”或“缠卷”.例如,平面螺旋便是以一个固定点开始向外逐圈旋绕而形成的曲线.在2000多年以前, ...
- Facebook没有测试工程师,如何进行质量控制的?
Facebook从04年的哈佛校园的学生项目在短短的7-8年的时间中快速增长为拥有10亿用户的世界上最大的社交网络,又一次见证了互联网创业成功的奇迹.同时它的产品研发流程也成为了众多互联网产品公司的追 ...
- Ethical Hacking - GAINING ACCESS(10)
CLIENT SIDE ATTACKS Use if server-side attacks fail. If IP is probably useless. Require user interac ...
- OSCP Learning Notes - Exploit(5)
Java Applet Attacks Download virtual machines from the following website: https://developer.microsof ...
- JAVA 面向对象 三大特征:继承
什么是继承 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接访 ...
- Jmeter操作MySQL数据库详解
一.jmeter操作数据库的原理 jmeter不可直接操作数据库,必须通过驱动程序来间接操作,但如果数据库不是在本地而是云服务器上的话就需要通过网络来操作. jmeter通过驱动程序来完成对MySQL ...
- Jmeter(十八) - 从入门到精通 - JMeter后置处理器 -下篇(详解教程)
1.简介 后置处理器是在发出“取样器请求”之后执行一些操作.取样器用来模拟用户请求,有时候服务器的响应数据在后续请求中需要用到,我们的势必要对这些响应数据进行处理,后置处理器就是来完成这项工作的.例如 ...