1006 How many?
| Time Limit: 3000MS | Memory Limit: 65536K | |||
| Total Submissions: 36 | Accepted: 2 | |||
Description
有一天,小Q给了小J一些数字,让小J帮忙找到其中最大的数,由于小J是一个程序猿,当然写了一个代码很快的解决了这个问题。这时,邪恶的小Y又出现了,他问小J,假如我只需要知道这些数字中的某个区间的最大值,你还能做嘛?小J经过七七四十九天的思考,终于完美的解决了这道题目,这次,他想也让小Y尝尝苦头,于是他问小Y,我现在想知道存在多少不同的区间的最大值大于等于k,你还能做吗?这次,小Y犯了难,他来请教身为程序猿的你。
Hint:一个区间指al, al+1, …, ar,这一段的数且l <= r,一个区间的最大值指max{ al, al+1,
…, ar },两个区间[l1, r1]、 [l2, r2]不同当且仅当l1不等于l2或r1不等于r2。
Input
第一行为一个整数T(1<=T<=5),代表样例数。接下来每组样例的第一行读入一个正整数n(1<=n<=100000)。接下来一行读入n个正整数ai (1 <= ai <=
100000)。接下来一行一个正整数Q(1<=Q<=100000),表示有Q组询问。接下来Q行,每行一个正整数k(1<= k <=100000)。
Output
对于每组样例,先输出“Case #ca:”,ca从1开始。接下来Q行,每行一个正整数,表示存在多少区间大于等于k。
Sample Input
3
1 2 3
3
1
2
3
Sample Output
6
5
3
这题可以用单调队列做,先处理出以每个数为最大值的区间,然后再把询问都读入,然后按询问的值从大到小排序,然后每次把数字大于等于询问值的区间都加进去,加进去的值为(idx-l[i]+1)*(r[i]-idx+1),注意,如果出现5 4 5的情况,即第一个5和第二个5的边界是相同的,那么就只能加一次。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
#define inf 99999999
#define pi acos(-1.0)
#define maxn 100050
ll a[maxn];
struct node{
int l,r,idx;
}temp;
vector<node>pos[maxn];
vector<node>::iterator it;
int q[1111111][2],l[maxn],r[maxn];
struct node1{
int num,idx;
}question[maxn];
ll ans[maxn];
bool cmp(node1 a,node1 b){
return a.num>b.num;
}
int main()
{
int n,m,i,j,T,front,rear,t,cas=0;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=1;i<=100000;i++)pos[i].clear();
front=1;rear=0;
for(i=1;i<=n;i++){
while(front<=rear && q[rear][0]<=a[i])rear--;
if(front>rear)l[i]=1;
else l[i]=q[rear][1]+1;
rear++;
q[rear][0]=a[i];
q[rear][1]=i;
}
front=1;rear=0;
for(i=n;i>=1;i--){
while(front<=rear && q[rear][0]<=a[i])rear--;
if(front>rear)r[i]=n;
else r[i]=q[rear][1]-1;
rear++;
q[rear][0]=a[i];
q[rear][1]=i;
}
for(i=1;i<=n;i++){
temp.l=l[i];
temp.r=r[i];
temp.idx=i;
pos[a[i] ].push_back(temp);
}
scanf("%d",&t);
for(i=1;i<=t;i++){
scanf("%d",&question[i].num);
question[i].idx=i;
}
sort(question+1,question+1+t,cmp);
ll num=100005;
ll sum=0;
for(i=1;i<=t;i++){
while(num>=question[i].num){
ll pre=0,ll,rr;
for(it=pos[num].begin();it!=pos[num].end();it++){
temp=*it;
ll=temp.l;
if(temp.l<=pre){
ll=pre+1;
}
rr=temp.r;
sum+=(temp.idx-ll+1)*(rr-temp.idx+1);
pre=temp.idx;
}
num--;
}
ans[question[i].idx]=sum;
}
cas++;
printf("Case #%d:\n",cas);
for(i=1;i<=t;i++){
printf("%lld\n",ans[i]);
}
}
return 0;
}
1006 How many?的更多相关文章
- SCNU 2015ACM新生赛初赛【1006. 3D打印】解题报告
题目链接详见SCNU 2015新生网络赛 1006. 3D打印 .出题思路来自codevs 3288. 积木大赛,属于模拟题. 首先我们把“选择从第L部分到第R部分”理 ...
- PKU 1006
数学问题吧,有兴趣的可以研究一下“中国剩余定理” // 1006.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include < ...
- 【BZOJ】1006: [HNOI2008]神奇的国度
http://www.lydsy.com/JudgeOnline/problem.php?id=1006 题意:在一个弦图中找最少染色数.(n<=10000, m<=1000000) #i ...
- BZOJ 1006 [HNOI2008] 神奇的国度(简单弦图的染色)
题目大意 K 国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即 AB 相互认识,BC 相互认识,CA 相互认识,是简洁高效的.为了巩固三角关系,K 国禁止四边关系,五边关系等 ...
- POJ 1006 - Biorhythms (中国剩余定理)
B - Biorhythms Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Subm ...
- 1006 最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...
- PAT乙级 1006. 换个格式输出整数 (15)
1006. 换个格式输出整数 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百” ...
- BZOJ 1006 神奇的国度(弦图的染色数)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1006 题意:给定一个弦图,求最小染色数.就是用最小数目的颜色进行染色使得任意两个相邻的节 ...
- 16年大连网络赛 1006 Football Games
题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=725&pid=1006 Football Games Time ...
- BNUOJ 1006 Primary Arithmetic
Primary Arithmetic 来源:BNUOJ 1006http://www.bnuoj.com/v3/problem_show.php?pid=1006 当你在小学学习算数的时候,老师会教你 ...
随机推荐
- Flutter 基础组件:单选框和复选框
前言 Material组件库中提供了Material风格的单选开关Switch和复选框Checkbox,虽然它们都是继承自StatefulWidget,但它们本身不会保存当前选中状态,选中状态都是由父 ...
- IPC 经典问题:Reader & Writer Problem
完整代码实现: #include <stdio.h> #include <unistd.h> #include <time.h> #include <stdl ...
- Docker学习笔记之使用Docker数据卷
Docker数据卷将数据存储到主机而非容器,多个容器需要共享数据时,常常使用数据卷. 1. 为容器设置数据卷(不指定主机目录) 2. 容器与主机之间.容器与容器之间共享数据卷(指定主机目录) 3. 使 ...
- Linux应急响应--入侵排查
1.入侵者可能会删除机器的日志信息,可以查看日志信息是否还存在或者是否被清空,相关命令示例: ll -h /var/log/* 系统日志一般都存在/var/log下常用的系统日志如下:核心启动日志: ...
- Unsafe Filedownload - Pikachu
概述: 文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后会开始执行下载代码,将该文件名对应的文件r ...
- 用CSS实现蒙德里安名画|学习麻瓜编程以项目为导向入门前端 HTML+CSS+JS
实现项目:用CSS实现蒙德里安名画 1.首先,献上代码和效果图 1.1代码: <head> <style> .centerframe{ display: flex; heigh ...
- 过压保护IC和带LDO模式的Li+充电器前端保护IC
PW2601是一种充电器前端集成电路,旨在为锂离子提供保护电池充电电路故障.该设备监测输入电压,电池电压以及充电电流,以确保所有三个参数都在正常范围内工作.这个该设备将关闭内部MOSFET断开,以保护 ...
- 基于scrapy框架的分布式爬虫
分布式 概念:可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取. 原生的scrapy是无法实现分布式 调度器无法被共享 管道无法被共享 基于 scrapy+redi ...
- JS实现鼠标移入DIV随机变换颜色
今天分享一个在 JavaScript中,实现一个鼠标移入可以随机变换颜色,本质就是js的随机数运用. 代码如下: <!DOCTYPE html> <html> <head ...
- Caffeine 缓存库
介绍 Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能的缓存库. 缓存和ConcurrentMap有点相似,但还是有所区别.最根本的区别是ConcurrentMap将会持有所有加 ...