家人们谁懂啊
我再也不学竞赛了
这是我此生第一道题,听大佬们说最简单的是线段树
可是我写了这么多,才10分,我已经哭晕在厕所
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define mem(i,a) memset(i,a,sizeof(i))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
#define pii pair <ll, ll>
const ll INF = 1e18;
const ll DMAX = 1000000+15;
const ll MOD = 1000000007;
const ll G = 3;
const ll invG = 332748118;
ll ans;
ll n, m;
ll a[DMAX];
int q;
struct SegTree{
ll tag, sum;
int l, r;
SegTree (){
tag = sum = 0;
}
};
SegTree tr[DMAX];
void pushup (int p) {
tr[p].sum = tr[p << 1].sum + tr[p << 1 | 1].sum;
}
void build(int p, int l, int r) {
tr[p].l = l, tr[p].r = r;
if(l == r){
tr[p].sum = a[l];
return ;
}
int mid = (l + r) >> 1;
build (p << 1, l, mid);
build (p << 1 | 1, mid + 1, r);
pushup (p);
}
template <class T> inline void read (T &x) {
x=0;
T f = 1;
char ch = getchar ();
while (ch < '0' || ch > '9') {
if(ch == '-'){
f = -1;
}
ch = getchar ();
}
while (ch <= '9' && ch >= '0') {
x = x * 10 + (ch - '0');
ch = getchar ();
}
x *= f;
}
template <class T> void write (T x) {
if(x < 0) {
putchar ('-');
x = -x;
}
int a[20];
int cnt = 0;
do {
a[++ cnt] = x % 10;
x /= 10;
} while (x > 0);
for(int i = cnt; i >= 1; i --) {
putchar (a[i] + '0');
}
puts ("");
}
void spread (int p) {
if (tr[p].tag) {
tr[p << 1].tag += tr[p].tag, tr[p << 1 | 1].tag += tr[p].tag;
tr[p << 1].sum += (tr[p << 1].r - tr[p << 1].l + 1) * tr[p].tag;
tr[p << 1 | 1].sum += (tr[p << 1 | 1].r - tr[p << 1|1].l + 1) * tr[p].tag;
tr[p].tag = 0;
}
}
void add (int p, int l, int r, ll val) {
if(l <= tr[p].l && tr[p].r <= r) {
tr[p].sum += ll (tr[p].r - tr[p].l + 1) + val;
++ ans;
tr[p].tag += val;
return ;
}
spread (p);
int mid = (tr[p].l + tr[p].r) >> 1;
if(l <= mid) {
add (p << 1, l, r, val);
}
if(r > mid) {
add (p << 1 | 1, l, r, val);
}
pushup (p);
}
signed main () {
read(n);
read(m);
build(1, 1, m);
for (int i = n; i <= m; i ++) {
add (1, i, i, 1);
}
ans += n;
write (ans);
return 0;
}