睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡
睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡
睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡
睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡
睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡
睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡
睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡
睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡
睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡
睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡吧睡
Code
#include <bits/stdc++.h>
namespace // to fold that junk code
{
#define filein(x) freopen(x".in", "r", stdin);
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout);
#define files(x) freopen(x".in", "r", stdin), freopen(x".ans", "w", stdout);
using namespace std;
#define cT const T&
template<typename T>
inline T chkmin(T& x, cT y){if (x > y) x = y; return x;}
template<typename T>
inline T chkmax(T& x, cT y){if (x < y) x = y; return x;}
template <typename T>
inline bool inrange(cT x, cT l, cT r){return (l <= x) && (x <= r);}
template <typename T>
inline bool inrange(cT l, cT r, cT L, cT R){return (L <= l) && (r <= R);}
#undef cT
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef unsigned u32;
template <typename T>
using pr = pair<T, T>;
typedef pr<int> pii;
typedef pr<ll> pll;
typedef pr<db> pdd;
typedef complex<double> cp;
typedef vector<int> vi;
inline void YN(bool x){puts(x ? "Yes" : "No");}
}
const int N = 3e5 + 233;
int n, a[N];
struct SegmentTree
{
#define ls (u << 1)
#define rs (u << 1 | 1)
#define mid ((l + r) >> 1)
struct Node{int l, r, mn, cc, tag;}tr[N << 2];
inline void pushup(int u){tr[u].mn = min(tr[ls].mn, tr[rs].mn); tr[u].cc = (tr[ls].mn == tr[u].mn) * tr[ls].cc + (tr[rs].mn == tr[u].mn) * tr[rs].cc;}
inline void pushdown(int u)
{
if (!tr[u].tag) return ;
tr[ls].mn += tr[u].tag; tr[rs].mn += tr[u].tag; tr[ls].tag += tr[u].tag; tr[rs].tag += tr[u].tag;
tr[u].tag = 0;
}
void build(int u, int l, int r)
{
tr[u].l = l; tr[u].r = r; tr[u].cc = r - l + 1;
if (l == r) return ;
build(ls, l, mid); build(rs, mid+1, r);
}
void change(int u, int L, int R, int v)
{
int l = tr[u].l, r = tr[u].r;
if (inrange(l, r, L, R)){tr[u].mn += v; tr[u].tag += v; return ;}
pushdown(u);
if (L <= mid) change(ls, L, R, v);
if (mid < R) change(rs, L, R, v);
pushup(u);
}
#undef mid
#undef rs
#undef ls
}T;
int pos[N], smx[N], smn[N], tmx, tmn;
int main()
{
#ifndef ONLINE_JUDGE
filein("i");
#endif
scanf("%d", &n);
for (int i=1, x, y; i<=n; i++){scanf("%d%d", &x, &y); a[x] = y;}
T.build(1, 1, n);
int ans = 0;
for (int i=1; i<=n; i++)
{
while (tmx && (a[smx[tmx]] < a[i])){T.change(1, smx[tmx-1] + 1, smx[tmx], -a[smx[tmx]]); --tmx;}
while (tmn && (a[smn[tmn]] > a[i])){T.change(1, smn[tmn-1] + 1, smn[tmn], a[smn[tmn]]); --tmn;}
T.change(1, pos[a[i]] + 1, i, -1); pos[a[i]] = smx[++tmx] = smn[++tmn] = i;
T.change(1, smx[tmx-1] + 1, i, a[i]); T.change(1, smn[tmn-1] + 1, i, -a[i]);
ans += T.tr[1].cc;
}
printf("%d\n", ans);
return 0;
}
标签:typedef,return,基础,smn,freopen,tmn,cT
From: https://www.cnblogs.com/CDOI-24374/p/17232532.html