Function

The shorter, the simpler. With this problem, you should be convinced of this truth. 
   
  You are given an array AA of NN postive integers, and MM queries in the form (l,r)(l,r). A function F(l,r) (1≤l≤r≤N)F(l,r) (1≤l≤r≤N) is defined as: 
F(l,r)={AlF(l,r−1) modArl=r;l<r.F(l,r)={All=r;F(l,r−1) modArl<r. 
You job is to calculate F(l,r)F(l,r), for each query (l,r)(l,r).

InputThere are multiple test cases. 
   
  The first line of input contains a integer TT, indicating number of test cases, and TT test cases follow. 
   
  For each test case, the first line contains an integer N(1≤N≤100000)N(1≤N≤100000). 
  The second line contains NN space-separated positive integers: A1,…,AN (0≤Ai≤109)A1,…,AN (0≤Ai≤109). 
  The third line contains an integer MM denoting the number of queries. 
  The following MM lines each contain two integers l,r (1≤l≤r≤N)l,r (1≤l≤r≤N), representing a query.OutputFor each query(l,r)(l,r), output F(l,r)F(l,r) on one line.Sample Input

1
3
2 3 3
1
1 3

Sample Output

2

预处理出每个数下一个比他小(或等于)的数的位置。然后跳着取模即可。

数据是有多水。。n^2预处理都能过。。

#include <bits/stdc++.h>
#define MAXN 100005
using namespace std; int a[MAXN],nxt[MAXN]; int main(void)
{
int T,n,m,l,r,ans;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int i = ; i <= n; i++) {
scanf("%d",&a[i]);
nxt[i]=n+;
}
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
if(a[i]>=a[j]){
nxt[i]=j;
break;
}
}
}
scanf("%d",&m);
while(m--) {
scanf("%d %d",&l,&r);
int ans=a[l];
for(int i=nxt[l];i<=r;i=nxt[i]){
if(i==n+) break;
ans%=a[i];
}
printf("%d\n",ans);
}
}
return ;
}

暴力预处理(非正解)

#include <bits/stdc++.h>
#define MAXN 100005
#define lson num << 1
#define rson num << 1 | 1
using namespace std;
struct node
{
int l,r;
int Min;
}tree[MAXN << ];
int a[MAXN],d1[MAXN];
int cur;
void pushup(int num)
{
tree[num].Min = min(tree[lson].Min,tree[rson].Min);
}
void build(int num,int l,int r)
{
tree[num].l = l;
tree[num].r = r;
if(l == r) {
tree[num].Min = a[l];
return;
}
int mid = (l + r) >> ;
build(lson,l,mid);
build(rson,mid + ,r);
pushup(num);
}
void query1(int num,int l,int r,int val)
{
if(tree[num].l == tree[num].r) {
if(tree[num].Min <= val) cur = min(cur,tree[num].l);
return;
}
int mid = (tree[num].l + tree[num].r) >> ;
if(tree[num].l == l && tree[num].r == r) {
if(tree[lson].Min <= val) query1(lson,l,mid,val);
else if(tree[rson].Min <= val) query1(rson,mid + ,r,val);
return;
}
if(r <= mid) query1(lson,l,r,val);
else if(l > mid) query1(rson,l,r,val);
else {
query1(lson,l,mid,val);
query1(rson,mid + ,r,val);
}
}
int main(void)
{
int T,n,m,l,r,Max,pos,val,ans;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
Max = ;
for(int i = ; i <= n; i++) {
scanf("%d",&a[i]);
d1[i] = ;
}
build(,,n);
d1[n] = n + ;
for(int i = ; i <= n - ; i++) {
cur = n + ;
query1(,i + ,n,a[i]);
d1[i] = cur;
}
/*for(int i = 1; i <= n; i++) {
printf("%d--\n",d1[i]);
}*/
scanf("%d",&m);
while(m--) {
scanf("%d %d",&l,&r);
int ans=a[l];
for(int i=d1[l];i<=r;i=d1[i]){
if(i==n+) break;
ans%=a[i];
}
printf("%d\n",ans);
}
}
return ;
}
/*
10
5
5 8 10 3 2 */

