http://poj.org/problem?id=3468线段树简单 成段更新 区间求和

http://poj.org/problem;jsessionid=57CE7F39567FF9BFA128CDB4A2E8D728?id=2553 第一道强连通分量题,tarjan算法+缩点,,输出出度为0的顶点。。。 //强连通分量为搜索树中的一颗子树 //stack自定义栈,dfn(u)为结点u的次序编号 //low(u)为u或u的子树能够追溯到的最早的栈中结点的次序号 //belong[u]为u所属连通分量 #include #include #include #include #define N 5005 using namespa 阅读详情

这题是昨天的比赛题,昨天比赛完美被大一的虐了,感觉自己真是白活了,一头撞死算了,人家大一的做了5题,而我这个水货这做了两道签到题;明显昨天知道这个题目是线段树,刚开始还想用树状数组试试,后来写完了发现不是插线问点,结果可想而知,代码重写,再看时线段树,然后不会了,自己只会单点更新,以后努力了,没有时间给自己犹豫了;抓紧时间学习数据结构,还有贪心,图论,搜索,还有C++;任重道远;

其中本题的延迟标记完全不知道是什么原理;先把代码记着吧;今天这题调试了一天;各种跪,ORZ哭

#include <iostream>
#include <cstdio>
using namespace std;
#define N 100005
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1 | 1
__int64 sum[N<<2];
__int64 mark[N<<2];
 inline void PushUp(int rt)
 {
  sum[rt]= sum[rt<<1] + sum[rt<<1|1];
 }
 void PushDown(int rt,int len)
 {
    if(mark[rt])
	{
	  mark[rt<<1] += mark[rt];
	  mark[rt<<1|1] += mark[rt];

	  sum[rt<<1] += mark[rt] * (len-(len >> 1));
	  sum[rt<<1 | 1] += mark[rt] * (len >> 1);
	  mark[rt]=0;
	}
 }
 void build(int l,int r,int rt)
 {
     mark[rt]=0;
    if(l == r)
    {
       scanf("%I64d",&sum[rt]);
        return;
    }
  int mid=(l+r)>>1;
     build(lson);
	 build(rson);
	 PushUp(rt);
 }
 void update(int L,int R,__int64 val,int l,int r,int rt)
 {
     if(L<=l&&R>=r)
	 {
	  mark[rt] += val;
	  sum[rt] += val * (r-l+1);
	  return ;//你妹啊没有加这个 return ;runtime error ORZ啊,今天早上开始就写这个东西,竟然是这样的问题[-_-]
	 }
	 PushDown(rt,r-l+1);
	int mid=(l+r)>>1;
	 if(mid>=L) update(L,R,val,lson);
	 if(mid<R)update(L,R,val,rson);
	 PushUp(rt);
 }
 __int64 Query(int L,int R,int l,int r,int rt)
 {
      if(L<=l&&r<=R)
		  return sum[rt];
	  PushDown(rt,r-l+1);
	  int mid=(l+r)>>1;
	  __int64 res=0;
	  if(mid>=L)
		  res += Query(L,R,lson);
	  if(mid<R)
		  res += Query(L,R,rson);
	  return res;
 }
 int main()
 {
   int n,m,a,b;
   __int64 val;
   char op;
   scanf("%d%d",&n,&m);
    build(1,n,1);
	while(m--)
	{
		getchar();
	  scanf("%c %d%d",&op,&a,&b);
	  if(op=='Q')
	  {
	   printf("%I64d\n",Query(a,b,1,n,1));
	  }
	  else
	  {
	    scanf("%I64d",&val);
		update(a,b,val,1,n,1);
	  }
	}
  return 0;
 }


http://poj.org/problem?id=2663 Tri Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13989 Accepted: 6874 Description In how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is a sample tiling of a 3x12 rectangle. Input Input consists of several test ca 阅读详情

相关推荐

http://poj.org/problem?id=3468

poj上的题目,意思应该可以看懂。 这就要注意几个问题,1:首先注意数组大小,因为题目明确说明了,因此int 是不够用的,这也是许多人不太注意的地方,导致一直wa,2:就是要注意数据的每次更新,每个根节点都在变,因此sum 也在变,注意每次更新时注意要根节点变 ,sum也要跟着变。3:要注意的就是:在左右节点变化时,注意中间(mind)的取值,(r-l+1)/2; 这是应该注意,我个人认为比较...

一只奔跑的小羊 1088

http://poj.org/problem?id=3083

这算是poj上搜索中的水题!这只是在大部分人来讲吧!!对于我这样的菜鸟级的,哎,,还是参考了下别人打代码,才有点思路!其实这题仔细想过之后其实不难。 对于这道题首先我并非一点都不会,只是有一个地方不太会,就是选择方向上,就是左优先,和右优先。主要问题出在还不太会判断具体左右各自优先时,该怎样判断其方向。其实问题在我看过别人的解题思路之后,还是比较简单的。画个正方形,顺时钟就是向右优先,逆时针就是

一只奔跑的小羊 902

http://poj.org/problem?id=2299 树状数组 《复习》

//求解逆序数对:(后面的数比当前的数小的个数) //例:9 1 0 5 4 //9的逆序数:91 90 95 94 共有4个 //1的逆序数: 10 共有1个 //0的逆序数: 为0个 //5的逆序数:54为1个 //4的逆序数:0个 //所以9 1 0 5 4的逆序数共有6个 #include #include #include #include using namespace std; st

wahaha1_的专栏 621

POJ:Currency Exchange

