[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 ...
随机推荐
- STL常用整理
S T L Sting: << 判断拼音序 size length 字符串长度 str[n] 代表字符串中的一个字符 可用作左值 string::size_type 用于表示字符串长度计量 ...
- python 之反射
通过字符串的形式导入模块 通过字符串的形式,去模块中寻找制定的函数,并执行getattr(模块名,函数名,默认值) 通过字符串的形式,去模块中设置东西setattr(模块名,函数名/变量名,lambd ...
- Node.js系列文章:编写自己的命令行界面程序(CLI)
CLI的全称是Command-line Interface(命令行界面),即在命令行接受用户的键盘输入并作出响应和执行的程序. 在Node.js中,全局安装的包一般都具有命令行界面的功能,例如我们用于 ...
- RAID 损坏后如何对物理硬盘做完整镜像
"磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能.利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上." ...
- Linux命令及lamp搭建
单纯属于Linux的命令:1.强制卸载有依赖关系的软件包: rpm -e httpd-2.2.15-26.el6.x86_64 --nodeps(--nodeps表示无依赖)4.删除当前目录所有的文件 ...
- 初学深度学习(TensorFlow框架的心得and经验总结)自用环境的总结
初学者的时间大部分浪费在了环境上了: 建议直接上Linux系统,我推荐国产的深度系统,deepin这几年一直在不断的发展,现在15.4已经很不错了 1,图形化界面很漂亮,内置正版crossover,并 ...
- (干货)微信小程序之上传图片和图片预览
这几天一直负责做微信小程序这一块,也可以说是边做边学习吧,把自己做的微信小程序的一些功能分享出来,与大家探讨一下,相互学习相互进步. 先看下效果图 只写了一下效果样式的话希望大家不要太在意,下面马路杀 ...
- 新概念英语(1-99)Ow!
Lesson 99 Owl! 啊哟! Listen to the tape then answer this question. Must Andy go to see the doctor?听录音, ...
- websocketj--随时随地在Web浏览器中操作你的服务端程序
0 - 有没有觉得Linux标准终端界面输入输出枯燥无味? 1 - 什么?vmstat命令的输出数据不直观?有没有想过能够可视化该命令的输出? 2 - 尝试过用浏览器操作Windows中的cmd吗? ...
- PyQt5--基础篇:用eric6工具实现三级联动效果
今天给大家介绍下python gui界面的三级联动效果,我们用工具eric6来实现,先看下效果图. 首先我们先创建项目linkage,再新建窗体进入到Qt设计师工具开始设计界面,完成后保存并退出. 在 ...