[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 ...
随机推荐
- TCP/IP协议复习
- JAVA_SE基础——57.有了包之后类与类之间的访问使用import语句
代码1访问代码2 代码1: class Demo3 { public static void main(String[] args) { Demo4 a = new Demo4(); a.print( ...
- 从PRISM开始学WPF(九)交互(完结)
0x07交互 Notification xaml: <Window x:Class="UsingPopupWindowAction.Views.MainWindow" xml ...
- Django 学生管理系统
1. 一对一 班级 模态增加 编辑 def classes(request): data = sqlheper.get_list("select cid,title from class& ...
- POJ-2632 Crashing Robots模拟
题目链接: https://vjudge.net/problem/POJ-2632 题目大意: 在一个a×b的仓库里有n个机器人,编号为1到n.现在给出每一个机器人的坐标和它所面朝的方向,以及m条指令 ...
- Python面向对象——多重继承
1本文的作用 一个从多个父类继承过来的子类,可以访问所有父类的功能. 2图文介绍 3代码验证 class Contact: all_contacts = [] def __init__(self, n ...
- Redis Cluster 4.0 on CentOS 6.9 搭建
集群简介 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需 ...
- 浅析java的深拷贝与浅拷贝
(转自:http://www.cnblogs.com/chenssy/p/3308489.html) 首先来看看浅拷贝和深拷贝的定义: 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式 ...
- 【省带宽、压成本专题】从产品架构来看,PCDN如何节流50%
过去几年,我们一直在视频省流量方面潜心钻研,取得不俗的成果.本次"省带宽.压成本"系列一共会推出六篇文章,从技术迭代.硬件更新等角度出发,向大家介绍节省CDN流量,降低视频播放成本 ...
- IOS开发-UIDynamic(物理仿真)简单使用
UIDynamic是从IOS7开始引入的一种新技术,隶属于UIKit框架,我们可以认为是一种物理引擎能模拟和仿真现实生活中的物理现象,比如重力,弹性碰撞等. 可以让开发人员远离物理公式的情况下,实现一 ...