首页 > 其他分享 >L3-032 关于深度优先搜索和逆序对的题应该不会很难吧这件事(天梯赛)

L3-032 关于深度优先搜索和逆序对的题应该不会很难吧这件事(天梯赛)

时间:2022-12-22 11:57:35浏览次数:39  
标签:rt LL dfs maxn L3 cnt1 032 逆序 mod

分析:

不可能把所有情况都给列出来 但是好像这样可以得一半的分数

考虑每个点对 对答案产生的贡献

发现具有父子关系的点对无论什么情况 相对位置都是固定的 产生的贡献就是再乘上f[rt] (f[rt]表示整个树的不同dfs序的种类)

关键在于不具有父子关系的点对 该如何考虑

假如<a,b>是不具有父子关系的两点 LCA(a,b)=u

u通向含有a子树亲儿子为X u通向含有b子树亲儿子为Y

考虑u子树的遍历情况 X在Y前 Y在X前 两种情况各占一半

所以贡献就是再乘f[rt]/2

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn = 3e5+10;
const LL mod = 1e9+7;

LL n, rt;
vector<LL>G[maxn];

//排列组合
LL fac[maxn];
void init(){
	fac[0]=1; for(LL i = 1; i < maxn; i++)fac[i]=fac[i-1]*i%mod;
}
LL mpow(LL a, LL x) {
	if(x==0)return 1;
	LL t = mpow(a, x>>1);
	if(x%2==0)return t*t%mod;
	return t*t%mod*a%mod;
}

//树状数组求逆序对
LL b[maxn];
void add(LL x, LL v){ for(LL i = x; i <= n; i+=i&(-i))(b[i]+=v)%=mod;}
LL query(LL x){ LL ans=0;for(LL i=x;i>0;i-=i&(-i))(ans+=b[i])%=mod;return ans%mod;}

//题目
LL f[maxn];//为以u为子树的dfs序方案数
LL cnt1 = 0, cnt2 = 0;//在一个dfs序中确定, 不确定的逆序对数量 
void dfs(LL x, LL fa){
    f[x] = 1;
    for(LL to : G[x]){
        if(to==fa)continue;
        cnt1 = (cnt1+query(n)-query(to)+mod)%mod;//祖先里比当前大的数的个数
        cnt2 = (cnt2+query(to))%mod; //祖先里比当前小的数的个数
        add(to, 1);
        dfs(to, x);
        add(to, -1);
        f[x] = f[x]*f[to]%mod;
    }
    //当前节点的dfs序数 = ∏以其子节点为根的子树的dfs序数×子节点的排列数
    LL num = (x==rt ? G[x].size() : G[x].size()-1);
    f[x] = f[x]*fac[num]%mod;
}
int main(){
    ios::sync_with_stdio(0), cin.tie(0),cout.tie(0);
    init();
    cin>>n>>rt;
    for(LL i = 1; i <= n-1; i++){
        LL u, v;  cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    add(rt, 1);
    dfs(rt, -1);
    LL num = ((n*(n-1)%mod*mpow(2,mod-2)%mod -cnt1-cnt2)%mod+mod)%mod;//没有父子关系的点对数量
    LL ans = f[rt]*(cnt1+num*mpow(2,mod-2)%mod)%mod;//cnt1就是有父子关系的逆序对数
    // cout<<cnt1<<" "<<cnt2<<"\n";
    cout << ans << "\n";
    return 0;
}

标签:rt,LL,dfs,maxn,L3,cnt1,032,逆序,mod
From: https://www.cnblogs.com/wzxbeliever/p/16998077.html

相关文章

  • 虹科方案|将以太网连接添加到Dell EMC PowerVault™ ML3 SAS库
    一、DellEMC和 ATTO磁带解决方案DellEMC和 ATTO提供了业界唯一的商用解决方案,可将高速以太网连接添加到标准SASLTO磁带驱动器。ATTOXstreamCORE®ET8200智......
  • 120_逆序输出数字
    题干:编程实现将输入的整数逆序输出。思路1:存入数组,倒序数组输出#输入的是数字默认是str格式,要进行格式转换data=int(input("请输入一个整数:"))#对待负数,1、要记录符......
  • 逆序输出整数
     defreverse(b:int):whileb//10:print(b%10)b//=10print(b)reverse(1234)reverse(8)reverse(0) defreverse(b:int)......
  • buuoj-[WUSTCTF2020]level3
    1.nowinexe64bit2.打开直接找到main函数是一个base64加密,加密表是:但是解出来是乱码。。然后查了一下(x)谁调用了base64表,发现了这个东西那就是变表了。。写个脚本......
  • 剑指offer 数组中的逆序对(归并排序)
    ​​剑指Offer51.数组中的逆序对​​难度困难176在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的......
  • 遭遇svchoct.exe,vonine.exe,HBKernel32.sys,ssdtti.sys,System.exe,ublhbztl.sys等1
    遭遇svchoct.exe,vonine.exe,HBKernel32.sys,ssdtti.sys,System.exe,ublhbztl.sys等1 endurer原创2008-10-22第1版 前天,一位同事说他电脑中的输入法图标不见了,请偶帮忙......
  • 遭遇svchoct.exe,vonine.exe,HBKernel32.sys,ssdtti.sys,System.exe,ublhbztl.sys等2
    遭遇svchoct.exe,vonine.exe,HBKernel32.sys,ssdtti.sys,System.exe,ublhbztl.sys等2endurer原创2008-10-23第1版 分析好了,就开始修复。先下载bat_do和FileInfo,用File......
  • pwn | jarvisoj_level3
    pwn|jarvisoj_level3x86ret2libc非常常规的ret2libcexp:frompwnimport*fromLibcSearcher.LibcSearcherimport*context.log_level='debug'elf=ELF('.......
  • function~数组逆序存放
    题目描述将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。 输入输入为两行:第一行数组中元素的个数n(1<n<100),第二行是n个整数,每两......
  • 前端开发系列032-基础篇之DOM
    title:'前端开发系列032-基础篇之DOM'tags:-javaScript系列categories:[]date:2017-08-1608:20:13本文将详细介绍DOM相关的知识点,包括但不限于Document文档......