原题地址:http://poj.org/problem?id=1860题目翻译:我们的城市有几个货币兑换点。让我们假设每一个点都只能兑换专门的两种货币。可以有几个点,专门从事相同货币兑换。每个点都有自己的汇率,外汇汇率的A到B是B的数量你1A。同时各交换点有一些佣金,你要为你的交换操作的总和。在来源货币中总是收取佣金。 例如,如果你想换100美元到俄罗斯卢布兑换点,那里的汇率是29.75,而佣金是

Demo的博客 623

http://poj.org/problem?id=1376

题意:一个直径机器人在一个m*n格子的木板上走,按照go或者turn命令走, go是指每秒走1-3米, turn是指转90度,花一秒, 问从起点到终点要花多少秒 知道原来的方向 #include #include using namespace std; int n,m,a[55][55],b[55][55],sx,sy,ex,ey,d[4][2]={{-1,0},{0,1},{1,

chenlang888的专栏 878

http://poj.org/problem?id=1011经典搜索dfs

自己第一次在linux下用vim 编写的代码,并且A题的,很高兴; 就是poj上面的一个搜索题;题目很是经典,搜索剪枝优化; #include #include #include #include using namespace std; int num[65]; bool vis[65]; int Max; int sum; bool ok; int n; int len; vo

920

http://poj.org/problem?id=2253

floyd的应用求每条路径两点之间最大距离的最小值#include #include #include #include using namespace std; int a[205],b[205],d[205][205]; int main(int argc, char *argv[]) { int n,i,j,k,m=0; while(cin>>n&&n) { for(i=

chenlang888的专栏 730

poj 3468 A Simple Problem with Integers

题目链接:http://poj.org/problem?id=3468 题目思路:splay,段更新求和。 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;string.h&gt; #include&lt;string&gt; #include&lt;queue&gt; #include&lt;algorithm&g...

java开发指南博客 【转载】 146

Java 线段树Segment Tree

线段树也称为区间树。 1.线段树介绍: 对于有一类问题,我们关心的是线段(或者区间)。 线段树的应用: 1.最典型的线段树问题:区间染色: m次操作后,我们可以看见多少种颜色? m次操作后,我们可以在[i,j]区间内看见多少种颜色? 有一面墙,长度为n,每次选择一段儿墙进行染色。 之前被染色的部分,还能继续被下一次染色所覆盖。 再两次覆盖: 可以使用数组来解决从[i...

抛弃幻想,准备斗争 993

【完全版】线段树(转载)

转载自:http://www.notonlysuccess.com/ 膜拜之。。。 【完全版】线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉得当时的代码风格实在是太丑了,很多线段树的初学者可能就是看着这篇文章来练习的,如果不小心被我培养出了这么糟糕的风格,实在是过意不去,正好过几天又要...

weixin_30836759的博客 426

线段树区间更新

#include &lt;bits/stdc++.h&gt; using namespace std; int n,tre[10003*4],int laz[10003*4]; void pushdown(int num){ if(laz[num]!=0){ tre[num*2]+=laz[num]; tre[num*2+1]+=laz[num]; ...

cj1064789374的博客 375

poj3468(树状数组)

题意:一道经典题,区间更新,区间查询。 解法:原来用的是线段树。后来学了树状数组的做法,感觉很神奇,贴上解法网址:http://www.docin.com/p-97026988.html?qq-pf-to=pcqq.c2c 代码:/**************************************************** * author:xiefubao ***********

xiefubao的专栏 1123

POJ 3468 A Simple Problem with Integers(线段树

题目地址:http://poj.org/problem?id=3468 思路:updata()区间增减,query()区间求和,会超int用long long AC代码: #include #include #include #include #include #include #include #include #include #include #include

Java识堂,一个有干货的微信公众号 372

线段树-区间更新求区间和】CDOJ 1057

秋实大哥与花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Status 秋实大哥是一个儒雅之人,昼听笙歌夜醉眠,若非月下即花前。 所以秋实大哥精心照料了很多花朵。现在所有的花朵排了一行,每朵花有一个愉悦值。 秋实大

Hi_jiaxinwei的博客 567

java贪心算法(线段树)的详细介绍

注意区间的改变!(原来的部分被重新区间的染色覆盖了) 注意以求和问题为列,把整个区间分为很多段,当你求那一段时候,这样直接就可以拿。 每一个孩子区间都是相应的父节点的半段 注意叶子节点不一定在最后一层 求和区间的实现: 定义一个接口(融合器就是方便我对区间的操作) ...

一曲无痕奈何 1156

【Java】线段树对数组更新及区间求和的原理和应用

线段树对数组更新求区间和的原理和应用 详解+实例+代码

weixin_54097596的博客 537

线段树

此处线段树是求区间和的用例 基本操作其实只有三个: 建立线段树,如果不是叶子结点,就递归向下构造,这里用data中的数据作为叶子结点的weight来构造。 更新线段树,更新data某个位置的值,需要将所有包含该位置的线段树更新。注意data和线段树是分开的,调用update方法并不影响data数组的值。 查询某一区间的值,使用线段树查询。 import java.util.*; public class Main { static int[] data; public static void m

鲍鲍 320

poj 1698线段树区间更新

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21856    Accepted Submission(s): 10963 Problem Description In the g

The_star_is_at的博客 387
上一篇: http://lightoj.com/volume_showproblem.php?problem=1059最小生成树变形
下一篇: http://acm.hdu.edu.cn/showproblem.php?pid=1698&&线段树 成段替换 延迟标记
Java_beginer1
博客等级 码龄16年 22粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值