P3168RE,只有20分,求调
  • 板块学术版
  • 楼主zyxawa
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/12/28 16:53
  • 上次更新2023/10/24 06:19:02
查看原帖
P3168RE,只有20分,求调
673294
zyxawa楼主2022/12/28 16:53

学校OJ大数据过了1个,也试过define int long long,也试过开大数组,都不行,求调

#include<bits/stdc++.h>
using namespace std;
struct tree{
	int lc,rc,cnt;
	long long sum;
}t[6400001];
int n,m,q,tot,a,b,c,x,root[100001],w[100001];
long long last=1;
vector <pair<int,int> > G[200001];
int build(int l,int r){
	int p=++tot,mid=(l+r)/2;
	if(l==r) return p;
	t[p].lc=build(l,mid);
	t[p].rc=build(mid+1,r);
	return p;
}
int insert(int now,int l,int r,int x,int val,int num){
	int p=++tot,mid=(l+r)/2;
	t[p]=t[now];
	t[p].sum+=val;
	t[p].cnt+=num;
	if(l==r) return p;
	if(x<=mid) t[p].lc=insert(t[now].lc,l,mid,x,val,num);
	else t[p].rc=insert(t[now].rc,mid+1,r,x,val,num);
	return p;
}
long long query(int now,int l,int r,int k){
	if(l==r) return t[now].sum/t[now].cnt*min(k,t[now].cnt);
	int mid=(l+r)/2;
	if(k<=t[t[now].lc].cnt) return query(t[now].lc,l,mid,k);
	else return t[t[now].lc].sum+query(t[now].rc,mid+1,r,k-t[t[now].lc].cnt);
}
int main(){
	scanf("%d%d",&m,&n);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&a,&b,&c);
		G[a].push_back({c,1});
		G[b+1].push_back({-c,-1});
		w[i]=c;
	}
	sort(w+1,w+1+m);
	q=unique(w+1,w+1+m)-w-1;
	root[0]=build(1,q);
	for(int i=1;i<=n;i++){
		root[i]=root[i-1];
		for(int j=0;j<G[i].size();j++) root[i]=insert(root[i],1,q,lower_bound(w+1,w+1+q,abs(G[i][j].first))-w,G[i][j].first,G[i][j].second);
	}
	for(int i=1;i<=n;i++){
		scanf("%d%d%d%d",&x,&a,&b,&c);
		printf("%lld\n",last=query(root[x],1,q,1+(a*last+b)%c));
	}
	return 0;
}
2022/12/28 16:53
加载中...