连发三篇爆炸实录我的心态竟然还这么好……

昨天题目的D2。稍难。

这也不是我连续拿倒数第一的理由。

T1不会。赛时硬写了一个30分的三次方暴力。还有一个地方写挂了。如果不是数据足够水我就爆零了。

也就是说我的11分subtask1还是捡来的。

最难过的是T2。T2写了乱搞(正解之一??)。然而并没有调出来。

二维莫队。我写的很顺。没什么细节错误。然而,

我是在最后20分钟才开始打的。也就是说我最一开始并没有打二维莫队。

一方面是觉得这东西复杂度应该不对。另一方面,我不会离散化。

对。我不会离散化。

之前学离散化的时候就不是很理解。记得还是OJ能发帖子的时期。我还在OJ里发了个帖子问了一下。

当时还不是很熟的wba大神还给回了。然而依旧不理解。就这么放过去了。

后来也遇到了几道需要离散化的题。全都是靠着利哥坐我旁边指导着我那一句话该怎么写才过掉。

也就是说,我从来从来没有独立写过离散化。

对。就这短短的几行,几句话,我从来没有自己,认认真真的写过。

我也从来没有想到过,有一天我会死在离散化上。

然而这就是发生了。突如其来,刻骨铭心。

以小见大。我给自己挖的坑到底有多少,谁也不知道。

基础不牢,地动山摇。

大神绝对不仅仅是会几个强大的算法,会复杂的数学。

基础同样重要。从今天起要填坑了。庆幸吧,这不是CSP-S2019的赛场。

但如果这还没有给我敲响警钟的话,这就是我在CSP-S2019的下场。

最后强行yy了离散化上去。以为自己打的是对的。然而并不对。

lower_bound的一个参数写错了。样例死活过不去。

赛后整整20分钟,我才发现了这个错误。A掉了。

然而,假如这是CSPS的赛题。我又能如何呢。填坑,势在必行了。


又是好久没有写题解了。每天被大佬们拖着走吊着打的感觉……emmmp。

昨天某考试报名于是没有考试,才有时间来写一波题解。顺便祭奠一下垫底记。

T1施工(单调栈优化dp)

我可以管这个东西叫填坑dp么/大雾

我们设$f_i$为转移到i位置,且第i个位置高度不变的答案。

关于$f_i$的转移我们可以推出性质:

对于一个位置$i$和它前面一个位置$j$,一定要将它们之间填平才能继续转移。

(填平是指填成平地而非一定要和$i$、$j$平齐,原因待会儿解释)

我们假设$f_i$从$f_j$转移而来且$i$、$j$之间填平后高度为t。

则显然$i$、$j$之间对答案的贡献为:

$\sum\limits_{k=j+1}^{i-1}(t-h_k)^2+c(h_j+h_i-2t)$

(式子解释:$\sum(t-h_k)^2$是填坑的花费,填平后的不美观度只有两头的贡献。所以为$c(h_j+h_i-2t)$)

于是中间的高度可以由二次函数对称轴公式计算。最后计算式子的最小值。

一次项系数中的$\sum h_k$和常数项里的$\sum h_k^2$直接前缀和维护一下就可以$O(1)$查询了。

考虑那些点可以用来转移$f_i$。

一个点j可以转移$f_i$当且仅当i与j之间的所有建筑高度都要小于等于$h_i$和$h_j$,并且i和j还不能挨着(否则中间没有坑)。

因此考虑单调栈维护转移点。

由于我是顺序扫每一个建筑,因此当扫到i的时候,栈顶一定与i相邻。

所以用$top-1$作为转移点转移i点。

至于转移到什么时候为止,当我扫到单调栈中某一个位置的高度已经比我要高了,那么我显然不能再跨过这个建筑与下一个建筑进行转移。也就是说不满足上述的条件停止就行了。

一些细节需要特殊注意。

然后解释一下上面的某个性质:假如我i、j之间并不填平,而是填成这个鬼样子:

那么我中间填的贡献一定在i-1的时候被计算过了。

所以只有填平才能不重不漏地更新。

T2蔬菜(四维偏序、莫队压正解)

正解CDQ套CDQ??树状数组套CDQ??我才不要打CDQ(其实是不会打吧……)。莫队好优秀的。

离散化一下简单莫队就好了。因为是二维的,所以四个while循环变成了八个。

我打的是最最最暴力的一种(或许),询问排序都没分块……大佬们都用奇偶性排序……

