还是五月湘潭赛的题目,当时就是因为我坑。。。连个银牌都没拿到,擦。

这个题目枚举区间是不可能的,明显是要考虑每个数对全局的影响,即找到每个数最左和最右能满足是最大的位置 以及 最小的时候,相乘即为该数字影响的区间总数。当时想到的是用线段树,建树的时候求出最大和最小值,然后在每个数往里面搜索,比赛的时候敲挫了,那个时候真的线段树写的很挫,而且没考虑过一个问题,就是相同的时候怎么办,按刚刚的算法,会算重复的,所以一个好的方法是如果有相同的,往左搜的时候搜到等于该数值的时候停止,往右搜的时候搜到大于该数值的时候停止(求最大的时候),求最小的时候也是一样的处理

然后搜左边的时候优先走右子树,右子树没有 再找左子树。。同理右边先搜左孩子,没有再搜右孩子,注意些细节以及可以剪剪枝。

线段树写这个题目其实很费力,有种更好的方法用桟来做,栈在求最大最小的时候往往很给力,像这个题目,我比如在求左边最大的时候,我当前数,如果碰到栈顶数比它大于等于的,就直接停止了,入桟,否则就一直pop下去,直到遇到比它大于等于的或者桟空,这个时候得到了左边区间最大,并且把当前值放进去,因为我只保留左边区间离下个数最近的最大的数即可,如果连这个数都不能阻挡下一个数,那之前被pop掉的肯定也阻挡不了,所以扫一遍即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define LL __int64
using namespace std;
const int N = ;
int dmin[N<<],dmax[N<<];
int A[N];
int n;
void build(int rt,int l,int r)
{
if (l>=r){
dmin[rt]=A[l];
dmax[rt]=A[l];
return;
}
int mid=(l+r)>>;
build(lson);
build(rson);
dmax[rt]=max(dmax[rt<<],dmax[rt<<|]);
dmin[rt]=min(dmin[rt<<],dmin[rt<<|]);
}
int query1(int L,int R,int val,int rt,int l,int r)
{
if (L>R) return R;
if (l>=r){
if(l>=L &&l<=R && A[l]>=val){
return l;
}
else return ;
}
int mid=(l+r)>>;
if (R<=mid){
if (dmax[rt<<]>=val)
return query1(L,R,val,lson);
else return ;
}
int ret=;
if (dmax[rt<<|]>=val){
ret=query1(L,R,val,rson);
}
if (ret>) return ret;
if (dmax[rt<<]>=val)
return query1(L,R,val,lson);
else return ;
}
int query2(int L,int R,int val,int rt,int l,int r)
{
if (L>R) return L;
if (l>=r){
if (l>=L && l<=R && A[l]>=val){
return l;
}
else return n+;
}
int mid=(l+r)>>;
if (L>mid){
if (dmax[rt<<|]>=val)
return query2(L,R,val,rson);
else return n+;
}
int ret=n+;
if (dmax[rt<<]>=val){
ret=query2(L,R,val,lson);
}
if (ret<n+) return ret;
if (dmax[rt<<|]>=val)
return query2(L,R,val,rson);
else return n+;
}
int query3(int L,int R,int val,int rt,int l,int r)
{
if (L>R) return R;
if (l>=r){
if (L<=l && l<=R && A[l]<=val){
return l;
}
else return ;
}
int mid=(l+r)>>; if (R<=mid){
if (dmin[rt<<]<=val){
return query3(L,R,val,lson);
}
else return ;
}
int ret=;
if (dmin[rt<<|]<=val) ret=query3(L,R,val,rson);
if (ret>) return ret;
if (dmin[rt<<]<=val)
return query3(L,R,val,lson);
else return ;
}
int query4(int L,int R,int val,int rt,int l,int r)
{
if (L>R) return L;
if (l>=r){
if (L<=l && r<=R && A[l]<=val){
return l;
}
else return n+;
}
int mid=(l+r)>>;
if (L>mid){
if (dmin[rt<<|]<=val){
return query4(L,R,val,rson);
}
else return n+;
}
int ret=n+;
if (dmin[rt<<]<=val){
ret=query4(L,R,val,lson);
}
if (ret<n+) return ret;
else
if (dmin[rt<<|]<=val) return query4(L,R,val,rson);
return n+;
}
int main()
{
int t;
int kase=;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&A[i]);
build(,,n);
LL sum=;
for (int i=;i<=n;i++){
int l1=query1(,i-,A[i],,,n);
int l2=query2(i+,n,A[i]+,,,n);
int l3=query3(,i-,A[i],,,n);
int l4=query4(i+,n,A[i]-,,,n);
//cout<<"Test "<<i<<endl;
// cout<<l1<<" "<<l2<<" "<<l3<<" "<<l4<<endl;
sum+=(LL)(i-l1)*(LL)(l2-i)*(LL)A[i];
sum-=(LL)(i-l3)*(LL)(l4-i)*(LL)A[i];
}
sum+=(LL)n*(n+)/;
printf("Case %d: %I64d\n",++kase,sum);
}
return ;
}

