zoukankan      html  css  js  c++  java
  • 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
    ",last);
        }
    }
     
     
  • 相关阅读:
    Linux常用命令-centos
    USACO 2006 Open, Problem. The Country Fair 动态规划
    USACO 2007 March Contest, Silver Problem 1. Cow Traffic
    USACO 2007 December Contest, Silver Problem 2. Building Roads Kruskal最小生成树算法
    USACO 2015 February Contest, Silver Problem 3. Superbull Prim最小生成树算法
    LG-P2804 神秘数字/LG-P1196 火柴排队 归并排序, 逆序对
    数据结构 并查集
    浴谷国庆集训 对拍
    1999 NOIP 回文数
    2010 NOIP 普及组 第3题 导弹拦截
  • 原文地址:https://www.cnblogs.com/candy99/p/6491551.html
Copyright © 2011-2022 走看看