Codeforces Round #362 (Div. 2) C. Lorenzo Von Matterhorn (类似LCA)
题目链接:http://codeforces.com/problemset/problem/697/D
给你一个有规则的二叉树,大概有1e18个点。
有两种操作:1操作是将u到v上的路径加上w,2操作是求u到v上的路径和。
我们可以看出任意一个点到1节点的边个数不会超过64(差不多就是log2(1e18)),所以可以找最近相同祖节点的方式写。
用一条边的一个唯一的端点作为边的编号(比如1到2,那2就为这条边的编号),由于数很大,所以用map来存。
进行1操作的时候就是暴力加w至u到LCA(u,v)上的各个边,同样加w至v到LCA(u , v)上的各个边。同理,进行2操作的时候也是暴力求和。
下面这是简单的写法
#include <bits/stdc++.h>
using namespace std;
typedef __int64 LL;
map <LL , LL> cnt; int main()
{
int n;
LL choose , u , v , val;
scanf("%d" , &n);
while(n--) {
scanf("%lld" , &choose);
if(choose == ) {
scanf("%lld %lld %lld" , &u , &v , &val);
while(u != v) {
if(u > v) {
cnt[u] += val;
u /= ;
}
else {
cnt[v] += val;
v /= ;
}
}
}
else {
scanf("%lld %lld" , &u , &v);
LL res = ;
while(u != v) {
if(u > v) {
res += cnt[u];
u /= ;
}
else {
res += cnt[v];
v /= ;
}
}
printf("%lld\n" , res);
}
}
return ;
}
下面是我一开始的写法,也A了,不过有点麻烦,可以不看。
#include <bits/stdc++.h>
using namespace std;
typedef __int64 LL;
const int N = 1e3 + ;
vector <int> vc;
vector <LL> q1[N] , q2[N] , ans1 , ans2;
LL x[N] , y[N] , val[N];
int main()
{
int n;
LL choose , u , v;
scanf("%d" , &n);
for(int i = ; i <= n ; ++i) {
scanf("%lld" , &choose);
if(choose == ) {
scanf("%lld %lld %lld" , x + i , y + i , val + i);
vc.push_back(i);
LL num1 = x[i] , num2 = y[i];
q1[i].push_back(num1) , q2[i].push_back(num2);
while(num1 != num2) {
if(num1 > num2) {
num1 /= ;
q1[i].push_back(num1);
}
else {
num2 /= ;
q2[i].push_back(num2);
}
}
}
else {
scanf("%lld %lld" , &u , &v);
LL temp1 = u , temp2 = v , res = ;
ans1.clear() , ans2.clear();
ans1.push_back(temp1) , ans2.push_back(temp2);
while(temp1 != temp2) {
if(temp1 > temp2) {
temp1 /= ;
ans1.push_back(temp1);
}
else {
temp2 /= ;
ans2.push_back(temp2);
}
}
for(int j = ; j < vc.size() ; ++j) {
int l = , r = ans1.size() - , k = ;
while(l + <= r) {
for( ; k + < q1[vc[j]].size() ; ++k) {
if(ans1[l] > q1[vc[j]][k])
break;
if(ans1[l + ] == q1[vc[j]][k + ] && ans1[l] == q1[vc[j]][k]) {
res += val[vc[j]];
}
}
l++;
}
k = , l = , r = ans1.size() - ;
while(l + <= r) {
for( ; k + < q2[vc[j]].size() ; ++k) {
if(ans1[l] > q2[vc[j]][k])
break;
if(ans1[l + ] == q2[vc[j]][k + ] && ans1[l] == q2[vc[j]][k]) {
res += val[vc[j]];
}
}
l++;
} l = , r = ans2.size() - , k = ;
while(l + <= r) {
for( ; k + < q1[vc[j]].size() ; ++k) {
if(ans2[l] > q1[vc[j]][k])
break;
if(ans2[l + ] == q1[vc[j]][k + ] && ans2[l] == q1[vc[j]][k]) {
res += val[vc[j]];
}
}
l++;
}
k = , l = , r = ans2.size() - ;
while(l + <= r) {
for( ; k + < q2[vc[j]].size() ; ++k) {
if(ans2[l] > q2[vc[j]][k])
break;
if(ans2[l + ] == q2[vc[j]][k + ] && ans2[l] == q2[vc[j]][k]) {
res += val[vc[j]];
}
}
l++;
}
}
printf("%lld\n" , res);
}
}
return ;
}
Codeforces Round #362 (Div. 2) C. Lorenzo Von Matterhorn (类似LCA)的更多相关文章
- #map+LCA# Codeforces Round #362 (Div. 2)-C. Lorenzo Von Matterhorn
2018-03-16 http://codeforces.com/problemset/problem/697/C C. Lorenzo Von Matterhorn time limit per t ...
- Codeforces Round #362 (Div. 2) A.B.C
A. Pineapple Incident time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Codeforces Round #362 (Div. 2)
闲来无事一套CF啊,我觉得这几个题还是有套路的,但是很明显,这个题并不难 A. Pineapple Incident time limit per test 1 second memory limit ...
- 【转载】【树形DP】【数学期望】Codeforces Round #362 (Div. 2) D.Puzzles
期望计算的套路: 1.定义:算出所有测试值的和,除以测试次数. 2.定义:算出所有值出现的概率与其乘积之和. 3.用前一步的期望,加上两者的期望距离,递推出来. 题意: 一个树,dfs遍历子树的顺序是 ...
- Codeforces Round #362 (Div. 2)->B. Barnicle
B. Barnicle time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- Codeforces Round #362 (Div. 2)->A. Pineapple Incident
A. Pineapple Incident time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Codeforces Round #362 (Div. 2) B 模拟
B. Barnicle time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- Codeforces Round #362 (Div. 2) A 水也挂
A. Pineapple Incident time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Codeforces Round #362 (Div. 2) D. Puzzles
D. Puzzles time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
随机推荐
- 在Windows下通过命令行或者.bat文件统计一个目录中文件数量
在Windows下面怎样通过命令行统计一个目录中文件的数量,或者说,如果在一个.bat文件中,统计一个目录中的文件数量? 我原来以为是不可能的,要编一个vbs程序什么的,后来到网上找了下,发现还真是可 ...
- uva 1642 Magical GCD
很经典的题目,愣是没做出来.. 题意:给出一个序列,求一子序列,满足其GCD(子序列)* length(子序列)最大. 题解: 类似单调队列的思想,每次将前面所得的最大公约数与当前数进行GCD,若GC ...
- 通过org.springframework.web.filter.CharacterEncodingFilter定义Spring web请求的编码
通过类org.springframework.web.filter.CharacterEncodingFilter,定义request和response的编码.具体做法是,在web.xml中定义一个F ...
- UVA 11294 Wedding(2-sat)
2-sat.不错的一道题,学到了不少. 需要注意这么几点: 1.题目中描述的是有n对夫妇,其中(n-1)对是来为余下的一对办婚礼的,所以新娘只有一位. 2.2-sat问题是根据必然性建边,比如说A与B ...
- codevs 1218 疫情控制
啊好烦这道题.... 基本思路网上都有. 注意的一点是在匹配的时候,如果有军队的来源没有被匹配到,那么就先匹配这个来源.(因为不花钱). 不过数据好水.... #include<iostream ...
- Linux find xargs rm .orig
/********************************************************************* * Linux find xargs rm .orig * ...
- mysql的MMM高可用方案
1 MMM高可用mysql方案 1.1 方案简介 MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器)关于mysql主主复 ...
- mysql优化小技巧
对mysql优化时一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索引.主键索引.唯一索引unique.全文索引] c: 分表技术(水平 ...
- UTF-8编码规则
UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所 ...
- hdu 2155 小黑的镇魂曲(dp) 2008信息工程学院集训队——选拔赛
感觉蛮坑的一道题. 题意很像一个叫“是男人下100层”的游戏.不过多了个时间限制,要求在限定时间内从某一点下落到地面.还多了个最大下落高度,一次最多下落这么高,要不然会摔死. 一开始想dp的,然后想了 ...