zoukankan      html  css  js  c++  java
  • 【主席树】 [CQOI2015]任务查询系统

    模板题...

    差分,然后用主席树维护时间点上的优先值和就好了

    就是细节烦...

     1 #include<bits/stdc++.h>
     2 #define int long long
     3 #define mid (l+r>>1)
     4 #define writeln(x)  write(x),puts("")
     5 #define writep(x)   write(x),putchar(' ')
     6 using namespace std;
     7 inline int read(){
     8     int ans=0,f=1;char chr=getchar();
     9     while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();}
    10     while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
    11     return ans*f;
    12 }void write(int x){
    13     if(x<0) putchar('-'),x=-x;
    14     if(x>9) write(x/10);
    15     putchar(x%10+'0');
    16 }const int M = 2e5+5; 
    17 int rt[M*20],s[M*20],ls[M*20],rs[M*20],cnt[M*20],n,m,lst,x,y,k,a[M],b[M],T;
    18 vector<int> aa[M],bb[M];
    19 void Update(int &x,int y,int l,int r,int p,int opt){
    20     x=++T;ls[x]=ls[y],rs[x]=rs[y],s[x]=s[y]+opt*b[p],cnt[x]=cnt[y]+opt;
    21     if(l==r) return;
    22     if(p<=mid)    Update(ls[x],ls[x],l,mid,p,opt);
    23     else         Update(rs[x],rs[x],mid+1,r,p,opt);
    24 }
    25 int Query(int x,int l,int r,int k){
    26     if(l==r) return s[x]/cnt[x]*k;
    27     int t=cnt[ls[x]];
    28     if(k<=t) return Query(ls[x],l,mid,k);
    29     return Query(rs[x],mid+1,r,k-t)+s[ls[x]];
    30 }
    31 signed main(){
    32     n=read(),m=read();
    33     for(int i=1,x,y,z;i<=n;i++){
    34         x=read(),y=read();a[i]=b[i]=read();
    35         aa[x].push_back(i),bb[y+1].push_back(i);
    36     }sort(b+1,b+n+1);int len=unique(b+1,b+n+1)-b-1;
    37     for(int i=1,pos;i<=m;i++){
    38         rt[i]=rt[i-1];
    39         for(int j=0;j<aa[i].size();j++){
    40             pos=lower_bound(b+1,b+len+1,a[aa[i][j]])-b;
    41             Update(rt[i],rt[i],1,len,pos,1);
    42         }
    43         for(int j=0;j<bb[i].size();j++){
    44             pos=lower_bound(b+1,b+len+1,a[bb[i][j]])-b;
    45             Update(rt[i],rt[i],1,len,pos,-1);
    46         }
    47     }lst=1;
    48     while(m--){
    49         int x=read(),y=read(),z=read(),w=read();
    50         k=(lst*y+z)%w+1;
    51         if(k>cnt[rt[x]]) writeln(lst=s[rt[x]]);
    52         else writeln(lst=Query(rt[x],1,len,k));
    53     }return 0;
    54 }

    然而悲伤的是:洛谷上暴力跑的最快惹qaq,排行榜第一页全是暴力,转行打暴力吧

    upd:经测试bzoj上暴力跑得也贼快,上了第一页

    贴一下暴力代码:

    #include<bits/stdc++.h>
    #define re register int
    using namespace std;
    inline int read(){
        int ans=0,f=1;char chr=getchar();
        while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();}
        while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
        return ans*f;
    }const int N=1e5+10;
    struct P{int s,e,p;}a[N];
    int n,m,sum;long long ans=1;
    inline bool cmp(const P&a,const P&b){return a.p<b.p;}
    int main(){
        n=read(),m=read();
        for(int i=1;i<=n;i++) a[i].s=read(),a[i].e=read(),a[i].p=read();
        sort(a+1,a+n+1,cmp);re x,q,w,e,k;
        while(m--){
            x=read(),q=read(),w=read(),e=read();
            k=(1ll*q*ans%e+w)%e+1;ans=sum=0;
            for(re i=1;i<=n&&sum<k;++i)
                if(a[i].s<=x&&x<=a[i].e)ans+=a[i].p,++sum;
            printf("%lld
    ",ans);
        }return 0;
    }
  • 相关阅读:
    Android Developers:使ListView滑动流畅
    Nexus 搭建maven 私有仓库
    Eclipse 配置Maven以及修改默认Repository
    maven常用命令介绍
    maven 相关
    session机制详解以及session的相关应用
    正确理解web交互中的cookie与session
    前端开发中Cookie那些事儿
    html转义表
    常用的Linux命令
  • 原文地址:https://www.cnblogs.com/zhenglw/p/11259460.html
Copyright © 2011-2022 走看看