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);
    }
}

 

 
 
posted @ 2017-03-02 17:08  Candy?  阅读(331)  评论(0编辑  收藏  举报