树状数组离线47pts RE求助
查看原帖
树状数组离线47pts RE求助
530180
KingPowers楼主2022/8/30 07:08

RT

#include<bits/stdc++.h>
#define int long long
#define inf 0x7fffffff
#define eps 1e-9
#define PII pair<int,int>
#define fx first
#define fy second
#define mk_p make_pair
#define Set(a,b) memset(a,b,sizeof(a))
#define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
#define lowbit(x) x&(-x)
using namespace std;
const int maxn=2e6+5;
struct ques{
	int l,r,id;
}ask[maxn];
int bit[maxn],n,m,k,p[maxn],v[maxn],ans[maxn];
vector<int>g[maxn];
inline int read(){
	int ans=0,flag=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')flag=-1;ch=getchar();}
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans*flag;
}
inline string reads(){
    string ss;char ch=getchar();
    while(ch=='\n'||ch=='\r'||ch==' ')ch=getchar();
    while(ch!='\n'&&ch!='\r'&&ch!=' '){ss+=ch;ch=getchar();}
    return ss;
}
void add(int x,int y){
	while(x<=n){
		bit[x]+=y;
		x+=lowbit(x);
	}
}
int query(int x){
	int res=0;
	for(;x;x-=lowbit(x)) res+=bit[x];
	//printf("res:%lld\n",res);
	return res;
}
bool cmp(const ques& a,const ques& b){
	return a.r<b.r;
}
signed main(){
	n=read(),m=read(),k=read();
	for(int i=1;i<=n;i++) p[i]=read();
	for(int i=1;i<=n;i++) v[i]=read();
	for(int i=1;i<=m;i++) ask[i].l=read(),ask[i].r=read(),ask[i].id=i;
	sort(ask+1,ask+n+1,cmp);
	int lst=1;
	for(int i=1;i<=m;i++){
		for(int j=lst;j<=ask[i].r;j++){
			add(j,v[j]);
			g[p[j]].push_back(j);
			if(g[p[j]].size()>=k) add(g[p[j]][g[p[j]].size()-k],-v[g[p[j]][g[p[j]].size()-k]]);
		}
		lst=ask[i].r+1;
		ans[ask[i].id]=query(ask[i].r)-query(ask[i].l-1);
	}
	for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
	return 0;
}
2022/8/30 07:08
加载中...