洛谷 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;
}

浙公网安备 33010602011771号