2019-01-09

22:56:33

终于终于把这道题目做掉了。。。

做了两个晚上。。不知道为什么自己如此之笨。。

在洛谷上断断续续一共交了24次,感觉自己都要被封号了。

昨天花半个晚上从零开始研究动态的 淀粉质 点分治,又研究了好久的标程,然后又动手写了半个晚上。

好不容易过了样例,交到洛谷上一测,满屏的 MLE 然后把氧气优化关掉 TLE ?!!!? (手动懵逼

开始了漫长的 找不同(对比标程) 之旅,找了很久都没有结果,就回家了。

还嘲笑了一波 标称那堆神秘的分层操作,不知道哪里来的一些RMQ操作,我用倍增就可以求距离了(这是个Flag,这是第二天啪啪打脸的伏笔)


第二天

中午放学一回家就开始检查程序,又交了好几次,每一次都是零分,每一次都是MLE(连WA的机会都不给我吗!!)

我真的感觉我的程序和标程除了倍增求距离的方法不同其它的几乎都没有差别了好吗?!(坐等打脸)

去上学 去上学 这几天停课复习会考科目(12号会考),春哥说:“辣么简单的考试你们担心什么啦~”

晚自习继续来到机房修改程序。

EXM??? 我居然发现我把重心 vis掉的地方写错了 果然,照着标程写会受惩罚的。。。

自信满满地交上去一看 只有20分!(还T了一组。。

路漫漫其修远兮

凉 真的找不到错啊啊啊啊啊啊啊啊! 痛苦!!!

冷静地写了对拍

镇定地把中间数据输出来调

冷漠地寻找错误答案与正确答案之间的蛛丝马迹

镇静地把数据规模调到1e5

我终于终于发现 我的倍增写错了!!!!!

父亲节点 f[x][0] 完全赋错值了,直接就写成了 f[x][0]=fa (...)

改好后信心满满地交上去

90分。。。有一组超时了(还开了O2优化)

冷静下来 我思考了一下,每次都倍增的话不是会很慢吗?!

题目的查询有那么多次 肯定超时啊!

难怪标程用了ST表来查公共祖先

难怪有一个神秘的RMQ 就是来求LCA的啊!!

ST表可以通过 O(nlogn) 的复杂度代价来得到 O(1) 查询的啊。

啪啪啪 打脸

感到了自负对我深深地恶意。。

然后马不停蹄地开始改倍增,全部换成RMQ。

折腾了十几分钟,再次提交。

还是90! 第四组居然 WA了!! 五雷轰顶!!

又找了好久的错,才发现 DFS 时 由于写太快,少了一条语句。。

然后终于AC

完结撒花!!

一道题目写了这么久,真的要好好反思一下了,写程序时一定要带着脑子思考,不能照着标程写啊。

“剽窃”别人的智慧结晶是不会有好下场的。。

附上写到麻木的200行代码

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<iomanip>
#include<queue> #define For(i,a,b) for(int i=a;i<=b;++i)
#define Dwn(i,a,b) for(int i=a;i>=b;--i)
#define Pn putchar('\n') using namespace std;
const int N=1e5+;
struct Heap {
priority_queue<int> h, d;
void add(int x){
h.push(x);
return;
}
void del(int x){
d.push(x);
return;
}
void AorP(int x,int f){
if(f) add(x);
else del(x);
return;
}
void fix(){
while(d.size()&&h.top()==d.top())
h.pop(),d.pop();
return;
}
void pop(){
fix();
h.pop();
return;
}
int fst(){
fix();
return h.top();
}
int scd(){
int a,b;
a=fst();
pop();
b=fst();
add(a);
return b;
}
int size(){
return h.size()-d.size();
}
} s1[N], s2[N], s3; int head[N],nxt[N*],v[N*],cnt=;
int siz[N],f[N*][],dis[N],Mxs[N],Wfa[N];
bool vis[N*];
int n,m,x,y,root,tot,Frt,Qsum=,LD[N],Q;
char c[]; inline void read(int &v){
v=;
char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<='')v=v*+c-'',c=getchar();
}
void write(int x){
if(x>)write(x/);
int xx=x%;
putchar(xx+'');
}
void add(int ux,int vx){
cnt++;
nxt[cnt]=head[ux]; head[ux]=cnt; v[cnt]=vx;
cnt++;
nxt[cnt]=head[vx]; head[vx]=cnt; v[cnt]=ux;
} void dfsRT(int x,int fa){
siz[x]=; Mxs[x]=;
for(int i=head[x];i;i=nxt[i]){
int vv=v[i];
if(vv==fa||vis[i])continue;
dfsRT(vv,x);
siz[x]+=siz[vv];
Mxs[x]=max(Mxs[x],siz[vv]);
}
if(tot-siz[x]>Mxs[x])Mxs[x]=tot-siz[x];
if(Mxs[x]<Mxs[root])root=x;
}
int getWRT(int x,int fa,int sz){
root=; tot=sz; Mxs[]=;
dfsRT(x,fa);
return root;
}
void dfsBD(int x,int fa,int dep,Heap &s){
s.add(dep);
for(int i=head[x];i;i=nxt[i]){
int vv=v[i];
if(vis[i]||vv==fa)continue;
dfsBD(vv,x,dep+,s);
}
}
void AddS3(Heap &s){
if(s.size()>=){
s3.add(s.fst()+s.scd());
}
return;
}
void DelS3(Heap &s){
if(s.size()>=){
s3.del(s.fst()+s.scd());
}
}
void work(int x){
s2[x].add();
for(int i=head[x];i;i=nxt[i]){
int vv=v[i];
if(vis[i])continue;
vis[i]=vis[i^]=;
Heap s;
dfsBD(vv,,,s);
int nxtRt=getWRT(vv,x,siz[vv]);
Wfa[nxtRt]=x;
s1[nxtRt]=s;
s2[x].add(s1[nxtRt].fst());
work(nxtRt);
}
AddS3(s2[x]);
return;
} int pos[*N][],dfx[N*],fr[N],dpx[N*],dep[N],ID=;
void dfsLCA(int x,int d,int fa){
fr[x]=++ID;
dpx[ID]=d; dep[x]=d;
for(int i=head[x];i;i=nxt[i]){
int vv=v[i];
if(vv==fa)continue;
dfsLCA(vv,d+,x);
ID++;
dpx[ID]=d;
}
}
void inLCA(){
For(i,,ID)f[i][]=dpx[i];
for(int j=;(<<j)<=ID;++j)
for(int i=;i+(<<j)-<=ID;++i){
f[i][j]=min(f[i][j-],f[i+(<<(j-))][j-]);
}
} int LCA(int x,int y){
int l=fr[x]; int r=fr[y];
if(x==y)return ;
if(l>r)swap(l,r);
int Kx=-;
int dx=r-l+;
while((<<(Kx+))<=dx)Kx++;
int ans;
ans=min(f[r-(<<Kx)+][Kx],f[l][Kx]);
return ans;
} int Dis(int x,int y){
return dep[x]+dep[y]-*LCA(x,y) ;
} void upD(int x,int fg){
DelS3(s2[x]);
s2[x].AorP(,fg);
AddS3(s2[x]);
for(int u=x;Wfa[u];u=Wfa[u]){
DelS3(s2[Wfa[u]]);
if(s1[u].size())
s2[Wfa[u]].del(s1[u].fst());
s1[u].AorP(Dis(Wfa[u],x),fg);
if(s1[u].size())
s2[Wfa[u]].add(s1[u].fst());
AddS3(s2[Wfa[u]]);
}
return;
}
int main(){
//freopen("ex.in","r",stdin);
//freopen("ex.out","w",stdout);
memset(vis,,sizeof(vis));
// memset(f,-1,sizeof(f));
read(n);
For(i,,n-){
read(x); read(y); add(x,y);
}
Frt=getWRT(,,n);
dfsLCA(Frt,,); inLCA();
work(Frt);
read(Q);
Qsum=n;
For(i,,Q){
scanf("%s",c); ;
if(c[]=='C'){
read(x);
upD(x,LD[x]);
if(LD[x])Qsum++;
else Qsum--;
LD[x]=LD[x]^;
}else{
if(Qsum==)write(),Pn;
if(Qsum==)putchar('-'),putchar(''),Pn;
if(Qsum>=){
int fn=s3.fst();
write(fn);
Pn;
}
}
}
return ;
}

【ZJOI2007】捉迷藏 小小的总结的更多相关文章

  1. 洛谷 P2056 [ZJOI2007]捉迷藏 解题报告

    P2056 [ZJOI2007]捉迷藏 题目描述 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由\ ...

  2. 树上最长链 Farthest Nodes in a Tree LightOJ - 1094 && [ZJOI2007]捉迷藏 && 最长链

    树上最远点对(树的直径) 做法1:树形dp 最长路一定是经过树上的某一个节点的. 因此: an1[i],an2[i]分别表示一个点向下的最长链和次长链,次长链不存在就设为0:这两者很容易求 an3[i ...

  3. 洛谷 P2056 [ZJOI2007]捉迷藏 题解【点分治】【堆】【图论】

    动态点分治入 门 题? 题目描述 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由 \(N\) 个屋 ...

  4. 洛谷 P2056 [ZJOI2007]捉迷藏 || bzoj 1095: [ZJOI2007]Hide 捉迷藏 || 洛谷 P4115 Qtree4 || SP2666 QTREE4 - Query on a tree IV

    意识到一点:在进行点分治时,每一个点都会作为某一级重心出现,且任意一点只作为重心恰好一次.因此原树上任意一个节点都会出现在点分树上,且是恰好一次 https://www.cnblogs.com/zzq ...

  5. [ZJOI2007]捉迷藏(动态点分治/(括号序列)(线段树))

    题目描述 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条 ...

  6. [ZJOI2007] 捉迷藏

    idea1 可能会死掉的想法:考虑点分治维护每个分治中心x到达分治块内的个点距离,具体是用堆维护分治快内的x的儿子y到y的子树内的所有点距离(记为C[y]),取所有C[y]的top+e(x,y)放入x ...

  7. Luogu P2056 [ZJOI2007]捉迷藏

    入坑动态点分治的题目,感觉还不错被卡常后重构代码 首先静态点分治相信大家肯定都会,就是不断找重心然后暴力计算每棵子树内的贡献. 这题如果只有单次询问,我们很容易想到对于每个分治中心的所以儿子的子树中找 ...

  8. BZOJ.1095.[ZJOI2007]捉迷藏(线段树 括号序列)

    BZOJ 洛谷 对树DFS得到括号序列.比如这样一个括号序列:[A[B[E][F[H][I]]][C][D[G]]]. 那比如\(D,E\)间的最短距离,就是将\(D,E\)间的括号序列取出:][[] ...

  9. 【bzoj1095】 ZJOI2007—捉迷藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1095 (题目链接) 题意 一棵树,求最远的两黑点之间的距离,每次可以将黑点染白或者将白点染黑. So ...

随机推荐

  1. MySQL 中事务的实现

    在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的: 在这篇文章中,我们将对事务的实现进行分析, ...

  2. bind(),live(),delegate(),on()绑定事件方式

    1.bind():向匹配元素添加一个或多个事件处理器. 适用所有版本,但是自从jquery1.7版本以后bind()函数推荐用on()来代替. $(selector).bind(event,data, ...

  3. 分享知识-快乐自己:oracle表分区详解

    从以下几个方面来整理关于分区表的概念及操作: 1)表空间及分区表的概念: 2)表分区的具体作用: 3)表分区的优缺点: 4)表分区的几种类型及操作方法: 5)对表分区的维护性操作: 1):表空间及分区 ...

  4. 单元测试:TESTNG和powermock的使用

    pom文件: <properties>        <testng.version>6.8</testng.version>        <powermo ...

  5. codeforces 658C C. Bear and Forgotten Tree 3(tree+乱搞)

    题目链接: C. Bear and Forgotten Tree 3 time limit per test 2 seconds memory limit per test 256 megabytes ...

  6. 1053 Path of Equal Weight (30)(30 分)

    Given a non-empty tree with root R, and with weight W~i~ assigned to each tree node T~i~. The weight ...

  7. 「P3385」【模板】负环(spfa

    题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 ...

  8. ACM学习历程—HDU1719 Friend(数论)

    Description Friend number are defined recursively as follows. (1) numbers 1 and 2 are friend number; ...

  9. [SHOI 2017] 分手是祝愿

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4872 [算法] 首先发现 , 对于一个开关 , 按下2次和没按是等价的 , 因此每个 ...

  10. 洛谷 P2285 [HNOI2004]打鼹鼠

    题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探出头来透透气. ...