我丢 之前sun在某校集训给我看过 当时也没想起来 今天补省集的锅的时候发现 wok这题我还听过?!

身败名裂.jpg (可是你记性不好这事情不已经人尽皆知了吗?

咳咳 回归正题

考虑对于两个同色的点:

1)不构成祖先关系

那么两个子树里的点都不能选 相当于矩形覆盖

2)构成祖先关系

祖先刨掉一个子树,儿子子树不能选

拆成两个矩形

最后考虑统计答案,发现对称做然后(总点数-答案)/2就是答案

(因为对角线上的点总是合法的 所以要加上qwq)

然后就是矩形的并数点了 直接扫描线+线段树就好了

//Love and Freedom.
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<cassert>
#define ll long long
#define inf 20021225
#define N 100010
#define pb push_back
using namespace std;
int read()
{
int s=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
//--------- tree -----------
struct edge{int to,lt;}e[N<<];
int in[N],cnt,dep[N],sz[N],f[N][],dfn[N],tms,idfn[N];
void add(int x,int y)
{
e[++cnt].to=y; e[cnt].lt=in[x]; in[x]=cnt;
e[++cnt].to=x; e[cnt].lt=in[y]; in[y]=cnt;
}
void dfs(int x)
{
dfn[x]=++tms; idfn[tms]=x; sz[x]=;
for(int i=;i<;i++) f[x][i]=f[f[x][i-]][i-];
for(int i=in[x];i;i=e[i].lt)
{
int y=e[i].to; if(y==f[x][]) continue;
dep[y]=dep[x]+; f[y][]=x; dfs(y); sz[x]+=sz[y];
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
int len=dep[x]-dep[y];
for(int i=;i<;i++) if(len>>i&)
x=f[x][i];
if(x==y) return x;
for(int i=;~i;i--) if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][];
}
int col[N];
struct node
{
int xd,xu,y,v;
}p[N*];
bool operator<(node a,node b){return a.y<b.y;}
//----------- SGT ------------
// 0->not fully covered >0 -> fully covered
#define ls x<<1
#define rs x<<1|1
int s[N<<],tag[N<<];
void insert(int x,int l,int r,int LL,int RR,int v)
{
if(RR<LL) return;
if(LL<=l&&RR>=r)
{
tag[x]+=v;
if(tag[x]>) s[x]=r-l+;
else if(l==r) s[x]=;
else s[x]=s[ls]+s[rs];
return;
}
int mid=l+r>>;
if(LL<=mid) insert(ls,l,mid,LL,RR,v);
if(mid<RR) insert(rs,mid+,r,LL,RR,v);
if(!tag[x]) s[x]=s[ls]+s[rs];
}
vector<int> cc[N];
int tot;
int main()
{
//freopen("tree3-4.in","r",stdin);
int n=read();
for(int i=;i<=n;i++) col[i]=read(),cc[col[i]].pb(i);
for(int i=;i<n;i++) add(read(),read()); dfs();
for(int i=;i<=n;i++)
for(int j=;j<cc[i].size();j++) for(int k=j+;k<cc[i].size();k++)
{
int x=cc[i][j],y=cc[i][k],z=LCA(x,y);
if(z==x||z==y)
{
if(z==y) swap(x,y);
int len=dep[y]-dep[x]-; x=y;
for(int i=;i<;i++) if(len>>i&)
x=f[x][i];
p[++tot]=(node){,dfn[x]-,dfn[y],};
p[++tot]=(node){,dfn[x]-,dfn[y]+sz[y],-};
p[++tot]=(node){dfn[x]+sz[x],n,dfn[y],};
p[++tot]=(node){dfn[x]+sz[x],n,dfn[y]+sz[y],-}; p[++tot]=(node){dfn[y],dfn[y]+sz[y]-,,};
p[++tot]=(node){dfn[y],dfn[y]+sz[y]-,dfn[x],-};
p[++tot]=(node){dfn[y],dfn[y]+sz[y]-,dfn[x]+sz[x],};
p[++tot]=(node){dfn[y],dfn[y]+sz[y]-,n+,-};
}
else
{
p[++tot]=(node){dfn[x],dfn[x]+sz[x]-,dfn[y],};
p[++tot]=(node){dfn[x],dfn[x]+sz[x]-,dfn[y]+sz[y],-};
p[++tot]=(node){dfn[y],dfn[y]+sz[y]-,dfn[x],};
p[++tot]=(node){dfn[y],dfn[y]+sz[y]-,dfn[x]+sz[x],-};
}
}
sort(p+,p+tot+); ll ans=;
for(int i=;i<=tot;i++)
{
insert(,,n,p[i].xd,p[i].xu,p[i].v);
if(i!=tot && p[i].y!=p[i+].y)
ans+=1ll*(p[i+].y-p[i].y)*s[];
}
printf("%lld\n",(1ll*n*(n+)-ans)>>);
return ;
}

LOJ6279 果树的更多相关文章

  1. LOJ6276:果树——题解

    https://loj.ac/problem/6276#submit_code NiroBC 姐姐是个活泼的少女,她十分喜欢爬树,而她家门口正好有一棵果树,正好满足了她爬树的需求.这颗果树有N 个节点 ...

  2. Jmeter查看结果树Unicode编码转中文方法

    本文为转载微信公众号文章,如作者发现后不愿意,请联系我进行删除 在jmeter工具的使用中,不管是测试接口还是调试性能时,查看结果树必不可少,然而在查看响应数据时,其中的中文经常以Unicode的编码 ...

  3. 【线段树 扫描线 二维数点】loj#6276. 果树

    路径计数转成二维数点很妙啊 题目描述 NiroBC 姐姐是个活泼的少女,她十分喜欢爬树,而她家门口正好有一棵果树,正好满足了她爬树的需求. 这颗果树有 $N$ 个节点,标号 $1 \ldots N$ ...

  4. Jmeter学习笔记(七)——监听器元件之察看结果树

    在jmeter中,如果我们需要查看请求结果就需要添加查看结果树,这个监听器元件有那些功能呢? 一.察看结果树界面如下 二.察看结果树界面功能说明 1.所有数据写入文件 (1)文件名:可以通过浏览,选择 ...

  5. 【jmeter】将“察看结果树”中的数据保存到本地

    操作说明: 1. "察看结果树"页面,[配置]导出项: 2. "察看结果树"页面,[文件名]选框输入导出文件及路径:  3. 点击jmeter[启动]按钮,响应 ...

  6. 题解——loj6279 数列分块入门3 (分块)

    用set维护有序序列 或许sort也可以,但这题的前驱定义是严格小于 所以要去重 然后就是记得自己打的加法tag在query的时候一定要算上 话说这题数据有点fake啊忘了查询算上自己的标记了还有70 ...

  7. jmeter-----查看结果树

    在编写接口测试脚本的时候,需要进行调试和查看结果是否正常的情况,这个时候可以使用查看结果树组件进行. 查看结果树中展示了每一个取样器的结果.请求信息和响应信息,可以查看这些内容去分析脚本是否存在问题. ...

  8. Jmeter查看结果树

    取样结果: Thread Name: test 1-2                                                     线程名称:测试1 - 2Sample S ...

  9. jmete察看结果树和body data乱码问题的解决办法

    jmeter察看结果树乱码问题的解决办法: (1)在jmeter的bin目录下找到jmeter.properties这个文件添加sampleresult.default.encoding=utf-8 ...

随机推荐

  1. HTTPS 证书制作及使用

    一 证书的制作 进入jdk/bin,使用keytools.exe制作证书. 1.创建keystore 创建一个别名为serverkeystore的证书,该证书存放在名为server.keystore的 ...

  2. (转)使用NMAP工具扫描端口

    原文:http://www.linuxde.net/2013/02/12354.html nmap 是一个用于网络探索或安全评测的工具.它支持 ping 扫描(判定哪些主机在运行),多端口扫描技术(判 ...

  3. JQuery插件 aos.js

    简介: aos.js是一款效果超赞的页面滚动元素动画jQuery动画库插件.该动画库可以在页面滚动时提供28种不同的元素动画效果,以及多种easing效果.在页面往回滚动时,元素会恢复到原来的状态. ...

  4. JS调用服务器端方法

    javascript函数中执行C#代码中的函数:方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中;        2.在前台写一个js函数,内容为document. ...

  5. 12 oracle 数据库坏块--物理坏块-ORA-01578/ORA-01110

    oracle 数据库坏块--物理坏块 数据坏块的类型物理坏块:通常是由于硬件损坏如磁盘异常导致.内存有问题.存储链有问题. IO有问题.文件系统有问题. Oracle本身的问题等逻辑坏块:可能都是软件 ...

  6. TCP/IP笔记——UDP

    OSI模型中最下面的两层用来解决两个硬件设备在物理上的通信问题(如规定怎么将电平信号转换为数字信号),相对应的TCP/IP模型中,这部分代表将会将机器封装为一个MAC地址来实现通讯.网络层是关于,具体 ...

  7. spring maven依赖

    图解spring容器 核心容器(core container) spring-core 这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件要都要使用到这个包里的类,是其它组 ...

  8. 任务调度之 Quartz

    任务调度的背景 在业务系统中有很多这样的场景: 账单日或者还款日上午 10 点,给每个信用卡客户发送账单通知,还款通知.如何判断客户的账单日.还款日,完成通知的发送? 银行业务系统,夜间要完成跑批的一 ...

  9. 2019上海网络赛B题(差分 + 离散化 or 差分 + 思维)

    这题.....队里都没怎么训练差分,导致败北...写了一堆线段树嘤嘤嘤,到最后也是超时,比赛结束后看到了差分的思想于是就去学了一手. 其实了解差分思想的一眼就能看出来是差分了.但是如果对n差分的话很明 ...

  10. 重写select

    select 模拟 目前仿写select的方式 给tableIndex 来使 div(无法获取焦点的元素)来获取元素,这样便可以在失去焦点时,是否将下拉框收回 通过 document的点击,来判断是否 ...