洛谷 P3168 [CQOI2015]任务查询系统

洛谷 P3168 [CQOI2015]任务查询系统

咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕咕


KONO题面哒!

最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。

超级计算机中的任务用三元组 \((s_i,e_i,p_i)\)描述,\((s_i,e_i,p_i)\)表示任务从第 \(s_i\) 秒开始,在第 \(e_i\)秒后结束(第 \(s_i\) 秒和 \(e_i\)秒任务也在运行),其优先级为 \(p_i\)。同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同。

调度系统会经常向查询系统询问,第 \(x_i\) 秒正在运行的任务中,优先级最小的 \(k_i\) 个任务(即将任务按照优先级从小到大排序后取前 \(k_i\) 个)的优先级之和是多少。

特别的,如果 \(k_i\) 大于第$ x_i$秒正在运行的任务总数,则直接回答第 \(x_i\) 秒正在运行的任务优先级之和。上述所有参数均为整数,时间的范围在\([1,n]\) 之间。

本题强制在线。
查询的参数 \(k_i\) 需要由公式$ k_i = 1 +(a_i \times \text{pre}+b_i) \bmod c_i$ 计算得到。
其中$pre $表示上一次查询的结果,定义初始 \(pre=1\)

数据范围:\(1\leq m,n,s_i,e_i,c_i,a_i,b_i\leq10^5,1\leq p_i\leq10^7,x_i\)\(1\)\(n\)的排列。

样例输入:

4 3
1 2 6
2 3 3
1 3 2
3 3 4
3 1 3 2
1 1 3 4
2 2 4 3

样例输出:

2

8

11


解法:莫队主席树维护一个差分序列。讲完了(逃

本人因为懒使用了vector来把每个时间点的操作存下来,如果觉得慢的话可以尝试一下链表之类的写法。

一定要注意\(Long Long\),不能多开也不能少开。


KONO代码哒!


#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
char *p1,*p2,buf[1<<20];
#define GC (p1==p2&&(p1=buf,p2=buf+fread(buf,1,1<<20,stdin),p1==p2)?0:(*(p1++)))
//#define GC getchar()
inline ll in(){
	char ch=0;
	ll x=0;
	bool w=0;
	while(!isdigit(ch)){
		w|=ch=='-';
		ch=GC;
	}
	while(isdigit(ch)){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=GC;
	}
	return w?-x:x;
}
struct node {
	int ls,rs;
	ll sum,ksum;
};
const int maxn=100010;
vector<int>t[maxn];
ll b[maxn],bs;
int root[maxn];
struct tree {
	node sum[maxn<<6];
	int tot=0;
	void build(int &p,int l,int r) {
		p=++tot;
		if(l==r)return;
		ll mid=((l+r)>>1);
		build(sum[p].ls,l,mid);
		build(sum[p].rs,mid+1,r);
		return;
	}
	int ins(int p,int l,int r,ll k,ll val) {
		int rt=++tot;
		sum[rt].sum=sum[p].sum+val;
		sum[rt].ls=sum[p].ls;
		sum[rt].rs=sum[p].rs;
		sum[rt].ksum=sum[p].ksum+val*b[k];
		if(l==r) {
			return rt;
		}
		int mid=((l+r)>>1);
		if(mid>=k)sum[rt].ls=ins(sum[p].ls,l,mid,k,val);
		else sum[rt].rs=ins(sum[p].rs,mid+1,r,k,val);
		return rt;
	}
	ll get_k(ll p,int l,int r,int k) {
		if(sum[p].sum<=k)return sum[p].ksum; 
		if(l==r)return 1LL*k*b[l];
		ll tmp=sum[sum[p].ls].sum;
		int mid=((l+r)>>1);
		if(tmp>=k)return get_k(sum[p].ls,l,mid,k);
		else return sum[sum[p].ls].ksum+get_k(sum[p].rs,mid+1,r,k-tmp);
	}
} tr;
int n,m;
ll last=1;
ll _max=0;
int main() {
//	freopen("query5.in","r",stdin);
//	freopen("query.out","w",stdout);
	n=in();m=in();
	int i,j;
	for(i=1; i<=n; i++) {
		int s,e,p;
		s=in();e=in();p=in();
		b[++bs]=p;
		t[s].push_back(p);
		t[e+1].push_back(-p);
	}
	sort(b+1,b+bs+1);
	bs=unique(b+1,b+bs+1)-b-1;
	_max=bs;
	tr.build(root[0],1,_max);
	for(i=1; i<=m; i++) {
		root[i]=root[i-1];
		for(j=0; j<t[i].size(); j++) {
			int pos=abs(t[i][j]);
			pos=lower_bound(b+1,b+bs+1,pos)-b;
			root[i]=tr.ins(root[i],1,_max,pos,t[i][j]>0?1:-1);
		}
	}
	for(i=1; i<=m; i++) {
		ll x,a,b,c;
		x=in();a=in();b=in();c=in();
		ll k=(a*last+b)%c+1;
//        k=min(k,tr.sum[root[x]].sum);
        if(k>tr.sum[root[x]].sum){
//        	printf("QAQ\n");
			last=tr.sum[root[x]].ksum;
		}
		else last=tr.get_k(root[x],1,_max,k);
//		last=tr.get_k(root[x],1,_max,k);
		printf("%lld\n",last);
	}
	return 0;
}
posted @ 2020-01-06 19:50  国土战略局特工  阅读(159)  评论(0)    收藏  举报