BZOJ 3932: [CQOI2015]任务查询系统 [主席树]
题意:
任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi
调度系统会经常向查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个)的优先级之和是多少
对于100%的数据,1≤m,n,Si,Ei,Ci≤100000,0≤Ai,Bi≤100000,1≤Pi≤10000000,Xi为1到n的一个排列
我太弱了怎么什么题都要调怎么长时间
明显的区间$k$大
问一个点?差分就好了......前缀$k$大
时间建主席树,优先级建权值线段树
然后会爆$int$....$WA$
然后链表开小了....$WA$
然后最重要的,我手残加上了去重!!!去重你还怎么找前$k$大和啊沙茶
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define lc(x) t[x].l #define rc(x) t[x].r typedef long long ll; const int N=1e5+5; int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();} return x*f; } int n,m; struct Task{ int s,e,p; bool operator <(const Task &r)const{return p<r.p;} }a[N]; struct Edge{ int v,ne,f; }e[N<<1]; int h[N],cnt; inline void ins(int u,int v,int f){ cnt++; e[cnt].v=v;e[cnt].f=f;e[cnt].ne=h[u];h[u]=cnt; } struct Node{ int l,r,size; ll sum; }t[N*40]; int sz,root[N]; void fIns(int &x,int l,int r,int p,int v){ t[++sz]=t[x];x=sz; t[x].size+=v; t[x].sum+= (ll)(v==1?a[p].p:-a[p].p); if(l==r) return; int mid=(l+r)>>1; if(p<=mid) fIns(lc(x),l,mid,p,v); else fIns(rc(x),mid+1,r,p,v); } ll fQue(int x,int l,int r,int k){ if(t[x].size<=k) return t[x].sum; if(l==r) return t[x].sum; int mid=(l+r)>>1,lsize=t[lc(x)].size; if(k<=lsize) return fQue(lc(x),l,mid,k); else return t[lc(x)].sum+fQue(rc(x),mid+1,r,k-lsize); } int main(){ freopen("in","r",stdin); m=read();n=read(); for(int i=1;i<=m;i++) a[i].s=read(),a[i].e=read(),a[i].p=read(); sort(a+1,a+1+m); for(int i=1;i<=m;i++) ins(a[i].s,i,1),ins(a[i].e+1,i,-1); for(int u=1;u<=n;u++){ root[u]=root[u-1]; for(int i=h[u];i;i=e[i].ne) fIns(root[u],1,m,e[i].v,e[i].f); } ll last=1,x,A,B,C,k; for(int i=1;i<=n;i++){ x=read();A=read();B=read();C=read(); k=1+(A*last+B)%C; last=fQue(root[x],1,m,k); printf("%lld\n",last); } }
Copyright:http://www.cnblogs.com/candy99/