然后就变成了最慢的AC了……统计也是最暴力的统计。但实测可A 23333。

T3联盟(大力dfs、错解AC)

我可以十分负责任得跟你讲:打完这道题,我看到dfs就想吐……

我大概写了6个dfs……调了一整天……加上调试语句代码破5.0k……

好吧我承认这是我码力太弱了。旁边大神4个dfs就解决了。

我不想回忆过程……扔个代码就是了。

(另外,这是错解……只能处理树上只有一个直径的情况??或者是说另外几条直径对答案没有影响。

大概就是说ans2要输出的那几条边在这几条直径上都是重合的……正解看脸哥的。)

#include<bits/stdc++.h>
#define rint register int
#define read(A) A=init()
#define N 300005
using namespace std;
inline int init()
{
int a=,b=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')b=-;ch=getchar();}
while(ch>=''&&ch<=''){a=(a<<)+(a<<)+ch-'';ch=getchar();}
return a*b;
}
int n,v[N<<],id[N<<],nxt[N<<],first[N],tot=;
int len[][N],lenth,len_rot,du[N],st,en,line[N],cnt,fr[N],to[N];
int ans1=0x7fffffff,ans2_sum,ans2[N],ans3[],len_to[][N],oo[];
bool in_line[N],vis[],ky[N];
inline void add(int uu,int vv,int line_id)
{
v[++tot]=vv,id[tot]=line_id,
nxt[tot]=first[uu],first[uu]=tot;
}
inline void dfs_Getlenth(int x,int fa)//true
{
for(rint i=first[x];i;i=nxt[i])
{
int y=v[i];if(y==fa)continue;
dfs_Getlenth(y,x);len[][x]=max(len[][x],len[][y]+);
if(len[][x]>len[][x])swap(len[][x],len[][x]);
}
if(len[][x]+len[][x]>lenth)
lenth=len[][x]+len[][x],len_rot=x;
return ;
}
inline void dfs_Getpoint(int x,int fa)//true
{
in_line[x]=;
if(du[x]==){if(!st)st=x;else en=x;}
for(rint i=first[x];i;i=nxt[i])
{
int y=v[i];if(y==fa)continue;
if(len[][y]==len[][x]-)
{
// cout<<x<<"->"<<y<<endl;
dfs_Getpoint(y,x);
break;
}
}
return ;
}
inline void dfs_Getline(int x,int fa)//true
{
for(rint i=first[x];i;i=nxt[i])
{
int y=v[i];
// if(fr[id[i]]==3)cout<<"the point:"<<y<<' '<<in_line[y]<<endl;
if(y==fa||(in_line[y]==))continue;
// cout<<"line: "<<id[i]<<" become true;"<<endl;
// cout<<x<<"->"<<y<<endl;
line[++cnt]=id[i];ky[id[i]]=,ky[id[i^]]=;
dfs_Getline(y,x);break;
}
return ;
}
inline void dfs_Getlen(int ID,int x,int fa,int res)//true
{
len_to[ID][x]=max(res,len_to[ID][x]);
int lin=;
for(rint i=first[x];i;i=nxt[i])
{
int y=v[i];if(y==fa)continue;
if(ky[id[i]]){lin=i;continue;}
dfs_Getlen(ID,y,x,res+);
len_to[ID][x]=max(len_to[ID][x],len_to[ID][y]);
}
len_to[ID][v[lin]]=len_to[ID][x];
if(lin)dfs_Getlen(ID,v[lin],x,res+);
return ;
}
inline int dfs_Getans(int ID,int drie,int x,int fa)
{
int lin=;
// cout<<" run to the "<<x<<" point;"<<endl;
for(rint i=first[x];i;i=nxt[i])
{
if(!ky[id[i]])continue;
if(id[i]==drie)break;
int y=v[i];if(y==fa)continue;
lin=max(lin,dfs_Getans(ID,drie,y,x));
}
return max(len_to[ID][x],lin);
}
inline int dfs_Getans_3(int ID,int x,int fa,int res)
{
// cout<<ID<<' '<<x<<' '<<fa<<' '<<res<<endl;
if(res==((oo[ID]+)/))return x;
for(rint i=first[x];i;i=nxt[i])
{
if(!ky[id[i]])continue;
if(v[i]==fa)continue;
return dfs_Getans_3(ID,v[i],x,res+);
}
}
int main()
{
// freopen("dt.in","r",stdin);
// freopen("my.out","w",stdout);
read(n);
for(rint i=,Angel,Scott;i<n;++i)
{
read(Angel),read(Scott),du[Angel]++,du[Scott]++,
add(Angel,Scott,i),add(Scott,Angel,i);
fr[i]=Angel,to[i]=Scott;
}
dfs_Getlenth(,);
// cout<<"lenth:"<<lenth<<endl;
// cout<<"len_rot:"<<len_rot<<endl;
for(rint i=first[len_rot];i;i=nxt[i])
{
in_line[len_rot]=;
if(du[len_rot]==)st=len_rot;
if(vis[]&&vis[])break;int y=v[i];
if((!vis[])&&len[][y]==len[][len_rot]-)
{
// cout<<"the first:"<<len_rot<<"->"<<y<<endl;
dfs_Getpoint(y,len_rot);vis[]=;
}
else if((!vis[])&&len[][y]==len[][len_rot]-)
{
// cout<<"the second:"<<len_rot<<"->"<<y<<endl;
dfs_Getpoint(y,len_rot);vis[]=;
}
}
// cout<<"st:"<<st<<",en:"<<en<<endl;
// for(rint i=1;i<=n;++i)if(in_line[i])cout<<i<<' ';cout<<endl;
dfs_Getline(st,);
// cout<<"the key lines:"<<endl;for(rint i=1;i<=cnt;++i)cout<<line[i]<<' '<<fr[line[i]]<<' '<<to[line[i]]<<endl;
dfs_Getlen(,st,,);
dfs_Getlen(,en,,);
// cout<<"following are debug of the dfs_Getlen:"<<endl;
// cout<<" to st:";for(rint i=1;i<=n;++i)cout<<len_to[0][i]<<' ';cout<<endl;
// cout<<" to en:";for(rint i=1;i<=n;++i)cout<<len_to[1][i]<<' ';cout<<endl;
for(rint i=;i<=cnt;++i)
{
int lin=;
// cout<<"-------------------------"<<endl;
// cout<<"cutting the "<<line[i]<<endl;
// cout<<" checking the Left"<<endl;
int Left=min(len_to[][to[line[i]]],len_to[][fr[line[i]]]);//dfs_Getans(0,line[i],st,0);
// cout<<" checking the Right"<<endl;
int Right=min(len_to[][to[line[i]]],len_to[][fr[line[i]]]);//dfs_Getans(1,line[i],en,0);
// cout<<"cut the "<<i<<",the Left is "<<Left<<",the Right is "<<Right<<endl;
lin=max((int)(ceil((double)Left/)+ceil((double)Right/))+,max(Left,Right));
if(lin<ans1)
{
ans1=lin,ans2_sum=,ans2[]=line[i];
ans3[]=fr[line[i]],ans3[]=to[line[i]],oo[]=Left,oo[]=Right;
}
else if(lin==ans1)ans2[++ans2_sum]=line[i];
}
// cout<<"oo"<<oo[0]<<' '<<oo[1]<<endl;
ans3[]=dfs_Getans_3(,st,,);
ans3[]=dfs_Getans_3(,en,,);
printf("%d\n%d",ans1,ans2_sum);
sort(ans2+,ans2+ans2_sum+);
for(rint i=;i<=ans2_sum;++i)printf(" %d",ans2[i]);puts("");
printf("%d %d %d %d\n",ans3[],ans3[],ans3[],ans3[]);
return ;
}
/*
4
1 2
2 3
3 4 7
1 2
2 4
1 3
3 5
3 6
6 7 8
4 2
5 2
2 1
1 3
3 6
6 7
7 8 */

