简单题样例过不掉求调
查看原帖
简单题样例过不掉求调
97737
Wsyflying2022楼主2022/4/14 09:57
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10,maxm=25;
int n,m,len,pool,pre=1;
struct Node {
	int tim;
	int pri;
	inline bool operator <(const Node &T)const {
		return tim<T.tim;
	}
} a[maxn];
struct President_Tree {
	int lc,rc;
	int val,cnt;
	#define lc(x) tree[x].lc
	#define rc(x) tree[x].rc
	#define val(x) tree[x].val 
	#define cnt(x) tree[x].cnt
} tree[maxn<<2];
int b[maxn],root[maxn];
inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while (!isdigit(ch)) {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (isdigit(ch)) {
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
inline void pushup(int p) {
	cnt(p)=cnt(lc(p))+cnt(rc(p));
	val(p)=val(lc(p))+val(rc(p));
}
inline void update(int &p,int l,int r,int las,int pos,int d) {
	p=++pool;
	if (l==r) {
		cnt(p)+=d;
		val(p)+=d*b[pos];
		return ;
	}
	int mid=(l+r)>>1;
	if (pos<=mid) update(tree[p].lc,l,mid,tree[las].lc,pos,d);
	else update(tree[p].rc,mid+1,r,tree[las].rc,pos,d);
	pushup(p);
}
inline int query(int p,int l,int r,int k) {
	if (!cnt(p)) return 0;
	if (l==r) return val(p)/cnt(p)*min(k,cnt(p));
	int mid=(l+r)>>1;
	if (k==cnt(p)) return val(p);
	else if (k<=cnt(lc(p))) return query(lc(p),l,mid,k);
	return val(lc(p))+query(rc(p),mid+1,r,k-cnt(lc(p)));
}
inline void tree_init(int &p,int l,int r) {
	p=++pool;
	if (l==r) return ;
	int mid=(l+r)>>1;
	tree_init(lc(p),l,mid);
	tree_init(rc(p),mid+1,r);
}
signed main() {
	n=read(),m=read();
	for (int i=1;i<=n;i++) {
		int i1=(i<<1)-1,i2=(i<<1);
		a[i1].tim=read(),a[i2].tim=read()+1,b[i]=read();
		a[i1].pri=b[i],a[i2].pri=-b[i];
	}
	sort(b+1,b+n+1);
	len=unique(b+1,b+n+1)-b-1;
	sort(a+1,a+(n<<1)+1);
	int Index=0;
	tree_init(root[0],1,len);
	for (int i=1;i<=(n<<1);i++) {
		while (Index<a[i].tim && Index<=m) {
			root[Index+1]=root[Index];
			Index++;
		}
		if (Index==m+1) break;
		int pos=lower_bound(b+1,b+len+1,abs(a[i].pri))-b;
		update(root[Index],1,len,root[Index],pos,(a[i].pri>0) ? 1 : -1);
	} 
	for (int i=1;i<=m;i++) {
		int t=read(),x=read(),y=read(),z=read();
		int k=1+(x*pre+y)%z;
		printf("%lld\n",pre=query(root[t],1,len,k));
	}
	return 0;
} 
2022/4/14 09:57
加载中...