2019 icpc西安邀请赛 点分治

https://nanti.jisuanke.com/t/39277

求$\sum{异或和为0的路径,被其他路径包含的次数}$

如果只是求异或和为0的路径数量,其实是裸点分治,但是加上要求之后,就会复杂一些

进行分类讨论,再特殊处理根节点就行

由于信息可以合并,我使用子树合并,跑的很快

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#define ll long long
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define fi first
#define se second
using namespace std;//head
using namespace __gnu_pbds;
const int maxn=1e5+10,maxm=2e6+10;
const ll INF=0x3f3f3f3f,mod=1e9+7;
int casn,n,m,k;
gp_hash_table<ll,int> cnt;
namespace graph{
  vector<pair<int,ll>>g[maxn];
  int all,sz[maxn],root,maxt;
  bool vis[maxn];
  int dfs_root(int now,int fa){
    int cnt=1;
    for(auto i:g[now]){
      int to=i.fi;
      if(to==fa||vis[to])continue;
      cnt+=dfs_root(to,now);
    }
    int tmp=max(cnt-1,all-cnt);
    if(maxt>tmp) maxt=tmp,root=now;
    return sz[now]=cnt;
  }//@基础部分@
  int pre[maxn],sz0[maxn],ans;
  int dfs_fa(int now,int fa,int cnt=1){
    for(auto i:g[now]){
      int to=i.fi;
      if(to!=fa) cnt+=dfs_fa(to,pre[to]=now);
    }
    int tmp=max(cnt-1,n-cnt);
    if(maxt>tmp) maxt=tmp,root=now;
    return sz[now]=sz0[now]=cnt;
  }
  int id[maxn],dfn,sz1[maxn];
  ll dis[maxn];
  void dfs_dis(int now,int fa,ll d){
    dis[++dfn]=d,id[dfn]=now;
    if(fa==pre[now]) sz1[now]=sz0[now];
    else sz1[now]=n-sz0[fa];
    for(auto i:g[now]){
      int to=i.fi;
      if(to==fa||vis[to]) continue;
      dfs_dis(to,now,d^i.se);
    }
  }
  void get_ans(int now){
    cnt.clear();
    int szroot=0;
    for(auto i:g[now]){
      int to=i.fi;
      if(vis[to]) continue;
      dfn=0;
      if(pre[to]==now) szroot=n-sz0[to];
      else szroot=sz0[now];
      dfs_dis(to,now,i.se);
      rep(i,1,dfn) {
        ans+=1ll*cnt[dis[i]]*sz1[id[i]]%mod;
        if(ans>=mod) ans-=mod;
        if(!dis[i]){
          ans+=1ll*sz1[id[i]]*szroot%mod;
          if(ans>=mod) ans-=mod;
        }
      }
      rep(i,1,dfn) {
        int x=cnt[dis[i]];
        x+=sz1[id[i]];
        if(x>=mod) x-=mod;
        cnt[dis[i]]=x;
      }
    }
  }
  void dfs_dv(int now){
    vis[now]=1;
    get_ans(now);
    for(auto i:g[now]){
      int to=i.fi;
      if(vis[to]) continue;
      all=sz[to];maxt=root=n+1;
      dfs_root(to,now);dfs_dv(root);
    }
  }
  void solve(int n){
    maxt=root=n+1;
    dfs_fa(1,0);dfs_dv(root);
  }
}
using namespace graph;
int main(){IO;
  cin>>n;
  rep(i,2,n){
    int a=i,b;
    ll c;cin>>b>>c;
    g[a].emplace_back(b,c);
    g[b].emplace_back(a,c);
  }
  solve(n);
  cout<<ans<<endl;
  return 0;
}

原文地址:https://www.cnblogs.com/nervendnig/p/11617137.html

时间: 2024-08-10 15:31:29

2019 icpc西安邀请赛 点分治的相关文章

2019 ICPC南昌邀请赛比赛过程及题解

解题过程 中午吃饭比较晚,到机房lfw开始发各队的账号密码,byf开始读D题,shl电脑卡的要死,启动中...然后听到谁说A题过了好多,然后shl让blf读A题,A题blf一下就A了.然后lfw读完M题(shl的电脑终于打开了,然后输入密码,密码错误...自闭),说AC 自动机板题,然后找板子,,,突然发现自己读错题目.后来不知道怎么A的.shl copy了一遍密码终于登上账号.然后lfw一个人用单调栈A掉了I题:byf 秒了H题: shl和byf读j题,读完吧题意告诉lfw,lfw说水题,然后