XTU 1205 Range的更多相关文章

  1. XTUOJ 1205 Range

    Range Time Limit : 1000 MS Memory Limit : 65536 KB Problem Description For an array, the range funct ...

  2. SQL Server 合并复制遇到identity range check报错的解决

        最近帮一个客户搭建跨洋的合并复制,由于数据库非常大,跨洋网络条件不稳定,因此只能通过备份初始化,在初始化完成后向海外订阅端插入数据时发现报出如下错误: Msg 548, Level 16, S ...

  3. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  4. [LeetCode] Range Addition 范围相加

    Assume you have an array of length n initialized with all 0's and are given k update operations. Eac ...

  5. [LeetCode] Count of Range Sum 区间和计数

    Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...

  6. [LeetCode] Range Sum Query 2D - Mutable 二维区域和检索 - 可变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  7. [LeetCode] Range Sum Query - Mutable 区域和检索 - 可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  8. [LeetCode] Range Sum Query 2D - Immutable 二维区域和检索 - 不可变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  9. [LeetCode] Range Sum Query - Immutable 区域和检索 - 不可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

随机推荐

  1. Windows驱动开发-派遣函数

    一个简单的派遣函数格式 NTSTATUS DispatchFunction(PDEVICE_OBJECT pDeviceObject, PIRP pIrp) { //业务代码区 //设置返回状态 pI ...

  2. java并发之CopyOnWriteArraySet

    java并发之CopyOnWriteArraySet CopyOnWriteArraySet是基于CopyOnWriteArrayList实现的,持有CopyOnWriteArrayList的内部对象 ...

  3. Linux命令:history命令历史的管理及用法

    bash可以保存的过去曾经执行过的命令.当某个用户登录到shell中,会读取该用户家目录中的~/.bash_history文件,并将历史命令列表保存到内存中.当用户退出当前shell时,会将内存中的历 ...

  4. Zero 初识Sciter

    在浏览有关Sciter技术前,您需要花点时间浏览以下内容. 您是否需要花时间学习Sciter? 如果您的工作或您想从事的工作与桌面应用开发无关,那么您不需要学习Sciter. 如果您不认同HTML\C ...

  5. golang Context for goroutines

    概要 goroutine 的控制 取消控制 超时控制 goroutine 之间的传值 总结 概要 golang 的提供的 channel 机制是基于 CSP(Communicating Sequenc ...

  6. 自动PC端显示 手机端隐藏CSS代码判断实现

    实现场景描述: 有些内容部署在PC端但是有不适合在手机端显示(比如盒子过大,遮挡内容)或者手机端显示毫无意义等.我们可以使用下面的代码来实现:电脑端显示,手机端隐藏 实现方法: CSS控制判断 @me ...

  7. Vue3中的Proxy作用在哪里?

    目录 前言 Vue没有Proxy会怎么样? proxy开始 前言 在讲解Proxy之前,我们有些前置知识点是必要掌握的: Object相关静态函数 Reflect相关静态函数 简单说明知识盲点 名称 ...

  8. ssm框架前后端数据交互完整示例

    1.sprinMvc控制层 package com.dengfeng.house.controller; import java.text.ParseException; import java.ut ...

  9. CentOS7 环境下 在Hadoop集群安装Hive

    1.下载Hive的tar.gz包:http://mirror.bit.edu.cn/apache/hive/ 2.放入CentOS 7 系统中并解压:tar -zxvf apache-hive-2.3 ...

  10. Codestorm:Counting Triangles 查各种三角形的个数

    题目链接:https://www.hackerrank.com/contests/codestorm/challenges/ilia 这周六玩了一天的Codestorm,这个题目是真的很好玩,无奈只做 ...