正题


题目大意

一个理想城市有nnn个块构成,有以下性质

  1. 任意两个块之间可以通过其他块到达
  2. 任意两个块之间可以不通过其他块(通过空位)到达

然后求每个块之间的距离之和。


解题思路

我们将横竖的距离分开计算。

假设现在我们考虑计算竖向的边的距离,我们将横向的连续的块缩成一个点(如下图)

然后将相邻的两个块连边,这样,因为上面的性质那么就能够保证这样是一个树形结构。然后计算每条边对应这些数对来说总共被走了多少次。也就是对于每条x−>yx->yx−>y的边,那么有(n−sizey)∗sizey(n-size_y)*size_y(n−sizey​)∗sizey​这么多个点对走过这条边

然后横着计算一次竖着计算一次将答案加和即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define p(x,y) ((x)*n+(y))
#define ll long long
using namespace std;
const ll N=100100,XJQ=1e9,M=3123656;
struct node{ll x,y;
}w[N];
struct edge_node{ll to,next;
}a[M*2];
map<int,int> bz;
ll n,bx,mx,cnt,size[M],ls[M],tot,by,be[M];
long long ans;
bool cmp(node x,node y)
{return x.x==y.x?x.y>y.y:x.x<y.x;}
void adde(ll x,ll y)
{if(a[ls[x]].to==y) return;a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void dp(ll x,ll fa)
{for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa) continue;dp(y,x);size[x]+=size[y];}for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa) continue;ans=(ans+(long long)(size[y]*(n-size[y]))%XJQ)%XJQ;}
}
void Reset()
{sort(w+1,w+1+n,cmp);for(ll i=1;i<=n;i++)bz[p(w[i].x,w[i].y)]=i;for(ll i=n;i>=1;i--){ll x=w[i].x,y=w[i].y;if(be[i]==0){be[i]=i;size[i]=1;for(ll j=i-1;j>=1;j--)if(w[j].y==w[j+1].y+1) be[j]=i,size[i]++;else break;}ll k=bz[p(x+1,y)];if(k)adde(be[k],be[i]),adde(be[i],be[k]);}
}
int main()
{freopen("city.in","r",stdin);freopen("city.out","w",stdout);scanf("%lld",&n);bx=2147483647;by=2147483647;for(ll i=1;i<=n;i++)scanf("%lld%lld",&w[i].x,&w[i].y),bx=min(bx,w[i].x),by=min(by,w[i].y);for(ll i=1;i<=n;i++)w[i].x-=bx-1,w[i].y-=by-1;Reset();dp(be[1],0);swap(bx,by);for(ll i=1;i<=n;i++)swap(w[i].x,w[i].y);tot=0;memset(ls,0,sizeof(ls));memset(be,0,sizeof(be));memset(size,0,sizeof(size));bz.clear();Reset();dp(be[1],0);printf("%lld",ans);
}

jzoj3738-[NOI2014模拟7.11]理想城市(city)【树,模型转换】相关推荐

  1. jzoj3736. 【NOI2014模拟7.11】数学题

    Description Input 输入有多组测例,每组测例有一行,为4 个整数x1,y1, x2, y2,含义见题目描述.输入文件以EOF 结束. Output Sample Input 3 0 1 ...

  2. JZOJ 5814. 【NOIP提高A组模拟2018.8.14】 树

    梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

  3. C语言模拟11答案,C语言模拟试题11答案.doc

    C语言模拟试题11答案.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档 ...

  4. 备战Noip2018模拟赛11(B组)T4 Path 好路线

    10月27日备战Noip2018模拟赛11(B组) T4路径好路线 题目描述 nodgd在旅游.现在,nodgd要从城市的西北角走到东南角去.这个城市的道路并不平坦,nodgd希望找出一条相对比较好走 ...

  5. 5814. 【NOIP提高A组模拟2018.8.14】 树(期望 + 倍增)

    5814. [NOIP提高A组模拟2018.8.14] 树 Problem 给定一棵nnn个点的树,m" role="presentation">mmm次询问,每次 ...

  6. 一文带你入门机器学习中的树模型(附源码)

    树模型 树模型在机器学习中至关重要,它不仅本身具有较好的性能,也可以用于优化其他的算法. 我们在本节将要介绍优化KNN~KNN~ KNN 算法的树模型以及决策树. 一.KNN~KNN~ KNN 的数据 ...

  7. 7. Jackson用树模型处理JSON是必备技能,不信你看

    每棵大树,都曾只是一粒种子.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BA ...

  8. 树模型集成学习(Tree Embedding)

    树模型集成学习 集成学习主要有两个思想,分别是bagging和boosting.树模型的集成模型都是使用树作为基模型,最常用的cart树,常见的集成模型有RandomForest.GBDT.Xgboo ...

  9. Nat. Mach. Intell.|从局部解释到全局理解的树模型

    今天介绍美国华盛顿大学保罗·艾伦计算机科学与工程学院的Su-In Lee团队在nature mechine intelligence 2020的论文,该论文提出了一种基于博弈论沙普利值的TreeExp ...

最新文章

  1. 北京林业大学学python吗_个人主页
  2. oracle字符串只截取中文,Oracle提取字符串中“汉字”串的解决办法
  3. 剑指offer 求1+2+3+...+n
  4. 智能家居 (2) ——设计模式的引入
  5. php 修改上传文件大小 (max_execution_time post_max_size)
  6. [MM9]复制格式的快捷操作
  7. 菜鸟教程 之 HTML DOM 和 浏览器BOM
  8. inner join on 加条件和where加条件_图解 SQL 中各种连接 JOIN
  9. python的json.dump参数使用
  10. TextView图文混排
  11. 2013Esri全球用户大会QA之ArcGIS Online(上)
  12. 怎么判断冠词用a还是an_如何判断单词前的冠词用a还是an
  13. 从果粉到黑吃黑:一个论坛挂马的奇异反转
  14. bat命令实现游戏存档自动备份
  15. Java 后端工程师 2018 书单推荐
  16. 如何打造一个低效能技术团队?
  17. linux 设置.cshrc 使cd后直接ll显示文件和目录
  18. C++实现简易(多人弹幕控制主播游戏人物类型,CMD_迷宫小游戏)(二)
  19. 这一路~~jncip
  20. 医学影像手术规划和手术导航

热门文章

  1. html插入图片和文字,HTML第三课文字图片插入
  2. C语言中比较大小的函数模板,C语言中实现模板函数小结 : 不敢流泪
  3. 攻城时服务器维护,8月31日服务器维护更新公告
  4. 在栈中压入一个字符串c语言,面试题 31:栈的压入、弹出序列
  5. PHP防QQ列表右划,react native 实现类似QQ的侧滑列表效果
  6. 基本系统设备感叹号更新不了_电脑识别不了U盘?别紧张,免费教你如何解决...
  7. aspose excel中文文档_除了VBA,还有哪些编程语言可以操作Excel文件?
  8. [Nginx]负载均衡和动静分离
  9. [SpringBoot2]自动配置
  10. 《C++ Primer》7.4节练习