낙 곡 P1637 3 원 상승 서브 시퀀스 (나무 모양 배열 인 데 나 는 블록 을 나 누 려 고 한다)
그러나 데 이 터 는 5e4 에 불과 해 물 한 덩어리 만 나 누 면 지나 간다.
사이즈 가 좀 더...
뭐 공부 해요?
#include
using namespace std;
const int MAXN = 50100;
const int INF = 0x3f3f3f3f;
typedef pair pii;
#define X first
#define Y second
template inline void read(T &x) {
int c = getchar();
bool fg = false;
for (x = 0; !isdigit(c); c = getchar()) {
if (c == '-') {
fg = true;
}
}
for (; isdigit(c); c = getchar()) {
x = x * 10 + c - '0';
}
if (fg) {
x = -x;
}
}
int n, a[MAXN], L[MAXN], R[MAXN];
long long ans;
int b[MAXN], belong[MAXN], cnt[MAXN / 10], len, tot;
pii ref[MAXN];
int calc_small(int pos) {
int x = pos / len + 1;
int sml = 0, lim = (x - 1) * len;
for(int i = 1; i < x; i++) sml += cnt[i];
for(int i = lim; i < pos; i++) sml += b[i];
return sml;
}
int calc_Big(int pos) {
int x = pos / len + 1;
int Big = 0, lim = min(x * len - 1, n);
for(int i = 1 + x; i <= tot; i++) Big += cnt[i];
for(int i = pos + 1; i <= lim; i++) Big += b[i];
return Big;
}
signed main() {
read(n);
for(int i = 1; i <= n; i++) read(a[i]), ref[i].X = a[i], ref[i].Y = i;
sort(ref + 1, ref + n + 1);
for(int i = 1; i <= n; i++) {
if(ref[i].X != ref[i - 1].X || i == 1) a[ref[i].Y] = i;
else a[ref[i].Y] = a[ref[i - 1].Y];
}
len = (int) ceil(sqrt(n));
tot = n / len + 1;
for(int i = 1; i <= n; i++) {
belong[i] = a[i] / len + 1;
cnt[belong[i]] ++;
L[i] = calc_small(a[i]);
b[a[i]] ++;
}
memset(b, 0, sizeof(b)), memset(cnt, 0, sizeof(cnt));
for(int i = n; i; i--) {
cnt[belong[i]] ++;
R[i] = calc_Big(a[i]);
b[a[i]] ++;
}
for(int i = 2; i < n; i++) ans += (long long) L[i] * R[i];
printf("%lld
", ans);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
낙 곡 P1637 3 원 상승 서브 시퀀스 (나무 모양 배열 인 데 나 는 블록 을 나 누 려 고 한다)RT, 나무 모양 배열 스 포 문제, UVa 1428 과 유사 그러나 데 이 터 는 5e4 에 불과 해 물 한 덩어리 만 나 누 면 지나 간다. 사이즈 가 좀 더... 뭐 공부 해요?...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.