码迷,mamicode.com
首页 > 其他好文 > 详细

51nod1624 取余最长路 前缀和 + set

时间:2018-08-29 21:27:40      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:nbsp   include   分享图片   int   log   fine   def   枚举   span   

技术分享图片

由于只有3行,因此只会会换行2次,假设$x, y$分别为这两次的换行点

那么答案为$S[1][x] +S[2][y] - S[2][x - 1] + S[3][n] - S[3][y - 1]$

其中,$S[i]$表示第$i$行的前缀和

令$a[x] = S[1][x] - S[2][x - 1], b[y] = S[2][y] - S[3][y - 1]$

考虑枚举$x$,那么问题转化为询问在一堆数中求一个数$k$使得$v (= a[x] + S[3][n]) + k \;mod\;p$最大

分两种情况考虑,第一种$v + k \in [v, mod - 1]$,那么$k \in [0, mod - k - 1]$,并且$k$越大越好

第二种不如第一种好,但有可能不得不选,$v + k \in [1, v - 1]$,同样时$k$越大越好

也就是说,需要一种支持插入,查询前驱和最大值的数据结构,$set$就可以

注:倒叙枚举$x$,可以做到不删除

复杂度$O(n \log n)$

#include <set>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

extern inline char gc() {
    static char RR[23456], *S = RR + 23333, *T = RR + 23333;
    if(S == T) fread(RR, 1, 23333, stdin), S = RR;
    return *S ++;
}
inline int read() {
    int p = 0, w = 1; char c = gc();
    while(c > 9 || c < 0) { if(c == -) w = -1; c = gc(); }
    while(c >= 0 && c <= 9) p = p * 10 + c - 0, c = gc();
    return p * w;
}

#define ll long long
#define ri register int
#define sid 200050

int n, ans, mod;
int s[4][sid], a[sid], b[sid];

set <int> ex;

int main() {
    n = read(); mod = read();
    for(ri i = 1; i <= 3; i ++)
    for(ri j = 1; j <= n; j ++)
    s[i][j] = (s[i][j - 1] + read()) % mod;

    for(ri i = 1; i <= n; i ++) a[i] = (s[1][i] - s[2][i - 1] + mod) % mod;
    for(ri i = 1; i <= n; i ++) b[i] = (s[2][i] - s[3][i - 1] + mod) % mod;
    
    int der = s[3][n]; ex.insert(1);
    for(ri i = n; i >= 1; i --) {
        ex.insert(-b[i]);
        int v = (der + a[i]) % mod;
        int p = *ex.lower_bound(-(mod - 1 - v));;
        if(p == 1) ans = max(ans, (v - *(++ ex.begin())) % mod);
        else ans = max(ans, v + -p);
    }

    printf("%d\n", ans);
    return 0;
}

 

51nod1624 取余最长路 前缀和 + set

标签:nbsp   include   分享图片   int   log   fine   def   枚举   span   

原文地址:https://www.cnblogs.com/reverymoon/p/9556662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!