P5673树状数组 O(nlogn) 28pts求助
  • 板块学术版
  • 楼主封禁用户
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/7/22 11:41
  • 上次更新2023/10/27 18:57:17
查看原帖
P5673树状数组 O(nlogn) 28pts求助
424534
封禁用户楼主2022/7/22 11:41

CodeCode

#include <bits/stdc++.h>

using namespace std;

const int N = 1000010;

int n, m, k;
int p[N], w[N], a[N], last[N];
int tr[N], ans[N];
int h[N], ne[N];
vector<pair<int, int>> q[N];

inline int read()
{
	int x=0;char s=getchar();
	while(!isdigit(s))s=getchar();
	while(isdigit(s))x=(x<<1)+(x<<3)+(s^48),s=getchar();
	return x;
}

inline void print(int x)
{
	if(x<10)putchar(x+'0');
	else
	{
		print(x/10);
		putchar(x%10+'0');
	}
}

int lowbit(int x)
{
    return x & -x;
}

void modify(int x, int k)
{
    for (int i = x; i <= n; i += lowbit(i))
        tr[i] += k;
}

int sum(int x)
{
    int res = 0;
    for (int i = x; i; i -= lowbit(i))
        res += tr[i];
    return res;
}

int main()
{
    n = read(), m = read(), k = read();
    
    for (int i = 1; i <= n; ++ i )
        p[i] = read();
    
    for (int i = 1; i <= n; ++ i )
        w[i] = read();
    
    for (int i = 1; i <= m; ++ i )
    {
        int l, r;
        l = read(), r = read();
        q[r].push_back({i, l});
    }
    
    for (int i = 1; i <= n; ++ i )
    {
        if (a[p[i]] == 0) {
            h[p[i]] = i;
        } else if (a[p[i]] + 1 < k) {
            ne[last[p[i]]] = i;
        } else {
            modify(h[p[i]], -w[h[p[i]]]);
            h[p[i]] = ne[h[p[i]]];
        }
        modify(i, w[i]);
        last[p[i]] = i;
        a[p[i]] ++ ;
        for (int j = 0; j < q[i].size(); ++ j )
            ans[q[i][j].first] = sum(i) - sum(q[i][j].second - 1);
    }
    
    for (int i = 1; i <= m; i ++ )
        print(ans[i]), puts("");
    
    return 0;
}
2022/7/22 11:41
加载中...