Section 4.1 4.2
parent
e46b28299e
commit
aef1c50fe4
@ -0,0 +1,49 @@
|
||||
#include <cstdio>
|
||||
#include <cctype>
|
||||
inline int min(int a, int b) { return a < b ? a : b; }
|
||||
inline int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); }
|
||||
inline void read(int &x)
|
||||
{
|
||||
int ch = x = 0;
|
||||
while (!isdigit(ch = getchar()));
|
||||
for (; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + ch - '0';
|
||||
}
|
||||
int n, a[1 << 20 | 1], Log[1 << 20 | 1];
|
||||
int M[1 << 20 | 1][20], G[1 << 20 | 1][20];
|
||||
struct
|
||||
{
|
||||
int c, a[1 << 20 | 1], r;
|
||||
}ans;
|
||||
inline bool can(int l, int r)
|
||||
{
|
||||
int k = Log[r - l + 1];
|
||||
return min(M[l][k], M[r - (1 << k) + 1][k]) == gcd(G[l][k], G[r - (1 << k) + 1][k]);
|
||||
}
|
||||
bool check(int len)
|
||||
{
|
||||
int cnt = 0;
|
||||
for (int i = 0; i + len < n; i++)
|
||||
if (can(i, i + len))
|
||||
ans.a[cnt++] = i;
|
||||
if (cnt) ans.r = len, ans.c = cnt;
|
||||
return cnt;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
read(n);
|
||||
Log[0] = -1;
|
||||
for (int i = 1; i <= n; i++) Log[i] = Log[i >> 1] + 1;
|
||||
for (int i = 0; i < n; i++) read(a[i]);
|
||||
for (int i = 0; i < n; i++) M[i][0] = G[i][0] = a[i];
|
||||
for (int j = 1; j <= Log[n]; j++)
|
||||
for (int i = 0; i + (1 << j) - 1 < n; i++)
|
||||
M[i][j] = min(M[i][j - 1], M[i + (1 << (j - 1))][j - 1]),
|
||||
G[i][j] = gcd(G[i][j - 1], G[i + (1 << (j - 1))][j - 1]);
|
||||
int L = 0, R = n, m;
|
||||
while (L < R)
|
||||
check(m = (L + R) >> 1) ? L = m + 1 : R = m;
|
||||
printf("%d %d\n", ans.c, ans.r);
|
||||
for (int i = 0; i < ans.c; i++)
|
||||
printf("%d ", ans.a[i] + 1);
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
void add(int x, int v)
|
||||
{
|
||||
for (; x <= n; x += lowbit(x))
|
||||
A[x] += v;
|
||||
}
|
||||
|
||||
void sum(int x)
|
||||
{
|
||||
int res = 0;
|
||||
for (; x; x -= lowbit(x))
|
||||
res += A[x];
|
||||
return res;
|
||||
}
|
||||
@ -0,0 +1,42 @@
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
#define lowbit(x) ((x) & -(x))
|
||||
const int N = 20005;
|
||||
void add(int *arr, int pos, int val)
|
||||
{
|
||||
for (; pos < N; pos += lowbit(pos))
|
||||
arr[pos] += val;
|
||||
}
|
||||
int query(int *arr, int pos)
|
||||
{
|
||||
int ans = 0;
|
||||
for (; pos; pos -= lowbit(pos))
|
||||
ans += arr[pos];
|
||||
return ans;
|
||||
}
|
||||
int sum[2][N];
|
||||
struct cow
|
||||
{
|
||||
int pos, vol;
|
||||
bool operator<(const cow &rhs) const { return vol < rhs.vol; }
|
||||
} cows[N];
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
scanf("%d", &n);
|
||||
for (int i = 1; i <= n; i++)
|
||||
scanf("%d%d", &cows[i].vol, &cows[i].pos);
|
||||
std::sort(cows + 1, cows + n + 1);
|
||||
long long ans = 0;
|
||||
for (int i = 1; i <= n; i++)
|
||||
{
|
||||
long long a = query(sum[0], cows[i].pos), b = query(sum[1], cows[i].pos);
|
||||
ans += (cows[i].pos * a - b + query(sum[1], 20000) - b -
|
||||
(i - 1 - a) * cows[i].pos) *
|
||||
cows[i].vol;
|
||||
add(sum[0], cows[i].pos, 1);
|
||||
add(sum[1], cows[i].pos, cows[i].pos);
|
||||
}
|
||||
printf("%lld", ans);
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,42 @@
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <stdint.h>
|
||||
#define lowbit(x) ((x) & -(x))
|
||||
const int N = 500005;
|
||||
int sum[N];
|
||||
int query(int x)
|
||||
{
|
||||
int ans = 0;
|
||||
for (; x; x -= lowbit(x)) ans += sum[x];
|
||||
return ans;
|
||||
}
|
||||
void update(int x, int y)
|
||||
{
|
||||
for (; x <= N; x += lowbit(x)) sum[x] += y;
|
||||
}
|
||||
struct abcd
|
||||
{
|
||||
int val, pos;
|
||||
bool operator<(const abcd &rhs) const { return val < rhs.val; }
|
||||
} nodes[N];
|
||||
int map[N];
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
while (~scanf("%d", &n) && n)
|
||||
{
|
||||
memset(sum, 0, sizeof(sum));
|
||||
for (int i = 1; i <= n; i++) scanf("%d", &nodes[i].val), nodes[i].pos = i;
|
||||
std::sort(nodes + 1, nodes + n + 1);
|
||||
for (int i = 1; i <= n; i++) map[nodes[i].pos] = i;
|
||||
int64_t ans = 0;
|
||||
for (int i = 1; i <= n; i++)
|
||||
{
|
||||
update(map[i], 1);
|
||||
ans += i - query(map[i]);
|
||||
}
|
||||
printf("%lld\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
After Width: | Height: | Size: 5.2 KiB |
@ -0,0 +1,30 @@
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#define lowbit(x) ((x) & -(x))
|
||||
const int maxn = 1 << 15 | 1;
|
||||
int a[maxn], n, m, level[maxn];
|
||||
void update(int pos, int x)
|
||||
{
|
||||
for (; pos < maxn; pos += lowbit(pos)) a[pos] += x;
|
||||
}
|
||||
int query(int pos)
|
||||
{
|
||||
int ans = 0;
|
||||
for (; pos; pos -= lowbit(pos)) ans += a[pos];
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
scanf("%d", &n);
|
||||
memset(level, 0, sizeof(level));
|
||||
memset(a, 0, sizeof(a));
|
||||
for (int i = 0, x, y; i < n; ++i)
|
||||
{
|
||||
scanf("%d%d", &x, &y);
|
||||
level[query(++x)]++;
|
||||
update(x, 1);
|
||||
}
|
||||
for (int i = 0; i < n; ++i)
|
||||
printf("%d\n", level[i]);
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,29 @@
|
||||
#include <cstdio>
|
||||
inline int min(int a, int b) { return a < b ? a : b; }
|
||||
inline int max(int a, int b) { return a > b ? a : b; }
|
||||
const int N = 50010;
|
||||
const int LogN = 16;
|
||||
int minT[LogN][N], maxT[LogN][N], Log[N];
|
||||
int main()
|
||||
{
|
||||
Log[0] = -1;
|
||||
for (int i = 1; i < N; i++) Log[i] = Log[i >> 1] + 1;
|
||||
int m, n;
|
||||
scanf("%d%d", &n, &m);
|
||||
for (int i = 1, x; i <= n; i++)
|
||||
{
|
||||
scanf("%d", &x);
|
||||
minT[0][i] = maxT[0][i] = x;
|
||||
}
|
||||
for (int j = 1; j < LogN; j++)
|
||||
for (int i = 1; i + (1 << j) - 1 <= n; i++)
|
||||
minT[j][i] = min(minT[j - 1][i], minT[j - 1][i + (1 << (j - 1))]),
|
||||
maxT[j][i] = max(maxT[j - 1][i], maxT[j - 1][i + (1 << (j - 1))]);
|
||||
for (int i = 1, x, y, z; i <= m; i++)
|
||||
{
|
||||
scanf("%d%d", &x, &y);
|
||||
z = Log[y - x + 1];
|
||||
printf("%d\n", max(maxT[z][x], maxT[z][y - (1 << z) + 1]) - min(minT[z][x], minT[z][y - (1 << z) + 1]));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
Loading…
Reference in new issue