[bzoj4763]雪辉&[bzoj4812][Ynoi2017]由乃打扑克
来自FallDream的博客,未经允许,请勿转载,谢谢。
cut掉部分题面。
#include<iostream>
#include<cstdio>
#define MN 100000
#define MB 320
#define MD 17
#define ull unsigned long long
#define getchar() (*S++)
char B[<<],*S=B;
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
}
int n,m,flag,w[MN+],head[MN+],cnt=,fa[MD+][MN+],mx[MN+];
int mark[MN+],dep[MN+],rt[MB+],rtnum=,top[MN+],Num[MN+];
struct edge{int to,next;}e[MN*+];
ull MAXN=;
struct Bitset
{
ull s[];int len;
void Clear(){for(int i=;i<;++i) s[i]=;len=;}
void operator |=(int x){s[x>>]|=1LL<<(x&);len=max(len,x>>);}
void operator |=(const Bitset&y)
{
len=max(len,y.len);
for(int i=;i<=len;++i)
s[i]|=y.s[i];
}
int num()
{
int res=;
for(int i=;i<=len;++i)
res+=Num[s[i]>>]+Num[(s[i]>>)&]+Num[(s[i]>>)&]+Num[s[i]&];
return res;
}
int Query()
{
for(int i=;i<;++i) if(s[i]!=MAXN)
for(int j=;j<;++j)
if(!(s[i]&((ull)<<j)))
return i*+j;
}
}b[MB+][MB+],ans; inline void ins(int f,int t)
{
e[++cnt]=(edge){t,head[f]};head[f]=cnt;
e[++cnt]=(edge){f,head[t]};head[t]=cnt;
} void init(int x)
{
mx[x]=dep[x];
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa[][x])
{
fa[][e[i].to]=x;
dep[e[i].to]=dep[x]+;
init(e[i].to);
mx[x]=max(mx[x],mx[e[i].to]);
}
if(mx[x]-dep[x]>=MB||x==) mx[x]=,rt[mark[x]=++rtnum]=x;
} inline int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int k=dep[x]-dep[y],j=;k;k>>=,++j)
if(k&) x=fa[j][x];
if(x==y) return x;
for(int i=MD;~i;--i)
if(fa[i][x]!=fa[i][y])
x=fa[i][x],y=fa[i][y];
return fa[][x];
}
int last=;
int main()
{
fread(B,,<<,stdin);
n=read();m=read();flag=read();
for(int i=;i<;++i) MAXN|=(ull)<<i;
for(int i=;i<=;++i)
for(int j=i;j;j>>=)
Num[i]+=(j&);
for(int i=;i<=n;++i) w[i]=read();
for(int i=;i<n;++i) ins(read(),read());
dep[]=;init();
for(int i=;i<=MD;++i)
for(int j=;j<=n;++j)
fa[i][j]=fa[i-][fa[i-][j]];
for(int i=;i<=rtnum;++i)
{
Bitset now;now.Clear();now|=w[rt[i]];b[i][i]=now;
for(int k=fa[][rt[i]];k;k=fa[][k])
{
now|=w[k];
if(mark[k])
{
b[i][mark[k]]=now;
if(!top[rt[i]]) top[rt[i]]=k;
}
}
}
for(int i=;i<=m;++i)
{
ans.Clear();int nn=read();
for(int j=;j<=nn;++j)
{
int x=read(),y=read(),xx,yy;
if(flag) x^=last,y^=last;
int z=lca(x,y);ans|=w[x];ans|=w[y];
for(;!mark[x]&&dep[x]>dep[z];)
x=fa[][x],ans|=w[x];
for(;!mark[y]&&dep[y]>dep[z];)
y=fa[][y],ans|=w[y];
for(xx=x;dep[top[xx]]>=dep[z];xx=top[xx]);
for(yy=y;dep[top[yy]]>=dep[z];yy=top[yy]);
ans|=b[mark[x]][mark[xx]];
ans|=b[mark[y]][mark[yy]];
for(;xx!=yy;)
{
if(dep[xx]<dep[yy]) swap(xx,yy);
xx=fa[][xx];ans|=w[xx];
}
}
int x=ans.num(),y=ans.Query();
last=x+y;
printf("%d %d\n",x,y);
}
return ;
}
由乃打扑克
#include<iostream>
#include<cstdio>
#define MN 100000
#define MB 350
#define MD 17
#define int unsigned int
#define uint int
#define ull unsigned long long
#define getchar() (*S++)
char B[<<],*S=B;
using namespace std;
inline long long read()
{
long long x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
}
int n,m,w[MN+],head[MN+],cnt=,fa[MD+][MN+],mx[MN+];
int mark[MN+],dep[MN+],rt[MB+],rtnum=,top[MN+],front[MN+],back[MN+];
uint pw[][],Num[][],K,last=;
struct edge{int to,next;}e[MN*+]; void Combine(uint&ans,uint&len,int x)
{
if(x==) {len+=;return;}
len+=front[x];ans+=pw[len][K];
ans+=Num[x][K];len=back[x];
}
struct Bitset
{
ull s[];int len;
void Clear(){for(int i=;i<;++i) s[i]=;len=;}
void operator |=(int x){s[x>>]|=1LL<<(x&);len=max(len,x>>);}
void operator |=(const Bitset&y)
{
len=max(len,y.len);
for(int i=;i<=len;++i)
s[i]|=y.s[i];
}
uint Query(int k)
{
uint ans=,L=;
for(int i=;i<=len;++i)
Combine(ans,L,s[i]&),
Combine(ans,L,(s[i]>>)&),
Combine(ans,L,(s[i]>>)&),
Combine(ans,L,(s[i]>>)&);
return (ans+=pw[L][k]);
}
}b[MB+][MB+],ans; inline void ins(int f,int t)
{
e[++cnt]=(edge){t,head[f]};head[f]=cnt;
e[++cnt]=(edge){f,head[t]};head[t]=cnt;
} void init(int x)
{
mx[x]=dep[x];
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa[][x])
{
fa[][e[i].to]=x;
dep[e[i].to]=dep[x]+;
init(e[i].to);
mx[x]=max(mx[x],mx[e[i].to]);
}
if(mx[x]-dep[x]>=MB||x==) mx[x]=,rt[mark[x]=++rtnum]=x;
} inline int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int k=dep[x]-dep[y],j=;k;k>>=,++j)
if(k&) x=fa[j][x];
if(x==y) return x;
for(int i=MD;~i;--i)
if(fa[i][x]!=fa[i][y])
x=fa[i][x],y=fa[i][y];
return fa[][x];
} main()
{
fread(B,,<<,stdin);
n=read();m=read();
for(int i=;i<=;++i)
{
int k=;pw[i][]=;
for(int j=;j<=;++j)
pw[i][j]=(k*=i);
} for(int i=;i<=;++i)
{
int j=,flag=;
for(int k=i,kk=;kk<=;++kk,k>>=)
if(k&) ++j;
else
{
if(!flag) flag=,front[i]=j;
else for(int kkk=;kkk<=;++kkk)
Num[i][kkk]+=pw[j][kkk];
j=;
}
back[i]=j;
}
for(int i=;i<=n;++i) w[i]=read();
for(int i=;i<n;++i) ins(read(),read());
dep[]=;init();
for(int i=;i<=MD;++i)
for(int j=;j<=n;++j)
fa[i][j]=fa[i-][fa[i-][j]];
for(int i=;i<=rtnum;++i)
{
Bitset now;now.Clear();now|=w[rt[i]];b[i][i]=now;
for(int k=fa[][rt[i]];k;k=fa[][k])
{
now|=w[k];
if(mark[k])
{
b[i][mark[k]]=now;
if(!top[rt[i]]) top[rt[i]]=k;
}
}
}
for(int i=;i<=m;++i)
{
ans.Clear();int nn=read();
for(int j=;j<=nn;++j)
{
uint x=(read()^last),y=(read()^last),xx,yy;
uint z=lca(x,y);ans|=w[x];ans|=w[y];
if(x<||x>n||y<||y>n) return ;
for(;!mark[x]&&dep[x]>dep[z];)
x=fa[][x],ans|=w[x];
for(;!mark[y]&&dep[y]>dep[z];)
y=fa[][y],ans|=w[y];
for(xx=x;dep[top[xx]]>=dep[z];xx=top[xx]);
for(yy=y;dep[top[yy]]>=dep[z];yy=top[yy]);
ans|=b[mark[x]][mark[xx]];
ans|=b[mark[y]][mark[yy]];
for(;xx!=yy;)
{
if(dep[xx]<dep[yy]) swap(xx,yy);
xx=fa[][xx];ans|=w[xx];
}
}
printf("%u\n",last=ans.Query(K=read()));
}
return ;
}
[bzoj4763]雪辉&[bzoj4812][Ynoi2017]由乃打扑克的更多相关文章
- 洛谷P3603 || bzoj 4763 雪辉 && bzoj4812: [Ynoi2017]由乃打扑克
https://www.luogu.org/problemnew/show/P3603 https://www.lydsy.com/JudgeOnline/problem.php?id=4763 就是 ...
- Bzoj4763 雪辉
Time Limit: 39 Sec Memory Limit: 666 MBSubmit: 151 Solved: 80 Description 上次立下的NOIP退役Flag没有成功 这次 ...
- bzoj4812: [Ynoi2017]由乃打扑克
由于查询的是树链的并的信息,同时信息不能高效合并,只能考虑用bitset维护,小范围暴力预处理以便从bitset算出答案 对树分块,保证每块是连通的且直径较小,对分出的块缩点建新树,在新树上建树上ST ...
- 「BZOJ4763」雪辉
「BZOJ4763」天野雪辉 题目大意:有一棵 \(n\) 个点的树,树上每一个点有权值 \(a_i \leq 30000\) ,每次询问给出若干路径,求出这些路径的并上面的不同颜色数与 \(mex\ ...
- [BZOJ 4763]雪辉
[BZOJ 4763] 雪辉 题意 给定一棵 \(n\) 个点的无根树, 点带权. \(q\) 次询问, 每次给定树上的若干路径, 求这些路径上的点共有多少种不同权值以及这些点的权值组成的集合的 \( ...
- [题解] 洛谷 P3603 雪辉
模拟赛中遇到了这个题,当时我这个沙雕因为把一个\(y\)打成了\(x\)而爆零.回来重新写这道题,莫名其妙的拿了rank1... 我的解法与其他几位的题解有些不同我太蒻了.并没有选取所谓的关键点,而是 ...
- MVC |分部视图 PartialView()
介绍如何定义 其实它和普通视图没有多大区别,只是创建分部视图的时候视图里没有任何内容,你需要什么标签你自己加.第二就是分部视图不会执行_ViewStart.cshtml中的内容) 控制器 Partia ...
- 【刷题】洛谷 P3613 睡觉困难综合征
题目背景 刚立完Flag我就挂了WC和THUWC... 时间限制0.5s,空间限制128MB 因为Claris大佬帮助一周目由乃通过了Deus的题,所以一周目的由乃前往二周目世界找雪辉去了 由于二周目 ...
- [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
4722: 由乃 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 360 Solved: 131[Submit][Status][Discuss] D ...
随机推荐
- PYTHON 词云
#!/usr/bin/env python # -*- coding:utf-8 -*- import matplotlib.pyplot as plt from wordcloud import W ...
- vue 在已有的购买列表中(数据库返回的数据)修改商品数量
连续加班一个月 连续通宵三天 到最后还是少了一个功能 心碎 简介:一个生成好的商品列表(数据库返回的数据) 首先拿到我们需要渲染的数组 在data中定义 我是在测试的时候 直接写了两条数据 下面开始 ...
- SQL SERVER 游标的使用
首先,关于什么是游标大家可以看看这篇文章,介绍得非常详细!! SQL Server基础之游标 下面是我自己的应用场景-- 有个需求,需要把数据库表里面某一个字段的值设为随机不重复的值. 表是这样的: ...
- Python内置函数(18)——bin
英文文档: bin(x) Convert an integer number to a binary string. The result is a valid Python expression. ...
- java中类的三大特征之多态
Java 多态 同一种事物由于条件不同,展示出不同的结果,叫做多态. 父类的引用类型,由于使用不同的子类对象实例,而执行不同的操作. 多态存在的三个必要条件 1. 子类继承父类: 2. 子类重写父类方 ...
- 解决编写的 html 乱码问题
- vmvare入门(1)使用移动,不要使用复制
1.复制虚拟机会产生新的自动网卡,原来的 System Eth0废了? 2.xftp链接的时候,要选择sftp方式连接,utf8编码.
- SpringCloud是什么?
参考链接: http://blog.csdn.net/forezp/article/details/70148833 一.概念定义 Spring Cloud是一个微服务框架,相比Dubbo ...
- maven快速下载jar镜像
<!--国内镜像--><mirror> <id>CN</id> <name>OSChina Central</name> ...
- [NOIP2009][LuoguP1073] 最优贸易 - Tarjan,拓扑+DP
Description&Data 题面:https://www.luogu.org/problemnew/show/P1073 Solution Tarjan对联通块缩点,在DAG上按照拓扑序 ...