【LOJ】#2072. 「JSOI2016」独特的树叶
题解
干脆题解套题解好了
毕竟我的hash方法是抄小迪的
https://www.cnblogs.com/RabbitHu/p/9165770.html
小迪太巨了%%%
之前模数是八位的WA了几个点,换成9位模数就都过了
代码
#include <bits/stdc++.h>
//#define ivorysi
#define enter putchar('\n')
#define space putchar(' ')
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define eps 1e-8
#define ba 11
#define mo 999999137
#define MAXN 100005
#define pii pair<int,int>
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {putchar('-');x = -x;}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
struct node {
int to,next;
}E[MAXN * 2];
int sumE,head[MAXN],N,fa[MAXN],siz[MAXN],D[MAXN],ans = 1000000000;
int64 F[MAXN],B[MAXN + 10];
set<int64> S;
vector<int64> son[MAXN],pre[MAXN],suf[MAXN];
bool isB;
void add(int u,int v) {
E[++sumE].to = v;
E[sumE].next = head[u];
head[u] = sumE;
}
void dfs1(int u) {
siz[u] = 1;
son[u].clear();
son[u].pb(0);
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa[u]) {
fa[v] = u;
dfs1(v);
siz[u] += siz[v];
son[u].pb(F[v]);
}
}
F[u] = 0;
if(siz[u] == 1) {F[u] = 1;return;}
sort(son[u].begin(),son[u].end());
int s = son[u].size();
for(int i = 1 ; i < s ; ++i) {
F[u] = (F[u] + B[i] * son[u][i]) % mo;
}
F[u] = F[u] * siz[u] % mo;
}
void dfs2(int u,int64 Fa) {
if(fa[u]) son[u].pb(Fa);
sort(son[u].begin(),son[u].end());
int s = son[u].size();
pre[u].clear();suf[u].clear();
pre[u].resize(s);
suf[u].resize(s + 1);
pre[u][0] = 0;suf[u][s] = 0;
for(int i = 1 ; i < s ; ++i) {
pre[u][i] = (pre[u][i - 1] + B[i] * son[u][i]) % mo;
}
for(int i = s - 1 ; i >= 1 ; --i) {
suf[u][i] = (suf[u][i + 1] + B[i - 1] * son[u][i]) % mo;
}
if(!isB) S.insert(pre[u][s - 1] * siz[1] % mo);
if(isB && D[u] == 1) {
if(!fa[u]) {
if(S.find(son[u][1]) != S.end()) {ans = min(ans,u);}
}
else if(S.find(Fa) != S.end()) {ans = min(ans,u);}
}
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa[u]) {
int t = lower_bound(son[u].begin(),son[u].end(),F[v]) - son[u].begin();
int64 T = (pre[u][t - 1] + suf[u][t + 1]) % mo;
T = T * (siz[1] - siz[v]) % mo;
if(siz[1] - siz[v] == 1) T = 1;
dfs2(v,T);
}
}
}
void Solve() {
read(N);
B[0] = 1;
for(int i = 1 ; i <= N + 3 ; ++i) B[i] = B[i - 1] * ba % mo;
int u,v;
for(int i = 1 ; i < N ; ++i) {
read(u);read(v);
add(u,v);add(v,u);
}
dfs1(1);
dfs2(1,0);
memset(head,0,sizeof(head));
memset(fa,0,sizeof(fa));
memset(siz,0,sizeof(siz));
sumE = 0;
for(int i = 1 ; i <= N ; ++i) {
read(u);read(v);
add(u,v);add(v,u);
D[u]++;D[v]++;
}
isB = 1;
dfs1(1);
dfs2(1,0);
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
【LOJ】#2072. 「JSOI2016」独特的树叶的更多相关文章
- loj#2071. 「JSOI2016」最佳团体
题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...
- loj#2076. 「JSOI2016」炸弹攻击 模拟退火
目录 题目链接 题解 代码 题目链接 loj#2076. 「JSOI2016」炸弹攻击 题解 模拟退火 退火时,由于答案比较小,但是温度比较高 所以在算exp时最好把相差的点数乘以一个常数让选取更差的 ...
- [LOJ 2082] 「JSOI2016」炸弹攻击 2
[LOJ 2082] 「JSOI2016」炸弹攻击 2 链接 链接 题解 枚举发射源,将发射源当做原点,对敌人和激光塔极角排序. 由于敌人纵坐标均为正,而其它点均为负,因此每两个角度差在 \(\pi\ ...
- LOJ#2082. 「JSOI2016」炸弹攻击 2(计算几何+双指针)
题面 传送门 题解 我们枚举一下发射源,并把敌人和激光塔按极角排序,那么一组合法解就是两个极角之差不超过\(\pi\)且中间有敌人的三元组数,预处理一下前缀和然后用双指针就行了 //minamoto ...
- LOJ#2076. 「JSOI2016」炸弹攻击(模拟退火)
题面 传送门 题解 退火就好了 记得因为答案比较小,但是温度比较高,所以在算\(\exp\)的时候最好把相差的点数乘上一个常数来让选取更劣解的概率降低 话虽如此然而我自己打的退火答案永远是\(0\)- ...
- Loj #3057. 「HNOI2019」校园旅行
Loj #3057. 「HNOI2019」校园旅行 某学校的每个建筑都有一个独特的编号.一天你在校园里无聊,决定在校园内随意地漫步. 你已经在校园里呆过一段时间,对校园内每个建筑的编号非常熟悉,于是你 ...
- Loj #2568. 「APIO2016」烟花表演
Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
随机推荐
- Spring整合Quartz定时任务 在集群、分布式系统中的应用
概述 虽然单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应用的一 ...
- wepy
npm install -g cnpm --registry=https://registry.npm.taobao.org https://blog.csdn.net/qq_40414159/art ...
- COGS 1516. 棋盘上的车
COGS 1516. 棋盘上的车 http://www.cogs.pro/cogs/problem/problem.php?pid=1516 ☆ 输入文件:rook.in 输出文件:rook. ...
- SELECT INTO 和 INSERT INTO SELECT比较
Insert是T-sql中常用语句,但我们在开发中经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用S ...
- Chrome截长屏
本文地址:https://www.cnblogs.com/veinyin/p/9257833.html Chrome截取长屏一直是一个痛点,之前尝试过第三方截图工具,但是不是收费就是不怎么好用,今 ...
- Unity3D 程序打包报错(程序是连接数据库进行处理的)
打包这个Unity3D的程序时出现错误(程序是由XML数据改成连接数据库): ArgumentException: The Assembly System.Configuration is refer ...
- SQL Server 2000事务复制问题
2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来.可能都是些很白很二的问题,但人总是由最初的无知不断成长●-● SQL Server 2000事务复制问题服务器A(发布) 服务器B(分 ...
- SpringCloud之Eureka(注册中心集群篇)
一:集群环境搭建 第一步:我们新建两个注册中心工程一个叫eureka_register_service_master,另一个叫eureka_register_service_backup eureka ...
- Django 使用mysql 所遇到问题一:Error loading MySQLdb module
在配置完mysql 的配置信息后执行 python manage.py runserver 时出现如下错误.(py3的环境) 解决 在 python2 中,使用 pip install mysql-p ...
- mvn打war包以及解压包的方法
有时候我们需要查看打成war包之后的目录,如果是maven项目我们可以直接用maven打包. 1.maven打包: 第一种: mvn package 如果不行先 mvn clean一下 第二种:(掌握 ...