【BZOJ 4568】【SCOI 2016】幸运数字
写了一天啊,调了好久,对拍了无数次都拍不出错来(数据生成器太弱了没办法啊)。
错误1:把线性基存成结构体,并作为函数计算,最后赋值给调用函数的变量时无疑加大了计算量导致TLE
错误2:像这种函数(A,B,C)功能是实现C=A+B,而要计算A=A+B时千万不能(A,B,A)这么用QAQ,它不会存储A之前的值用来计算新的A的值啊,因为这个出现了许多奇奇怪怪的错误ovo
错误3:错误答案,调起来非常令人崩溃,从Tyrant那里要了SCOI的数据后查错,面对一大堆数字怎么可能查出错来。只好静态查错,呆看程序2h+,最后看了网上的一篇题解,发现别人合并线性基时开的数组非常大,而我是卡着60开的。如果两个长为60的线性基合并前存储到长为60的线性基里不错才怪呢QuQ,开成了120才卡过QAQ。
犯逗了一天,其实这道题也不是很难,只是我手残打出的各种错误使Debug浪费了太多时间。
这道题重点在于合并线性基,会合并线性基的话倍增的方法应该不难想。预处理出倍增数组,每次倍增找LCA,然后用4个存倍增长度的链上的线性基合并,最后贪心算出答案,总时间复杂度为$O(N\log N×P^2+Q(\log N+3×P^2))$,其中因为数据是long long范围内的,所以$P=60$。这么小的P可以视为常数而我却把它算在时间复杂度里,我果然还想继续犯逗TwT
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 20003;
LL getLL() {
LL k = 0; int fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = (k << 1) + (k << 3) + c - '0';
return k * fh;
}
int getint() {
int k = 0, fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = (k << 1) + (k << 3) + c - '0';
return k * fh;
} int point[N], n, cnt = 0, fa[N][16], deep[N];
struct node {int nxt, to;} E[N << 1];
struct LineB {int n; LL A[61];};
LL S[121];
void Merge(LineB x, LineB y, LineB &c) {
int i, tmp = 0, num;
num= x.n + y.n;
for(i = 1; i <= x.n; ++i)
S[i] = x.A[i];
for(i = x.n + 1; i <= num; ++i)
S[i] = y.A[i - x.n];
for(LL j = (1LL << 60); j; j >>= 1) {
for(i = tmp + 1; i <= num; ++i)
if (S[i] & j)
break;
if (i > num) continue;
swap(S[++tmp], S[i]);
for(i = 1; i <= num; ++i)
if (i != tmp && S[i] & j)
S[i] ^= S[tmp];
}
c.n = tmp;
for(i = 1; i <= tmp; ++i)
c.A[i] = S[i];
} LineB J[N][16];
void ins(int x, int y) {E[++cnt].nxt = point[x]; E[cnt].to = y; point[x] = cnt;}
void _(int x, int f) {
fa[x][0] = f; deep[x] = deep[f] + 1;
for(int i = 1; i <= 15; ++i) {
fa[x][i] = fa[fa[x][i - 1]][i - 1];
Merge(J[x][i - 1], J[fa[x][i - 1]][i - 1], J[x][i]);
}
for(int tmp = point[x]; tmp; tmp = E[tmp].nxt)
if (E[tmp].to != f)
_(E[tmp].to, x);
} int Log2[N];
int __(int x, int y) {
for(int i = 15; i >= 0; --i)
if ((1 << i) & y) x = fa[x][i];
return x;
}
int LCA(int x, int y) {
if (deep[x] < deep[y]) swap(x, y);
int k = deep[x] - deep[y];
for(int i = 0; i <= 15; ++i)
if (k & (1 << i)) x = fa[x][i];
if (x == y) return x;
for(int i = 15; i >= 0; --i)
if (fa[x][i] != fa[y][i])
x = fa[x][i], y = fa[y][i];
return fa[x][0];
}
LL ___(LineB x) {
LL ret = 0;
for(int i = 1; i <= x.n; ++i)
ret ^= x.A[i];
return ret;
}
int main() {
n = getint(); int Q = getint();
for(int i = 1; i <= n; ++i) {
J[i][0].n = 1;
J[i][0].A[1] = getLL();
} int x, y;
for(int i = 1; i < n; ++i) {
x = getint(); y = getint();
ins(x, y); ins(y, x);
} _(1, 0);
x = 0;
for(int i = 1; i <= n; ++i) {
if (1 << x == i)
++x;
Log2[i] = x - 1;
} for(int i = 1; i <= Q; ++i) {
x = getint(); y = getint();
int lca = LCA(x, y), lx = deep[x] - deep[lca] + 1, ly = deep[y] - deep[lca] + 1;
int logx = Log2[lx], logy = Log2[ly];
LineB X; Merge(J[x][logx], J[__(x, lx - (1 << logx))][logx], X);
LineB Y; Merge(J[y][logy], J[__(y, ly - (1 << logy))][logy], Y);
LineB Z; Merge(X, Y, Z);
printf("%lld\n", ___(Z));
} return 0;
}
CTSC 2016 Day-2 Bless All
【BZOJ 4568】【SCOI 2016】幸运数字的更多相关文章
- bzoj 4568 [SCOI 2016] 幸运数字
题目大意 给定一棵\(n\)个点的树,每个点有权值 \(q\)次询问树上路径中 每个点权值可选可不选的最大异或和 \(n\le 2*10^4,q\le 2*10^5,val[i]\le 2^{60}\ ...
- [SCOI 2016]幸运数字
Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一 ...
- Scoi 2010 幸运数字
[题目描述]在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸 ...
- BZOJ 4568 幸运数字
题目传送门 4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MB Description A 国共有 n 座城市,这些城市由 n-1 ...
- BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...
- bzoj 4568: [Scoi2016]幸运数字
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 848 Solved: 336[Submit][Status ...
- 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)
4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ...
- BZOJ 4568 [Scoi2016]幸运数字(树链剖分 + 异或线性基)
题目链接 BZOJ 4568 考虑树链剖分+线段树维护每一段区域的异或线性基 对于每个询问,求出该点集的异或线性基.然后求一下这个线性基里面能异或出的最大值即可. #include <bits ...
- BZOJ 1853 【Scoi2010】 幸运数字
Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认 为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,8 ...
- BZOJ 1853: [Scoi2010]幸运数字
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 2117 Solved: 779[Submit][Status] ...
随机推荐
- 阿里云 CentOS6.5 ssh连接慢的解决方案
我租了一台阿里云深圳的服务器,用的是CentOS6.5的系统,最近要在服务器上小改点代码,但是不管用private shell 还是securecrt工具连接,连上去后,都特别慢,经常敲一段代码要过个 ...
- XBOX ONE游戏开发之DEBUG配置(三)
如何DEBUG 首先打开ADK命令提示窗口 输入命令 xbconnect {XBOX主机的IP} * XBOX主机的IP 在XBOX主机的开发者设置中可以看到,会有一个主机IP和一个工具IP 然后打开 ...
- [No00004E]千万不要“拼命”工作——写在滴滴总裁柳青患癌症之后
滴滴快的总裁柳青发内部信,透露自己检查出乳腺癌,她今年才37岁. 9月30日,就是国庆前一天,柳青发了内部信,透露了这个消息,她也说已经做完肿瘤摘除手术,"目前感觉还挺好的".她也 ...
- [No00002E]关于大数据,你不知道的6个迷思
还是那个观点:计算机,编程语言,互联网,大数据等等都只是工具! 导语:看过美剧<纸牌屋>没?知道这部"白宫甄嬛传"为什么会火吗?靠的是大!数!据! 过去两年,在 Net ...
- Js实现简单的省市级联的效果
需要注意的是当需要动态添加项的时候一定要先var newoption=new Option("项","值");然后再 select.options.add(ne ...
- AFNetworking 基本使用
AFNetwork是一个轻量级的网络请求api类库.是以NSURLConnection, NSOperation和其他方法为基础的. 下面这个例子是用来处理json请求的 3如何选择AFNetwork ...
- 033医疗项目-模块三:药品供应商目录模块——供货商药品目录t添加查询功能----------Dao层和Service层和Action层和调试
什么叫做供货商药品目录t添加查询功能?就是说我们前面的博客里面不是说供货商登录后看到了自己供应的药品了么如下: 现在供货商想要往里面添加别的药品,那么这个药品的来源就是卫生局提供的那个Ypxx表(药品 ...
- How To Create an IE-Only Stylesheet
https://css-tricks.com/how-to-create-an-ie-only-stylesheet/ https://css-tricks.com/snippets/css/css- ...
- lodop打印控件一点记录
今天初步接触了下打印控件 LODOP实现了自动分页,高度宽度都可以自己设定来分页. 页码,使用LODOP.SET_PRINT_STYLE("ItemType", 2); LODOP ...
- 反复请求某个URL缓存严重解决办法
有2个iframe页面A和B 点击B页面某按钮刷新A,A缓存严重. 后来发现是因为反复请求同样的URL,浏览器就在调用缓存. 解决方法是在URL后添加一个当前时间即可 var url,e=/[?]/g ...