2016大连网络赛 1008 & hdu5875 (优先队列+离线)=不确定暴力

题意:给你一个区间,求a_l%a_(l+1)%a_(l+2)%…%a_r 的值

分析:听说一个数在给定区间中只有不是很多的位置可一连续对它求模,所以想到一个比较暴力有可行的方法,猜想复杂度应该是nlogn。具体是这样的,从左到有枚举每个位置,

L[]记录[1,r]中所有元素连续取模到r的值。一开始把a[1]加进优先队列pq,对于第二位置,若pq.top()>=a[i],取出并取模,然后更新对应的位置l的答案,并把取模后答案插入优先队列,然后处理有区间是2的所有询问。对于第i个位置,若pq.top()>=a[i],取出并取模,然后更新对应位置l的答案,然后把取模后答案插入pq,然后处理右区间是i的所有询问。看上去是O(n^2)复杂度,其实并不会达到这么大,对于证明嘛…并不造..xjb乱猜。

差点忘记说坑了,要是用离线化做的话,询问是有相同的。(一开始用map记录gg了)

/************************************************
Author        :DarkTong
Created Time  :2016/9/10 20:54:34
File Name     :1008.cpp
*************************************************/

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double eps = 1e-9;
const int maxn = 100000 + 100;
typedef pair<int, int> Pair;
int ans[maxn], L[maxn];
vector<Pair> R[maxn];     //(L, id)
priority_queue<Pair> cal; //(num, pos)

int main()
{
    int T, cas=1, n;
    scanf("%d", &T);
    while(T--)
    {
        while(!cal.empty()) cal.pop();
        for(int i=0;i<maxn;++i) R[i].clear();

        scanf("%d", &n);
        for(int i=1;i<=n;++i) scanf("%d", &L[i]);
        int l, r, q;
        scanf("%d", &q);
        for(int i=1;i<=q;++i)
        {
            scanf("%d%d", &l, &r);
            R[r].push_back(make_pair(l, i));
        }

        for(int i=1;i<=n;++i)
        {
            int l, r;
            while(!cal.empty()&&cal.top().first>=L[i])
            {
                l = cal.top().second;
                r = i;
                L[l] = cal.top().first%L[i];
                cal.pop();
                cal.push(make_pair(L[l], l));
            }
            cal.push(make_pair(L[i], i));
            for(int j=0;j<R[i].size();++j)
            {
                l = R[i][j].first;
                ans[R[i][j].second] = L[l];
            }
        }
        for(int i=1;i<=q;++i) printf("%d\n", ans[i]);
    }

    return 0;
}

时间: 2024-10-11 16:30:50

2016大连网络赛 1008 & hdu5875 (优先队列+离线)=不确定暴力的相关文章

2016大连网络赛

1008 Function 题解:如果a>=b,那么a%b<=a/2; 一个数n从本来的位置递减到0最多只需要logn次,也就是往右递减的位置最多不超过30个,那么我们就可以预处理出每个数往右递减的位置,然后离线询问, 用一个优先队列存储数和数所在的位置,比如8 7 6 9 10,先push(8,1)进去,然后每次把队首拿出来,8%7=1,把(1,1)push进去,然后把(8,1)pop出来,(7,2)push进去,优先队列最大值优先,当队首元素小于当前元素的时候,把当前元素和位置push进去

2016大连网络赛 Different GCD Subarray Query

Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Greatest Common Divisor). After studyin

2016大连网络赛 Sparse Graph

Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description In graph theory, the complement of a graph G is a graph H on the same vertices such that two distinct vertices of H are adjacent if

2016大连网络赛 Weak Pair

Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 333    Accepted Submission(s): 111 Problem Description You are given a rooted tree of N nodes, labeled from 1 to N. To the ith node a

2016大连网络赛 Function

Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description The shorter, the simpler. With this problem, you should be convinced of this truth.    You are given an array A of N postive integers,

2016大连网络赛 Football Games

Football Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description A mysterious country will hold a football world championships---Abnormal Cup, attracting football teams and fans from all around th

大连网络赛 1006 Football Games

1 //大连网络赛 1006 2 // 吐槽:数据比较水.下面代码可以AC 3 // 但是正解好像是:排序后,前i项的和大于等于i*(i-1) 4 5 #include <bits/stdc++.h> 6 using namespace std; 7 #define LL long long 8 typedef pair<int,int> pii; 9 const double inf = 123456789012345.0; 10 const LL MOD =100000000L

2016 CCPC 网络赛 B 高斯消元 C 树形dp(待补) G 状压dp+容斥(待补) H 计算几何

2016 CCPC 网络赛 A - A water problem 水题,但读题有个坑,输入数字长度很大.. B - Zhu and 772002 题意:给出n个数(给出的每个数的质因子最大不超过2000),选出多个数相乘得b.问有多少种选法让b 为完全平方数. tags:高斯消元,求异或方程组解的个数.   好题 每个数先素数分解开.  对于2000以内的每个素数p[i],这n个数有奇数个p[i]则系数为1,偶数个则系数为0,最后n个数的p[i]系数异或和都要为0才会使得最后的积为完全平方数.

HDU 5880 Family View (2016 青岛网络赛 C题,AC自动机)

题目链接  2016 青岛网络赛  Problem C 题意  给出一些敏感词,和一篇文章.现在要屏蔽这篇文章中所有出现过的敏感词,屏蔽掉的用$'*'$表示. 建立$AC$自动机,查询的时候沿着$fail$指针往下走,当匹配成功的时候更新$f[i]$ $f[i]$表示要屏蔽以第$i$个字母结尾的长度为$f[i]$的字符串. 原文地址:https://www.cnblogs.com/cxhscst2/p/8452147.html