【随笔】天道酬勤——西安邀请赛之感

至今我都不敢相信周日那天发生了什么.当我那个只是抱着试一试的心态去提交的D题结果竟然返回AC的时候,当志愿者把第四个气球送过来的时候,当我们的排名一度达到12名的时候,我不敢相信自己的双眼.直到最后,我看到了那张平平淡淡的获奖证书,看到了上面写着的NWPU_Assassin.我才真正的冷静下来,原来上帝还是眷顾我的. 一 其实这次比赛我们又当志愿者又当参赛队员,累得半死.志愿者们系统不会搞,我们来:座位安排不会,我们来:前前后后大事小事都是我们在搞.热身赛的时候我们一个队做完两个题之后就直接去当

hdu 4849 最短路 西安邀请赛 Wow! Such City!

http://acm.hdu.edu.cn/showproblem.php?pid=4849 会有很多奇怪的Wa的题,当初在西安就不知道为什么wa,昨晚做了,因为一些Sb错误也wa了很久,这会儿怎么写都会AC.... 收获: 1.还是基本都构思好在去敲代码,因为当时没过,昨晚心里有阴影,敲得很慢,而且最开始各种取模以防止漏掉,太保守了......以后一定先估算是不是需要取模防止TLE,当然时间够的话还是适当多取个模防止莫名其妙的错误.. 2.如果出错,注意参数是不是对的,最开始写好之后,因为m和

2014 北京、西安邀请赛

今年有幸能打两场邀请赛,真的是很幸运...但是打出来的效果就...本来都没脸写总结了的,后来想了想还是写了吧,不然这两场又白打了. 由于两场比赛相隔只有一周,所以我们就给自己放了10+天的假,玩是玩爽了,可惜比的就很烂了...稍微记录一下流水账吧,以后反思用. 先说一下北京的吧. 第一天热身赛,能做的只有两道,C题是输出随机数,A是24点,于是决定先猜几发C,猜了几个数都不对,然后就让队友去敲A了,敲完A之后队友发现C题ONE字很大!于是猜了个1,然后竟然就过了...B题是7次之内猜出一个每位都

西安邀请赛J题 状态压缩DP

Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具.Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂的参数.它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构.host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常强大完善.界面友好.软件 Cacti 的发展是基于让 RRDTool 使用者更方便使用该软件,除了基本的 Snmp 流量

2017 ICPC 广西邀请赛1004 Covering

Covering Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 187    Accepted Submission(s): 107 Problem Description Bob's school has a big playground, boys and girls always play games here after sch

西安邀请赛A题 字符串基本处理

很抱歉,学校的OJ并不支持外网,而且还没有加上题目... 题意很简单,就是给一个文章,关于那个作死狗DOGE,问文章中出现了多少个DOGE,不考虑大小写. 然后就很粗暴的用toupper判断了,毫无难度. 代码如下: /**** *@author Shen *@title 西安邀请赛A */ #include <cctype> #include <cstdio> using namespace std; const int maxLen = (1 << 16); cha

西安邀请赛C题 单源点最短路

作者 : Dolphin 原文地址:http://blog.csdn.net/qingdujun/article/details/27109035 一.实体完整性定义 [例1]将Student表中的Sno属性定义为码. CREATE TABLE Student ( Sno CHAR(10) PRIMARY KEY, /*在列定义主码*/ Sname CHAR(20) NOT NULL, Sage SMALLINT ); 或者: CREATE TABLE Student ( Sno CHAR(10

西安邀请赛D题 字符串生成题 深搜

很抱歉,学校的OJ并不支持外网,而且还没有加上题目... 题意是说,求一个字符串,他的所有长度超过4的子串都是唯一的. 然后我当时是想aaaa, baaa, caaa, daaa...这样巴拉巴拉一直生成下去的,后来发现真的是想的太天真了,因为前面的两个长度为4的子串("aaaabaaa")的存在,直接封杀了3个子串("aaab", "aaba", "abaa").然后我就想记录状态去试着暴力去跑一个生成机.其实也很简单,就是