闲扯

最近有点颓,都修到好晚,早上起来和吔shi一样难受

忍着困意把题面看完,发现啥也不会,又是一场写暴力的模拟赛

T1发现似乎可以DP,顺手码了个

T2像个最小瓶颈路板子,但是只做过N^2算法的...

T3我是真的傻,估计全场就我一人以为只能往前跳于是写了个DP

结果30+35+0

然后发现T1爆了,后面都输出负数,全部用long long 后交了发,居然95?!wtf

后面发现最naiive的贪心都有90,这数据比联赛还水啊,后面发现只有一个点的一次询问答案不一样,打个表就A了

T1 colour

gu

T2 graph

一看就发现这种边就是最小瓶颈路(边),根据最小生成树也是最小瓶颈生成树的性质,我们可以在最小生成树上DFS求到所有点对的最小瓶颈路.

但怎么找符合条件的点对?对于L=0的子任务,我们可以在Kruskal过程中每新加入一条边就计算两个联通块大小的乘积,由于我们的边是从小到大排序的,这条新加入的边一定是这两个联通块点对之间的最小瓶颈路

正解使用了Kruskal重构树,不了解的先去学习一下(我也是做这题才学的)

容易发现,两个原树上的点在重构树上的LCA的点权就是两点间的最小瓶颈路长度,这样只需要求一个LCA的时间复杂度就可以得到两点之间的最小瓶颈路

然后运用启发式合并的思路,我们可以枚举原树上的每一条边计算它的贡献,然后进入重构树上对应点相邻的两棵子树中较小的那一棵枚举点,这样就能得到了两个约束条件:一个是DFS序的约束(因为另一个点必须在另一棵较大的子树中),一个是颜色范围的约束

又转化成并不喜闻乐见的二维数点问题,离线+树状数组+二维前缀和即可

然后发现WA了,xxzh大佬说要注意l=0的情况,改后又RE了,交了几发终于A了...不过跑得好慢

其实这题一开始想线段树合并的,但是没有想到启发式合并,晚上有大佬提供线段树合并的思路就是每个联通块维护权值线段树,Kruskal连一条边的时候,进入较小的块枚举然后在另一棵树上线段树查询

