Codeforces 768B - Code For 1(分治思想)

768B - Code For 1

思路:类似于线段树的区间查询。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a))
int query(ll L,ll R,ll n,ll l,ll r)
{
    if(L>r||R<l||!n)return 0;
    if(n==1)return 1;
    ll m=(l+r)>>1;
    return query(L,R,n/2,l,m-1)+query(L,R,n%2,m,m)+query(L,R,n/2,m+1,r);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    ll n,l,r;
    cin>>n>>l>>r;
    ll L=0,x=n;
    while(x)L=L*2+1,x>>=1;
    cout<<query(l,r,n,1,L)<<endl;
    return 0;
}
时间: 2024-11-09 05:04:49

Codeforces 768B - Code For 1(分治思想)的相关文章

归并排序,分治思想

merge函数将两列有序序列合成一列. merge_sort 函数使用分治思想,递归求解.将对一个序列排序转换成对左右两个序列排序,一直到序列长度为一时,递归开始回升.再将左右两个已经排好序的序列合并. // // main.cpp // merge_sort // // Created by Fangpin on 15/3/9. // Copyright (c) 2015年 FangPin. All rights reserved. // #include <iostream> #inclu

Codeforces Zepto Code Rush 2014 Feed with Candy 贪心

A. Feed with Candy time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output The hero of the Cut the Rope game is a little monster named Om Nom. He loves candies. And what a coincidence! He also is

经典算法宝典——分治思想(四)(1)

分治法(Divide and Conquer)的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的几个相似问题,以便各个击破,分而治之. 说明: 分治策略的应用很广,具体表现形式各异,比如:折半查找.合并排序.快速排序.二叉树遍历(先遍历左子树再遍历右子树).二叉排序树的查找等算法. 一.分治算法框架 1.算法设计思想 分治法求解问题的过程是,将整个问题分解成若干个小问题后分而治之.如果分解得到的子问题相对来说还太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出方

分治思想在Trimino拼图中的Java实现

近期学习<算法设计与分析基础 第二版>,学习到了分治法,被课后习题吸引了,即Trimino拼图问题.想了好久,都没有想到如何去分而治之.然后就是Google到了相关的PPT.一看就明白了.自己就用代码实现了下.理解思想后,代码实现挺容易的. 这个谜题实际上可以做成一个小益智游戏. 分治思想的关键就在于构造相同的子问题.这是这个思想核心看似简单,实则需要对问题的洞察力.看到的PPT核心图如下: 算法的源代码如下: /**  * @author shuaiguangying  * 用分治法解决棋盘

分治思想--小测试(归并排序后续)

1 package cn.it; 2 3 import java.util.Arrays; 4 // 利用分治思想 实现 归并排序 5 public class Fz { 6 public static void main(String[] args) { 7 int a[]={1,2,3,4,5,6,8,7,3,4,9,0}; 8 int temp[] = new int[a.length]; 9 sortdiv(a, 0, a.length-1, temp); 10 System.out.p

排序算法大集锦_二路归并排序_2&3(分治思想)

第一段代码和合并排序差不多,用它来和第二段代码--二路归并排序作对比. 这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h> #include <limits.h> #include <malloc.h> void merge(int *m, int x, int y, int z) { int b1,b2,i,j,k; b1=y

CodeForces 283C Coin Troubles 分析+背包思想

很灵活的题目,题意简单,看到又是钱币问题,类似于那种给了一定数目T,有n种钱币,每种的价值,让你组合成总价值为T的方案数,但是加了一些限制条件,那就是某些种类钱币数量必须大于另一些种类的,加了个限制条件 我就脑残了,唉智商看来是真不够啊 ,后来看了别人的分析 倘若种类a的钱币数量必须要大于种类b的数量,那么如果我要 去 m张b种类的钱币,其实同时也是相当于已经取了m张a种类的,因为a必须大于b的嘛,所以我们可以通过这样来修改题目给的钱币的价值,若a种类数量必须大于b种类数量,且a种类价值为A,b

Codeforces Avito Code Challenge 2018 D. Bookshelves

Codeforces Avito Code Challenge 2018 D. Bookshelves 题目连接: http://codeforces.com/contest/981/problem/D Description Mr Keks is a typical white-collar in Byteland. He has a bookshelf in his office with some books on it, each book has an integer positive

一次性弄懂到底什么叫做分治思想(含有大量经典例题,附带详细解析)

期末了,通过写博客的方式复习一下算法,把自己知道的全部写出来 分治:分而治之,把一个复杂的问题分解成很多规模较小的子问题,然后解决这些子问题,把解决的子问题合并起来,大问题就解决了 但是我们应该在什么时候用分治呢?这个问题也困扰了我很久,做题的时候就不知道用什么算法 能用分治法的基本特征: 1.问题缩小到一定规模容易解决 2.分解成的子问题是相同种类的子问题,即该问题具有最优子结构性质 3.分解而成的小问题在解决之后要可以合并 4.子问题是相互独立的,即子问题之间没有公共的子问题 第一条大多数问