• [CQOI2015]任务查询系统


    题目描述

    最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi。同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同。调度系统会经常向查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个)的优先级之和是多少。特别的,如果Ki大于第Xi秒正在运行的任务总数,则直接回答第Xi秒正在运行的任务优先级之和。上述所有参数均为整数,时间的范围在1到n之间(包含1和n)。

    输入输出格式

    输入格式:

    输入文件第一行包含两个空格分开的正整数m和n,分别表示任务总数和时间范围。接下来m行,每行包含三个空格分开的正整数Si、Ei和Pi(Si<=Ei),描述一个任务。接下来n行,每行包含四个空格分开的整数Xi、Ai、Bi和Ci,描述一次查询。查询的参数Ki需要由公式 Ki=1+(Ai*Pre+Bi) mod Ci计算得到。其中Pre表示上一次查询的结果,对于第一次查询,Pre=1。

    输出格式:

    输出共n行,每行一个整数,表示查询结果。

    输入输出样例

    输入样例#1: 复制
    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
    输出样例#1: 复制
    2
    8
    11

    说明

    样例解释

    K1 = (1*1+3)%2+1 = 1

    K2 = (1*2+3)%4+1 = 2

    K3 = (2*8+4)%3+1 = 3

    对于100%的数据,1<=m,n,Si,Ei,Ci<=100000,0<=Ai,Bi<=100000,1<=Pi<=10000000,Xi为1到n的一个排列

    按p排序,按时间建立主席树,维护区间内的数个数,权值和

    每一次查询前二分,二分的判断用一个主席树查询x上数的个数

    找到了最小的满足x点上数个数>=k的点,主席树上单点查询和

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 typedef long long lol;
     7 struct ZYYS
     8 {
     9   int l,r;
    10   lol p;
    11 }P[100001];
    12 int pos,ch[5000001][2];
    13 lol sum[5000001],lazy[5000001];
    14 int size[5000001],n,m,root[200001];
    15 lol ans;
    16 bool cmp(ZYYS a,ZYYS b)
    17 {
    18   return a.p<b.p;
    19 }
    20 void update(int &rt,int l,int r,int L,int R,lol k)
    21 {
    22   int Rt=rt;
    23   rt=++pos;
    24   ch[rt][0]=ch[Rt][0];ch[rt][1]=ch[Rt][1];
    25   sum[rt]=sum[Rt];size[rt]=size[Rt];
    26   lazy[rt]=lazy[Rt];
    27   if (l>=L&&r<=R)
    28     {
    29       sum[rt]+=(r-l+1)*k;
    30       lazy[rt]+=k;
    31       size[rt]+=1;
    32       return;
    33     }
    34   int mid=(l+r)/2;
    35   if (L<=mid) update(ch[rt][0],l,mid,L,R,k);
    36   if (R>mid) update(ch[rt][1],mid+1,r,L,R,k);
    37   sum[rt]=sum[ch[rt][0]]+sum[ch[rt][1]]+(r-l+1)*lazy[rt];
    38 }
    39 int querysize(int rt,int l,int r,int x,int la)
    40 {
    41   if (l==r) return size[rt]+la;
    42   int mid=(l+r)/2;
    43   if (x<=mid) return querysize(ch[rt][0],l,mid,x,la+size[rt]);
    44   else return querysize(ch[rt][1],mid+1,r,x,la+size[rt]);
    45 }
    46 lol querysum(int rt,int l,int r,int x,lol laz)
    47 {
    48   if (l==r)
    49     return sum[rt]+laz;
    50   int mid=(l+r)/2;
    51   if (x<=mid) return querysum(ch[rt][0],l,mid,x,laz+lazy[rt]);
    52     else return querysum(ch[rt][1],mid+1,r,x,laz+lazy[rt]);
    53 }
    54 int find(int x,int k)
    55 {
    56   int l=1,r=n,as=n;
    57   while (l<=r)
    58     {
    59       int mid=(l+r)/2;
    60       if (querysize(root[mid],1,m,x,0)>=k) as=mid,r=mid-1;
    61       else l=mid+1;
    62     }
    63   return as;
    64 }
    65 int main()
    66 {int i,s,e,x;
    67   lol p,a,b,c;
    68   cin>>n>>m;
    69   for (i=1;i<=n;i++)
    70     {
    71       scanf("%d%d%lld",&s,&e,&p);
    72       P[i].l=s;P[i].r=e;P[i].p=p;
    73     }
    74   sort(P+1,P+n+1,cmp);
    75   for (i=1;i<=n;i++)
    76     {
    77       root[i]=root[i-1];
    78       update(root[i],1,m,P[i].l,P[i].r,P[i].p);
    79     }
    80   ans=1;
    81   for (i=1;i<=m;i++)
    82     {
    83       scanf("%d%lld%lld%lld",&x,&a,&b,&c);
    84       lol k=1+(a*ans%c+b)%c;
    85       int t=find(x,k);
    86       ans=querysum(root[t],1,m,x,0);
    87       printf("%lld
    ",ans);
    88     }
    89 }
  • 相关阅读:
    HAVING用法详解
    spring的定时任务
    js 将json字符串转换为json对象的方法解析
    Struts2 SSH整合框架返回json时,要注意懒加载问题
    Struts2 本是非单例的,与Spring集成就默认为单例
    Android 判断当前联网的类型 wifi、移动数据流量
    Android 动画的重复播放
    Android 监测手机联网状态 wifi、移动数据流量、无联网状态
    Android 设置界面的圆角选项
    Android 用Activity的onTouchEvent来监听滑动手势
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8242092.html
Copyright © 2020-2023  润新知