Function---hdu5875(大连网选,区间连续求余)

题目链接: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=1; i<=n; i++)
            scanf("%d", &a[i]);

        a[0] = INF;

        for(int i=1; i<=n; i++)
        {
            for(int j=i+1; j<=n; j++)
            {
                if(a[j] <= a[i])
                {
                    pos[i] = j;
                    break;
                }
            }
        }
        scanf("%d", &m);
        for(int i=1; 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 0;
}

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

时间: 2024-08-28 06:15:04

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

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

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5877  题意:给你一颗树,有n个节点,每个节点都有一个权值v[i]:现在求有多少对(u,v)满足u是v的祖先,并且au*av<=k, k是已知的: 思路:从根节点开始dfs遍历整棵树,当遍历到某点u时,已经在栈中的节点都是u的祖先的,所以我们只要找到在栈中的节点有多少个是<=k/a[u]的即可: 由于n的值最大可达到10e5,所以直接查找是会TLE的,我们可以用线段树优化即可:在dfs

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

题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑.问最后最长的白色区间的起点和终点的位置. 解法:先离散化,为了防止离散后错误,不仅将L,R离散,还要加入L+1,L-1,R+1,R-1一起离散,这样就绝不会有问题了.然后建线段树,线段树维护四个值: 1.col  区间颜色  0 表示黑  1 表示白  -1表示无标记 2.maxi 区间内最大白区间的长度,由于白色用1表示,所以最大白区间的长度即为区间最

HDU 3911 区间合并求最大长度的问题

http://vjudge.net/problem/viewProblem.action?id=21557 题目大意: 每进行一次颜色改变都可以把一段区间内的黑石头变成白石头,白石头变成黑石头,最后问区间内黑石头连续的最大长度 这里我们可以用rev[]作为lazy标记,每次进行改变,rev[]^1 因为有黑白两种石头,我们求连续区间,需要维护黑,白两种石头的左侧最多,右侧最多和全部最多,所以我们这里可以用一个二维数组进行描述 每次做出改变,只要将黑白石头的值进行交换即可就方便了很多 对于最后访问

团 大连网赛 1007 Friends and Enemies

1 //大连网赛 1007 Friends and Enemies 2 // 思路:思路很棒! 3 // 转化成最大二分图 4 // 团:点集的子集是个完全图 5 // 那么朋友圈可以考虑成一个团,原题就转化成用团去覆盖怎样最多.团至少是2个点,所以就是n*n/4 6 7 #include <bits/stdc++.h> 8 using namespace std; 9 #define LL long long 10 typedef pair<int,int> pii; 11 co

关于大整数的加减乘除求余运算 java

自己用java 实现了大字符串整数的加减乘除和求余运算, 加减法的算法是模拟手工笔算的计算过程, 除法就是从最高位不停的减操作, 乘法的算法 :遍历一个数的各个位数以及他所在位置,另一个数根据这个数的位置末位添n个0,然后累加次数为这个位置数的数值 原创代码如下: public class Demo6 { public static void main(String[]args){ System.out.println(add("-989","989")); Sys

NKOI 2753 区间连续值

区间连续值 Time Limit:10000MS  Memory Limit:65536K Total Submit:58 Accepted:49 Case Time Limit:1000MS Description 有一数列只有0和1构成,数列中数字个数为为n. 现在有m个形式为x y的提问,询问区间[x,y]中,最多有多少个连续的1. 对于每个询问,请你快速做出回答 Input 第一行,两个整数n和m 第二行,n个空格间隔的数字,表示数列 接下来m行,每行两个空格间隔的整数x和y,表示一个询

HYSBZ 1036 树链剖分(单点更新区间求和求最大值)

http://www.lydsy.com/JudgeOnline/problem.php?id=1036 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身 Input 输入

学大数据选自学还是培训呢

在你决定学一门技术时,那么有一个问题是你必须关注的,那就是有哪些学习方式,哪种学习方式好,哪种学习方式是你心仪的?当不同的学习方式产生冲突时,你该选择什么样的学习方式?比如当下学大数据有最常见的就是自学大数据和大数据培训,学大数据选自学还是培训呢? 自学大数据肯定是大部分朋友比较心仪的,谁不心疼钱呢?但是大数据培训效果比较好啊,这也是不可否认的,当这两种学习方式发生冲突的时,你该选择哪种学习方式呢?你心里有底吗?对于大数据的学习,长沙尚学堂小编的建议是选择大数据培训,理由很多. 大数据要学的东西

大整数的求余运算

在加密系统中,长长要求把一行字符看作是一串二进制位,然后对某个固定的数进行求余运算. 解答: #include <stdio.h> int main() { const int K=34943; unsigned int L=0; unsigned char c; unsigned long long test=0b0011001100110100001110010011010000110011; //34943的ascii码 printf("%llu\n",test);