codeforces 696A Lorenzo Von Matterhorn 水题

这题一眼看就是水题,map随便计

然后我之所以发这个题解,是因为我用了log2()这个函数判断在哪一层

我只能说我真是太傻逼了,这个函数以前听人说有精度问题,还慢,为了图快用的,没想到被坑惨了,以后尽量不用

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
typedef long long LL;
const int N  = 3e6;
const LL mod = 1e9+7;
map<LL,LL>mp;
int get(LL x){
  for(int i=0;;++i){
    LL tmp1=(1ll<<i);
    LL tmp2=(1ll<<(i+1))-1;
    if(x>=tmp1&&x<=tmp2)return i;
  }
}
int main(){
  int q;
  scanf("%d",&q);
  while(q--){
    LL u,v,w;
    int op;
    scanf("%d%I64d%I64d",&op,&u,&v);
    int curu=get(u),curv=get(v);
    if(curu<curv){swap(u,v);swap(curu,curv);}
    if(op==1){
      scanf("%I64d",&w);
      while(curu>curv){
        if(mp.find(u)==mp.end())mp[u]=w;
        else mp[u]+=w;
        u>>=1;--curu;
      }
      while(u!=v){
        if(mp.find(u)==mp.end())mp[u]=w;
        else mp[u]+=w;
        if(mp.find(v)==mp.end())mp[v]=w;
        else mp[v]+=w;
        u>>=1;v>>=1;
      }
    }
    else{
       w=0;
       while(curu>curv){
        if(mp.find(u)!=mp.end())w+=mp[u];
        --curu;u>>=1;
       }
       while(u!=v){
        if(mp.find(u)!=mp.end())w+=mp[u];
        if(mp.find(v)!=mp.end())w+=mp[v];
        u>>=1;v>>=1;
       }
       printf("%I64d\n",w);
    }
  }
  return 0;
}

时间: 2025-01-02 09:09:43

codeforces 696A Lorenzo Von Matterhorn 水题的相关文章

【STL】Codeforces 696A Lorenzo Von Matterhorn

题目链接: http://codeforces.com/problemset/problem/696/A 题目大意: 一个满二叉树,深度无限,节点顺序编号,k的儿子是k+k和k+k+1,一开始树上的边权都为0 N(N<=1000)个操作,操作两种,1是从u到v的路径上的所有边权+w,2是求u到v的边权和.(1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109) 题目思路: [STL] 用map写很快,第一次用很生疏.现学只看了一点点. 因为是满二叉树所以直接暴力求LCA和求解,

CodeForces 696A Lorenzo Von Matterhorn (LCA + map)

方法:求出最近公共祖先,使用map给他们计数,注意深度的求法. 代码如下: #include<iostream> #include<cstdio> #include<map> #include<cstring> using namespace std; #define LL long long map<LL,LL> sum; int Get_Deep(LL x) { for(int i = 0; i < 63; i++) { if((1LL

Codeforces Round #362 (Div. 2) C. Lorenzo Von Matterhorn LCA(最近公共祖先)

C. Lorenzo Von Matterhorn time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Barney lives in NYC. NYC has infinite number of intersections numbered with positive integers starting from 1. Ther

CodeForces 707A Brain&#39;s Photos (水题)

题意:给一张照片的像素,让你来确定是黑白的还是彩色的. 析:很简单么,如果有一种颜色不是黑白灰,那么就一定是彩色的. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #i

M - Lorenzo Von Matterhorn (二叉树 )

Barney lives in NYC. NYC has infinite number of intersections numbered with positive integers starting from 1. There exists a bidirectional road between intersections i and 2i and another road between i and 2i?+?1 for every positive integer i. You ca

codeforces 710A A. King Moves(水题)

题目链接: A. King Moves 题意: 给出king的位置,问有几个可移动的位置; 思路: 水题,没有思路; AC代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <bits/stdc++.h> #include <stack> #include &l

CodeForces 589I Lottery (暴力,水题)

题意:给定 n 和 k,然后是 n 个数,表示1-k的一个值,问你修改最少的数,使得所有的1-k的数目都等于n/k. 析:水题,只要用每个数减去n/k,然后取模,加起来除以2,就ok了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cma

CodeForces 696A(Lorenzo Von Matterhorn ) &amp; CodeForces 696B(Puzzles )

A,给一棵完全二叉树,第一个操作,给两个点,两点路径上的所有边权值都增加w,第二个操作,给两个点,求两点路径上的所有边权值和. 我看一眼题就觉得是树链剖分,而我又不会树链剖分,扔掉. 后来查了题解,首先数据范围是1e18不可能是树剖,其次完全二叉树啊!不是普通的树啊!!sb... //我做过此题,没做出来,被学弟教会..虽然我做的题少,但我一向觉得至少自己做过的题都是记得的...但是.... #include <algorithm> #include <iostream> #inc

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