0922CSP-S模拟测试赛后总结的更多相关文章

  1. 0823NOIP模拟测试赛后总结

    考了两场感觉虚了... NOIP模拟测试30 分着考的. 就只有T2的美妙的暴力拿分了,60分rank10,挂了. T1是一道sb题,爆零了十分遗憾. 许多人都掉进了输出格式的坑里,C没大写.少个空格 ...

  2. 0929CSP-S模拟测试赛后总结

    70分31名滚粗. 赛后发现赛时得到的分数全都是暴力分…… T2打的三分跑都没跑……边界设错了……赛后稍微调了调多了15分…… 据说有15分的暴力分,那么另外15分就是只有一种选择的情况了…… (如果 ...

  3. 0924CSP-S模拟测试赛后总结

    50分-rank28 我是第二机房垫底大垃圾. 赛时T1和T2其实想到了正解??安慰自己罢了. 真正的CSP-S的赛后你还能和主办方争论说自己其实想到了正解要求人家硬给你个省一不成?? 出题人不知道到 ...

  4. 0917CSP-S模拟测试赛后总结

    机房搬家后的首战,便是失利. 依旧是挂掉了.这次状态有大问题. 然而状态的问题归根结底还是实力不行. 大约一个小时左右我拿到了T1的部分分.赛时判断了一下大概是高分. (不过赛后发现确实不算什么太高的 ...

  5. 0910CSP-S模拟测试赛后总结

    %%%外校参加国赛大佬kai神-rank1 ---------------以上选手实力开挂---------------- %%%skyh.NC锅-rank2 %%%神牛170-rank4 %%%迪哥 ...

  6. 0908CSP-S模拟测试赛后总结

    我早就料到昨天会考两场2333 话说老师终于给模拟赛改名了啊. 距离NOIP祭日还有60天hhh. 以上是废话. %%%DeepinC无敌神 -rank1 zkt神.kx神.动动神 -rank2 有钱 ...

  7. 0907NOIP模拟测试赛后总结

    120分rank26.我又被打回原型了…… 下午考的.中午由于种种原因并没有睡好.于是状态很差. 第一眼看题感觉T1是一道XX题.部分分竟然给这么肥 然后看T2.T3好像都还不是特别恶心的题目,挺常规 ...

  8. 0906NOIP模拟测试赛后总结

    我进前十辣.然而有10个大佬去学LCT了于是没有考试. Dybala神和exzkt神分-rank1,奶风神和林哥分-rank3,wc.miemeng和DuanYue神140分-rank5. 我.ooo ...

  9. 0903NOIP模拟测试赛后总结

    分-rank33.这次考试心态挂了. 拿到题目通读三道题,发现都十分恶心. 然后把时间押到了T1上.将近两个小时,打了个dfs,一直调调调. 最后没调出来,手模了个数据就把自己两个小时的思路hack了 ...

随机推荐

  1. java oop第14章_Swing(Java界面设计)

    一.   Swing相关的概念: 1.  GUI:(Graphical User Interface):图形化用户界面,通过图形化的方式提供与用户交互的平台,向用户展示信息.收集用户提交的数据. 2. ...

  2. Java泛型中extends和super的区别?

    <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...

  3. 2019-5-16-WPF-光标初始化的时候-temp-文件夹满了无法创建

    title author date CreateTime categories WPF 光标初始化的时候 temp 文件夹满了无法创建 lindexi 2019-05-16 19:16:27 +080 ...

  4. JS window对象取消计时器clearInterval() clearInterval() 方法可取消由 setInterval() 设置的交互时间。

    取消计时器clearInterval() clearInterval() 方法可取消由 setInterval() 设置的交互时间. 语法: clearInterval(id_of_setInterv ...

  5. 从零开始搭建系统1.4——MySql安装及配置

    安装环境:CentOS7 64位 ,安装MySQL5.7 1.创建mysql目录 2.在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo ...

  6. 2019牛客暑期多校训练营(第六场)Palindrome Mouse 回文树+dfs

    题目传送门 题意:给出一个字符串,将字符串中所有的回文子串全部放入一个集合里,去重后.问这个集合里有几对<a,b>,使得a是b的子串. 思路:一开始想偏了,以为只要求每个回文串的回文后缀的 ...

  7. Mysql事务学习笔记

    Mysql事务学习笔记 1.事务概述 事务是数据库的执行单元,它包含了一条或多条sql语句,进行的操作是要么全部执行,要么全部都不执行. 2.事务执行命令 语法格式: start transactio ...

  8. 用Cygwin实现在window环境下使用Linux命令-nohup 来后台运行程序

    1.安装Cygwin 下载 cygdrive-选择64或32位   http://www.cygwin.com/ 注:可以百度搜索安装步骤 2.配置它的环境变量 添加到path路径中 3.cmd  执 ...

  9. Batch - %~dp0 vs %cd%

    总结 %~dp0 只表示将要“运行的”bat命令的folder,不包含bat自己的名称. %cd%表示,“运行处”的folder . 示例脚本内容 cd-dp0.bat存放在f盘 @echo off ...

  10. 解决MySQL登录密码正确却提示错误-1045的方法

    MySQL密码正确却无法本地登录-1045 Access denied for user 'root'@'localhost' (using password:YES MySQL密码正确却无法本地登录 ...