这样的话也是两个log

  1. /*
  2. code by RyeCatcher
  3. */
  4. inline char gc(){
  5. static char buf[SIZE],*p1=buf,*p2=buf;
  6. return p1==p2&&(p2=(p1=buf)+fread(buf,1,SIZE,stdin),p1==p2)?EOF:*p1++;
  7. }
  8. template <class T>inline void read(T &x){
  9. x=0;int ne=0;char c;
  10. while((c=gc())>'9'||c<'0')ne=c=='-';x=c-48;
  11. while((c=gc())>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48;x=ne?-x:x;return ;
  12. }
  13. const int maxn=600005;
  14. const int inf=0x7fffffff-10;
  15. int n,m,l,c[maxn],mx_c=0;
  16. struct Nico{
  17. int x,y,dis;
  18. bool operator <(const Nico &rhs)const{
  19. return dis<rhs.dis;
  20. }
  21. }nico[maxn];
  22. int pa[maxn];
  23. int get(int x){return (pa[x]==x)?(pa[x]):(pa[x]=get(pa[x]));}
  24. int cnt=0,w[maxn<<1],fa[maxn<<1],ch[maxn<<1][2],size[maxn<<1];
  25. int dfn[maxn<<1],tot=0,ed[maxn<<1];
  26. ll sum[maxn<<3],qry[maxn];
  27. inline void add(int x,int d){for(;x<=2*n-1;x+=x&(-x))sum[x]+=d;}
  28. inline ll query(int x){ll tmp=0;for(;x>=1;x-=x&(-x))tmp+=sum[x];return tmp;}
  29. struct QAQ{
  30. int x,y,d,id;
  31. bool operator <(const QAQ & rhs)const{
  32. return (x==rhs.x)?id<rhs.id:x<rhs.x;
  33. }
  34. }qwq[maxn*25];int num=0;
  35. void pre_dfs(int now){
  36. int v;
  37. dfn[now]=++tot,size[now]=1;
  38. //printf("--%d %d--\n",now,fa[now]);
  39. if(ch[now][0])pre_dfs(ch[now][0]);
  40. if(ch[now][1])pre_dfs(ch[now][1]);
  41. size[now]+=(size[ch[now][0]]+size[ch[now][1]]);
  42. ed[now]=tot;
  43. if(now>=1&&now<=n){
  44. qwq[++num]=(QAQ){c[now],dfn[now],1,0};
  45. //printf("%d %d\n",dfn[now],c[now]);
  46. }
  47. return ;
  48. }
  49. int L,R,LL,RR;
  50. void dfs(int now,int id){
  51. int v;
  52. if(ch[now][0])dfs(ch[now][0],id);
  53. if(ch[now][1])dfs(ch[now][1],id);
  54. //LL=max(0,c[now]-l),RR=min(c[now]+l,mx_c);
  55. if(now>n||now<1)return ;
  56. LL=c[now]-l,RR=c[now]+l;if (!l) RR++;
  57. qwq[++num]=(QAQ){-inf-1,L-1,1,id};
  58. qwq[++num]=(QAQ){-inf-1,R,-1,id};
  59. qwq[++num]=(QAQ){LL,L-1,-1,id};
  60. qwq[++num]=(QAQ){LL,R,1,id};
  61. qwq[++num]=(QAQ){RR-1,L-1,1,id};
  62. qwq[++num]=(QAQ){RR-1,R,-1,id};
  63. qwq[++num]=(QAQ){inf,L-1,-1,id};
  64. qwq[++num]=(QAQ){inf,R,1,id};
  65. //printf("%d %d %d %d %d %d\n",now,L,R,LL,RR,id);
  66. return ;
  67. }
  68. int main(){
  69. //freopen("graph19.in","r",stdin);
  70. FO(graph);
  71. int x,y,z;
  72. read(n),read(m),read(l);
  73. for(ri i=1;i<=n;i++)pa[i]=i,read(c[i]),mx_c=max(mx_c,c[i]);
  74. for(ri i=n+1;i<=n*2+2;i++)pa[i]=i;
  75. for(ri i=1;i<=m;i++){
  76. read(x),read(y),read(z);
  77. nico[i]=(Nico){x,y,z};
  78. }
  79. std::sort(nico+1,nico+1+m);
  80. cnt=n;
  81. for(ri i=1;i<=m;i++){
  82. x=nico[i].x,y=nico[i].y;
  83. x=get(x),y=get(y);
  84. if(x==y)continue;
  85. pa[x]=++cnt,pa[y]=cnt;
  86. fa[x]=cnt,fa[y]=cnt,ch[cnt][0]=x,ch[cnt][1]=y;
  87. w[cnt]=nico[i].dis;
  88. //printf("%d %d()()()\n",cnt,w[cnt]);
  89. if(cnt==2*n-1)break;
  90. }
  91. fa[cnt]=0;
  92. pre_dfs(cnt);
  93. //for(ri i=1;i<=cnt;i++)printf("--%d %d %d %d %d %d--\n",i,fa[i],ch[i][0],ch[i][1],dfn[i],ed[i]);
  94. for(ri i=n+1;i<=cnt;i++){
  95. x=ch[i][0],y=ch[i][1];
  96. if(size[x]>size[y])std::swap(x,y);
  97. L=dfn[y],R=ed[y];
  98. //printf("**%d %d %d %d\n",i,L,R,w[i]);
  99. dfs(x,i);
  100. }
  101. std::sort(qwq+1,qwq+1+num);
  102. for(ri i=1;i<=num;i++){
  103. if(qwq[i].id==0){
  104. //printf("%d %d\n",qwq[i].y,qwq[i].d);
  105. add(qwq[i].y,1);
  106. }
  107. else{
  108. //printf("%d %d %lld %d %d\n",qwq[i].id,qwq[i].d,query(qwq[i].y),qwq[i].x,qwq[i].y);
  109. qry[qwq[i].id]+=qwq[i].d*query(qwq[i].y);
  110. }
  111. }//return 0;
  112. ll ans=0;
  113. //for(ri i=n+1;i<=cnt;i++)printf("&&&%d %d\n",i,w[i]);
  114. for(ri i=n+1;i<=cnt;i++){
  115. //printf("%d %d %d\n",i,qry[i],w[i]);
  116. ans+=qry[i]*w[i];
  117. }
  118. printf("%lld\n",ans);
  119. return 0;
  120. }

[NOIP2018模拟赛10.25]瞎搞报告的更多相关文章

  1. [NOIP2018模拟赛10.16]手残报告

    [NOIP2018模拟赛10.16]手残报告 闲扯 炉石乱斗模式美滋滋啊,又颓到好晚... 上来T2先敲了树剖,看T1发现是个思博DP,然后没过大样例,写个暴力发现还是没过大样例!?才发现理解错题意了 ...

  2. [NOIP2018模拟赛10.18]自闭报告

    闲扯 这一天,菜鸡RyeCatcher又想起来了被毒瘤题支配的恐惧 今天比较好玩,还是ljy提醒才发现文件夹里有题面...不知道外面的人什么时候才发现 看完了题面,又回到了雅礼啥题也不会写的感觉 T1 ...

  3. [NOIP2018模拟赛10.22]咕咕报告

    闲扯 这是篇咕咕了的博客 考场上码完暴力后不知道干什么,然后忽然发现这个T1好像有点像一道雅礼集训时讲过的CF题目 Rest In Shades ,当时那道题还想了挺久不过思路比较妙,于是我就也\(y ...

  4. [NOIP2018模拟赛10.20A]挂分报告

    闲扯 先看看了B组,T1 ZROI刚好讲过一个性质原根一般很小的,直接枚举;T2一眼二分然后似乎状压 T3没看 然后上来A组题,T1 flow这名字...网络流?! T1题面非常的社会主义核心价值观, ...

  5. [NOIP2018模拟赛10.23]发呆报告

    闲扯 考场看了眼题目感觉很难,一个小时敲完了所有暴力...嗯然后就在那里发呆什么事也没做 T3考场上把数据结构想了个遍都不会完成1操作,现在看这种思路其实之前也接触过... 比较玄学的一件事情就是T1 ...

  6. [NOIP2018模拟赛10.19]只会暴力报告

    闲扯 今天又是暴力满满(并不)的一天呢 昨天老师说了分数要正态分布,今天看起来...不过暴力分很多,虽然我人太傻逼又没打满 T1 woc?不是说送分的吗,看起来又是个树形DP神题,暴力告辞,链上的搞一 ...

  7. NOIP2017提高组模拟赛 10 (总结)

    NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...

  8. EZ 2018 06 10 NOIP2018 模拟赛(十八)

    好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...

  9. NOIP2018 模拟赛(二十二)雅礼NOI

    Preface 这次的题目都是NOI+的题,所以大家的分数都有点惨烈. 依靠T1大力骗分水到Rank2 所以想看正解的话看这里吧 A. 「雅礼NOI2018模拟赛(一) Day1」树 看一眼题目感觉十 ...

随机推荐

  1. excel怎么把一个sheet的 全部内容打印到一页纸上

    参考 https://jingyan.baidu.com/article/5225f26b04005ee6fa090830.html

  2. Ubuntu18.04修改主机名和网卡地址

    date: 2019-06-26 09:56:04 author :headsen chen notice :个人原创 1,Ubuntu18.04 设置固定IP: 2,Ubuntu 18.04 设置主 ...

  3. DBUtil内部实现过程解读

    python数据库连接工具DBUtils DBUtils是一个允许在多线程python应用和数据库之间安全及高效连接的python模块套件. 模块 DBUtils套件包含两个模块子集,一个适用于兼容D ...

  4. MySQL高性能优化指导思路

    MySQL架构图: 连接池组件.管理服务和工具组件.SQL接口组件.查询分析器组件.优化器组件.缓冲组件.插件式存储引擎.物理文件: 1.连接层:主要完成一些类似于连接处理,授权认证及相关的方案: 2 ...

  5. Spring Cloud(6.3):搭建OAuth2 Resource Server

    配置web.xml 添加spring-cloud-starter-security,spring-security-oauth2-autoconfigure2个依赖. <!-- Spring c ...

  6. 【Leetcode_easy】697. Degree of an Array

    problem 697. Degree of an Array 题意:首先是原数组的度,其次是和原数组具有相同的度的最短子数组.那么最短子数组就相当于子数组的首末数字都是统计度的数字. solutio ...

  7. Struts 2 --ONGL介绍

    先了解一下OGNL的概念 OGNL的全名称Object Graph Navigation Language.全称为对象图导航语言,是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取J ...

  8. 第十四章 SSL——《跟我学Shiro》

    目录贴:跟我学Shiro目录贴 对于SSL的支持,Shiro只是判断当前url是否需要SSL登录,如果需要自动重定向到https进行访问. 首先生成数字证书,生成证书到D:\localhost.key ...

  9. iOS-UIScrollView滚动视图(转)

    http://blog.csdn.net/iukey/article/details/7319314 UIScrollView 类负责所有基于 UIKit 的滚动操作. 一.创建 CGRect bou ...

  10. maven:手动上传jar私服

    转:https://www.jianshu.com/p/b8ec688c388e 打包时提示私服中找不到以下jar包 在私服中搜索确实找不到,后来知道这些是老系统的jar包没有deploy到私服 经分 ...