社区讨论
MLE求调
P2442分数统计参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @m34f1txb
- 此快照首次捕获于
- 2024/11/05 20:18 去年
- 此快照最后确认于
- 2025/11/04 15:16 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
char *pa, *pb, buf[1000000];
#define nc() (pa==pb && (pb=(pa=buf)+fread(buf,1,1000000,stdin),pa==pb)?EOF:*pa++)
inline int in()
{
int x = 0, f = 1; char c = nc();
while (c < 48 || c > 57) f = c == 47 ? -1 : 1, c = nc();
while (c >= 48 && c <= 57) x = (x<<1) + (x<<3) + c-48, c = nc();
return x * f;
}
const int N = 2e5+5;
int n, q, a[N], b[N], c[N],
sc[N], sb[N],
t, cnt[101][N/58+5],
stx[N][25], stn[N][25],
opt, u, v;
void inits()
{
for (int i = 1; i <= n; ++i) {
sc[i] = sc[i-1] + c[i];
sb[i] = sb[i-1] + b[i];
}
}
inline double qrys(int u, int v)
{
return (double) (sc[v] - sc[u-1]) / (sb[v] - sb[u-1]);
}
void initz()
{
t = 1;
while (t*t*t <= n) ++t;--t;
for (int i = 1; i*t <= n; ++i) {
for (int k = t*(i-1)+1; k <= t*i; ++k) {
cnt[a[k]][i] += b[k];
}
}
}
inline int qryz(int u, int v)
{
int i = u%t ? u/t+1 : u/t, j = v%t ? v/t-1 : v/t;
int p = i/t+1, q = j/t+1;
int ct[101];
memset(ct, 0, sizeof(ct));
for (int r = 1; r <= 100; ++r) {
for (int k = p; k <= q; ++k) {
if (cnt[r][k]) ct[r] += cnt[r][k];
}
}
if (u != i) {
for (int k = u; k < i; ++k) ct[a[k]] += b[k];
}
if (v != j) {
for (int k = j+1; k <= v; ++k) ct[a[k]] += b[k];
}
int res = 0, z = 0;
for (int k = 1; k <= 100; ++k) if (z < ct[k]) {
z = ct[k];
res = k;
}
return res;
}
void initst()
{
memset(stx, 0, sizeof(stx));
memset(stn, 0x7f, sizeof(stn));
for (int i = 1; i <= n; ++i) stx[i][0] = stn[i][0] = a[i];
for (int j = 1; (1<<j) <= n; ++j) {
for (int i = 1; i + (1<<j) - 1 <= n; ++i) {
stx[i][j] = max(stx[i][j-1], stx[i+(1<<j-1)][j-1]);
stn[i][j] = min(stn[i][j-1], stn[i+(1<<j-1)][j-1]);
}
}
}
inline int qryc(int u, int v)
{
if (u == v) return 0;
int t = 1;
while ((1<<t) <= v-u+1) t <<= 1;
t >>= 1;
return max(stx[u][t], stx[v-(1<<t)+1][t]) - min(stn[u][t], stn[v-(1<<t)+1][t]);
}
signed main()
{
freopen("P2442.txt", "r", stdin);
n = in(), q = in();
for (int i = 1; i <= n; ++i) a[i] = in();
for (int i = 1; i <= n; ++i) b[i] = in();
for (int i = 1; i <= n; ++i) c[i] = a[i]*b[i];
inits();
initz();
initst();
while (q--) {
opt = in(), u = in(), v = in();
switch (opt) {
case 1 : {
printf("%.2lf\n", qrys(u, v));
break;
}
case 2 : {
printf("%d\n", qryz(u, v));
break;
}
case 3 : {
printf("%d\n", qryc(u, v));
break;
}
}
}
return 0;
}
@cjs1665931645
@liangyanbang
回复
共 4 条回复,欢迎继续交流。
正在加载回复...