线段树预处理(正解)

HDU - 5875 Function(预处理)的更多相关文章

  1. HDU 5875 Function 优先队列+离线

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5875 Function Time Limit: 7000/3500 MS (Java/Others) ...

  2. HDU 5875 Function(RMQ-ST+二分)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total ...

  3. HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  4. HDU 5875 Function(ST表+二分)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5875 [题目大意] 给出一个数列,同时给出多个询问,每个询问给出一个区间,要求算出区间从左边开始不 ...

  5. HDU 5875 Function

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  6. HDU 5875 Function st + 二分

    Function Problem Description   The shorter, the simpler. With this problem, you should be convinced ...

  7. HDU 5875 Function 大连网络赛 线段树

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total ...

  8. HDU 5875 Function 2016 ACM/ICPC Asia Regional Dalian Online

    N个数(N<=100000),M个询问,每次询问L,R,求F(L,R). F(L,R)=F(L,R-1)%A[R] , L<R 这道题数据比较鶸 可以直接用递减爆 正确做法应该是倍增 用倍 ...

  9. HDU 5875 Function -2016 ICPC 大连赛区网络赛

    题目链接 网络赛的水实在太深,这场居然没出线zzz,差了一点点,看到这道题的的时候就剩半个小时了.上面是官方的题意题解,打完了才知道暴力就可以过,暴力我们当时是想出来了的,如果稍稍再优化一下估计就过了 ...

随机推荐

  1. BZOJ4920: [Lydsy1706月赛]薄饼切割

    BZOJ4920: [Lydsy1706月赛]薄饼切割 Description 有一天,tangjz送给了quailty一张薄饼,tangjz将它放在了水平桌面上,从上面看下去,薄饼形成了一个H*W的 ...

  2. ubuntun下安装sublime text

    Sublime Text 3 是一款轻量级.跨平台的文本编辑器.可安装在ubuntu,Windows和MAC OS X上高级文本编辑软件,有一个专有的许可证,但该程序也可以免费使用,无需做逆向工程.如 ...

  3. Cglib学习报错 java.lang.reflect.InvocationTargetException-->null

    package javacore.testForCglibProxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhan ...

  4. python调试利器:最直观简洁的错误日志

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-08-30 17:12:27 # @Author : Sheldon (thi ...

  5. win下发现两个有用的快捷键

    调出命令行工具:win+x然后a.默认是cmd的管理员模式,可以改成powershell. 从当前目录打开命令行:shift + 鼠标右键

  6. 虫草医药网站html模板

    虫草医药网站html模板是一款宝王虫草医药网站模板html源码整站下载. 模板地址:http://www.huiyi8.com/sc/8783.html

  7. Struts2 输入校验 第四弹

    ActionSupport 里面有一个validate.可以重写里面你的方法. 校验执行流程: 1)首先进行类型转化 2)然后进行输入校验(执行validate方法) 3)如果在上述过程中出现了任何错 ...

  8. ffmpeg去水印

    1.用potplayer打开有水印的视频文件,截图一张待用.2.用IrfanView打开保存的图片,调整到100%大小,按住鼠标左键框选水印位置,记下标题“Selection:”右边的4组数字.3.f ...

  9. 使用IE11的F12开发人员工具进行网页前端性能测试

    用IE访问被测网站(我的是IE11,EDGE浏览器相同),定位到你要测试的动作所在页面或被测页面的前一页.按F12调出开发人员工具,其它的功能我就不介绍了,直接切换到性能选项卡. 根据提示按快捷键ct ...

  10. codeforces 566D D. Restructuring Company(并查集)

    题目链接: D. Restructuring Company time limit per test 2 seconds memory limit per test 256 megabytes inp ...