在线做海报的网站,用wordpress做app,官方网站建设计划书,wordpress 主题 家居https://www.luogu.com.cn/problem/CF407E
多用位置/值域表示未知数
推出的式子中 n n n 表示长度#xff0c;应该直接换成 r − l 1 r-l1 r−l1
区间覆盖转区间加
推出的式子有 m x , m n mx,mn mx,mn#xff0c;朴素思路是用单调队列区间覆盖维护
那样就不能很方便…https://www.luogu.com.cn/problem/CF407E
多用位置/值域表示未知数
推出的式子中 n n n 表示长度应该直接换成 r − l 1 r-l1 r−l1
区间覆盖转区间加
推出的式子有 m x , m n mx,mn mx,mn朴素思路是用单调队列区间覆盖维护
那样就不能很方便地维护差
但既然都单调队列了为什么不直接转区间加呢
#includebits/stdc.h
using namespace std;
inline int read(){int x0,f1;char chgetchar(); while(ch0||
ch9){if(ch-)f-1;chgetchar();}while(ch0ch9){
x(x1)(x3)(ch^48);chgetchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
#define N 200010
struct Node{int l, r, x; } t;
int n, m, i, j, k, T, d;
stackNodeq1, q2;
int a[N], lst[N], mn, mx, l, r, rt;
mapint, intmp; void sol1() {for(i1; in; i) {a[i]read(); if(i1 a[i]!a[i-1]) j0; j; if(jmx) mxj, li-mx1, ri; }printf(%d %d, l, r);
}struct Segment_tree {int tot, ls[N2], rs[N2], mn[N2], tag[N2]; void push_up(int k) {mn[k]min(mn[ls[k]], mn[rs[k]]); }void jia(int k, int z) {tag[k]z; mn[k]z; }void push_down(int k) {jia(ls[k], tag[k]); jia(rs[k], tag[k]); tag[k]0; }void build(int k, int l, int r) {if(!k) ktot; if(lr) return mn[k]-d*l, void(); int mid(lr)1; build(ls[k], l, mid); build(rs[k], mid1, r); push_up(k); }void add(int k, int l, int r, int x, int y, int z) {if(lx ry) return jia(k, z), void(); int mid(lr)1; push_down(k); if(xmid) add(ls[k], l, mid, x, y, z); if(ymid1) add(rs[k], mid1, r, x, y, z); push_up(k); }int que(int k, int l, int r, int x, int y, int z) {if(lx ry mn[k]z) return -1; if(lr) return mn[k]z ? l : -1; int mid(lr)1, flg-1; push_down(k); if(ymid1) flgque(rs[k], mid1, r, x, y, z); if(flg!-1) return flg; return que(ls[k], l, mid, x, y, z); }
}Seg;signed main()
{nread(); mread(); dread(); if(d0) return sol1(), 0; for(i1; in; i) {a[i]read(); lst[i]n; if(mp[a[i]]) lst[mp[a[i]]]i-1; mp[a[i]]i; }for(i2; in; i) if(abs(a[i]-a[i-1])%d) lst[i-1]i-1; for(in-1; i1; --i) lst[i]min(lst[i], lst[i1]); Seg.build(rt, 1, n); for(in, j0; i1; --i) {lri; while(!q1.empty() a[i]q1.top().x) {tq1.top(); q1.pop(); rt.r; Seg.add(1, 1, n, t.l, t.r, -t.x); }q1.push({l, r, a[i]}); Seg.add(1, 1, n, l, r, a[i]); lri; while(!q2.empty() a[i]q2.top().x) {tq2.top(); q2.pop(); rt.r; Seg.add(1, 1, n, t.l, t.r, t.x); }q2.push({l, r, a[i]}); Seg.add(1, 1, n, l, r, -a[i]); kSeg.que(1, 1, n, i, lst[i], d*m-d*i); if(k-i1mx) mxk-i1, ji; }printf(%d %d, j, jmx-1); return 0;
}