题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5875

题意:有n个数,m个查询,每个查询有一个区间[L, R], 求ans, ans = a[L]%a[L+1]%a[L+2]%...%a[R];

方法一:算是暴力吧,只能说数据太水;

用pos[i] = j 表示第 i 个元素后面的一个<= a[i]的下标是 j ;

然后直接跳到当前位置即可,(我感觉如果数中有10e5个严格递减或者严格递增的序列是会TLE吧)但是这个还是过了,我想应该是数据太弱了吧

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define met(a, b) memset(a, b, sizeof(a))
#define N 100005
#define INF 0x3f3f3f3f
typedef long long LL;
#define Lson r<<1
#define Rson r<<1|1 int n, a[N], pos[N], m; int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i=; i<=n; i++)
scanf("%d", &a[i]); a[] = INF; for(int i=; i<=n; i++)
{
for(int j=i+; j<=n; j++)
{
if(a[j] <= a[i])
{
pos[i] = j;
break;
}
}
}
scanf("%d", &m);
for(int i=; i<=m; i++)
{
int L, R;
scanf("%d %d", &L, &R);
int ans = a[L];
while(ans && pos[L]<=R && L)
{
ans = ans%a[pos[L]];
L = pos[L];
}
printf("%d\n", ans);
}
}
return ;
}

方法二:在每个查询的时候,用线段树查找,当在区间[L, R]中找到第一个<=num的位置即可;

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define met(a, b) memset(a, b, sizeof(a))
#define N 400005
#define INF 0x3f3f3f3f
typedef long long LL;
#define Lson r<<1
#define Rson r<<1|1 struct node
{
int L, R, Min;
int mid() {return (L+R)/;}
}a[N]; int n, t[N]; void Build(int r, int L, int R)
{
a[r].L = L, a[r].R = R; if(L == R)
{
scanf("%d", &a[r].Min);
t[L] = a[r].Min;
return ;
} Build(Lson, L, a[r].mid());
Build(Rson, a[r].mid()+, R); a[r].Min = min(a[Lson].Min, a[Rson].Min);
} int Query(int r, int L, int R, int num)
{
if(a[r].Min > num)
return n+;
if(a[r].L >= L && a[r].R <= R)
{
if(a[r].L == a[r].R) return a[r].L;
if(a[Lson].Min <= num)
return Query(Lson, L, R, num);
else
return Query(Rson, L, R, num);
}
else
{
if(L <= a[r].mid())
{
int pos = Query(Lson, L, R, num);
if(pos <= R)
return pos;
}
if(R > a[r].mid())
{
int pos = Query(Rson, L, R, num);
if(pos <= R)
return pos;
}
}
return n+;
} int main()
{
int T, m;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n); Build(, , n); scanf("%d", &m); for(int i=; i<=m; i++)
{
int L, R;
scanf("%d %d", &L, &R);
int pos = L, ans = t[L];
while(pos <= R && ans)
{
pos = Query(, pos+, R, ans);
if(pos<=R) ans = ans%t[pos];
}
printf("%d\n", ans);
}
}
return ;
}
/*
15
6
4 6 5 3 2 8
15
1 6
*/

Function---hdu5875(大连网选,区间连续求余)的更多相关文章

  1. Weak Pair---hud5877大连网选(线段树优化+dfs)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5877  题意:给你一颗树,有n个节点,每个节点都有一个权值v[i]:现在求有多少对(u,v ...

  2. 2016 大连网赛---Function(单调栈)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5875 Problem Description The shorter, the simpl ...

  3. ZOJ 2301 / HDU 1199 Color the Ball 离散化+线段树区间连续最大和

    题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑.问最后最长的白色区间的起点和终点的位置. 解法:先离散化 ...

  4. 动态规划-----hdu 1024 (区间连续和)

    给定一个长度为n的区间:求m段连续子区间的和 最大值(其中m段子区间互不相交) 思路: dp[i][j]: 前j个元素i个连续区间最大值 (重要 a[j]必须在最后一个区间内) 转移方程:dp[i][ ...

  5. 2016 大连网赛---Different GCD Subarray Query(GCD离散+树状数组)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5869 Problem Description This is a simple probl ...

  6. 团 大连网赛 1007 Friends and Enemies

    //大连网赛 1007 Friends and Enemies // 思路:思路很棒! // 转化成最大二分图 // 团:点集的子集是个完全图 // 那么朋友圈可以考虑成一个团,原题就转化成用团去覆盖 ...

  7. 求余区间的求和类问题 离线+线段树 HDU4228

    题目大意:给一个数组a,他的顺序是严格的单调增,然后有如下三个操作 ①加入一个val到a数组里面去,加入的位置就是a[i-1]<val<a[i+1] ②删除一个a[i]=val的值 ③查询 ...

  8. HDU2303(数论)大整数求余+素数筛选

    Sample Input 143 10 143 20 667 20 667 30 2573 30 2573 40 0 0   Sample Output GOOD BAD 11 GOOD BAD 23 ...

  9. 区间连续长度的线段树——洛谷P2894 [USACO08FEB]酒店Hotel

    https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace ...

随机推荐

  1. wp控件

    导航控件 Silverlight的Windows Phone应用程序是基于一种可以让用户在不同页面内容间来回导航的页面模型.这个模型是基于其中的frame控件,而页面间的导航就是靠它. 下面的表格列出 ...

  2. Interleaving String leetcode java

    题目: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given ...

  3. 【wikioi】1191 数轴染色(线段树+水题)

    http://wikioi.com/problem/1191/ 太水的线段树了,敲了10分钟就敲完了,但是听说还有一种并查集的做法?不明觉厉. #include <cstdio> #inc ...

  4. iOS中--NSArray调用方法详解 (李洪强)

    下面的例子以     NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"to ...

  5. 针对binlog MIXED格式对表的增删改统计分析

    通常情况下DB都是有非常完整的监控的,那么如果监控不完善,那么在某段时间内又发生了性能问题,那么我们也可以分析binlog来尝试找到问题.下面就贴出命令,其实就是常用的命令组合. mysqlbinlo ...

  6. mysql 和字符串截取相关的知识点

    LOCATE(',','123,456') - 1) SELECT LEFT('123,456',3); SELECT LEFT('123,456',LOCATE(',','123,456') - 1 ...

  7. hibernate将本地SQL查询结果封装成对象

    hibernate将本地SQL查询结果封装成对象 不知道大家有没有碰过这种情况,迫于很多情况只能用native SQL来查询(如:复杂统计等),然而使用native查询后,结果会被放到object里, ...

  8. java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntim [问题点数:40分,结帖人wangxiaohua_001]

    14:56:10.093 WARN!! Error for /butterfly/plugins/zhonghang/UsefulData/save_usefuldata.bshjava.lang.N ...

  9. 2016.03.31,英语,《Vocabulary Builder》Unit 08

    tend/tent: from the Latin tendere, meaning 'to stretch, extend, or spread'. tent: [tent] n. 帐篷 vt.&a ...

  10. DS实验题 Searchname

    题目: 思路: 如果直接暴力搜索的话,时间复杂度为O(n*m),在n为百万量级的情况下,必然是T. 所以,这里通过hash函数,将字符串转换为对应的hash值:同时利用邻接表避免了hash冲突,方法是 ...