题目描述

最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。超级计算机中的任务用三元组(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的一个排列

思路:

  可持久化线段树(坑很多很多,诸位小心)

来,上代码:

#include <cstdio>
#include <iostream>
#include <algorithm> #define maxn 100001
#define LL long long using namespace std; struct T_do {
LL time,pi,dis;
};
struct T_do do_[maxn<<]; struct TreeNodeType {
LL l,r,dis,sum,bel; TreeNodeType *left,*right;
};
struct TreeNodeType *null,*root[maxn<<]; LL if_z,n,m,num,hash[maxn<<],size,bef; char Cget; bool if_[maxn<<]; inline void read_LL(LL &now)
{
if_z=,now=,Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
} void tree_build(TreeNodeType *&now,LL l,LL r)
{
now=new TreeNodeType;
now->l=l,now->r=r;
now->dis=,now->sum=;
now->bel=;
now->left=null;
now->right=null;
if(l==r) return ;
LL mid=(l+r)>>;
tree_build(now->left,l,mid);
tree_build(now->right,mid+,r);
} bool cmp(struct T_do a1,struct T_do a2)
{
return a1.time<a2.time;
} void tree_change(TreeNodeType *&pre,TreeNodeType *&now,LL bel,LL dis,LL sum,LL to)
{
now=new TreeNodeType;
now->sum=pre->sum+sum;
now->l=pre->l,now->r=pre->r;
now->bel=bel,now->dis=pre->dis+dis;
now->left=pre->left,now->right=pre->right;
if(now->l==now->r) return ;
LL mid=(now->l+now->r)>>;
if(to>mid) tree_change(pre->right,now->right,bel,dis,sum,to);
else tree_change(pre->left,now->left,bel,dis,sum,to);
} void tree_change_(TreeNodeType *&now,LL bel,LL dis,LL sum,LL to)
{
if(now->bel!=bel)
{
TreeNodeType *tmp=new TreeNodeType;
tmp->l=now->l,tmp->r=now->r;
tmp->dis=now->dis,tmp->bel=bel;
tmp->sum=now->sum,tmp->left=now->left;
tmp->right=now->right;
now=tmp;
}
now->dis+=dis,now->sum+=sum;
if(now->l==now->r) return ;
LL mid=(now->l+now->r)>>;
if(to>mid) tree_change_(now->right,bel,dis,sum,to);
else tree_change_(now->left,bel,dis,sum,to);
} LL tree_query(TreeNodeType *now,LL k)
{
if(now->l==now->r) return now->sum/now->dis*k;
if(k<=now->left->dis) return tree_query(now->left,k);
else return tree_query(now->right,k-now->left->dis)+now->left->sum;
} int main()
{
read_LL(m),read_LL(n);
LL pi,ai,bi;
for(LL i=;i<=m;i++)
{
read_LL(ai),read_LL(bi),read_LL(pi);
num++,do_[num].dis=,do_[num].pi=pi,do_[num].time=ai;
num++,do_[num].dis=-,do_[num].pi=-pi,do_[num].time=bi+;
hash[i]=pi;
}
sort(hash+,hash+m+);
size=unique(hash+,hash+m+)-hash-;
null=new TreeNodeType;
null->l=,null->r=;
null->dis=,null->sum=;
null->bel=;
null->left=null;
null->right=null;
tree_build(root[],,size);
sort(do_+,do_+num+,cmp);
for(LL i=;i<=num;i++)
{
for(LL j=do_[i-].time+;j<do_[i].time;j++)
{
root[j]=root[do_[i-].time];
}
LL pi_;
if(do_[i].pi<) pi_=lower_bound(hash+,hash+size+,-do_[i].pi)-hash;
else pi_=lower_bound(hash+,hash+size+,do_[i].pi)-hash;
if(!if_[do_[i].time])
{
if_[do_[i].time]=true;
tree_change(root[do_[i-].time],root[do_[i].time],do_[i].time,do_[i].dis,do_[i].pi,pi_);
}
else
{
tree_change_(root[do_[i].time],do_[i].time,do_[i].dis,do_[i].pi,pi_);
}
}
LL pre_=;
LL xi,ci;
for(LL i=;i<=n;i++)
{
read_LL(xi),read_LL(ai),read_LL(bi),read_LL(ci);
pre_=+((ai*pre_+bi)%ci);
LL res;
if(root[xi]->dis>pre_) res=tree_query(root[xi],pre_);
else res=root[xi]->sum;
cout<<res;
putchar('\n');
pre_=res;
}
return ;
}

AC日记——任务查询系统 洛谷 P3168的更多相关文章

  1. AC日记——寻找道路 洛谷 P2296

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  2. AC日记——导弹拦截 洛谷 P1020 (dp+模拟)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  3. AC日记——铺地毯 洛谷 P1003(水水水水水~)

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  4. AC日记——过河卒 洛谷 1002

    题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...

  5. AC日记——[SDOI2017]相关分析 洛谷 P3707

    [SDOI2017]相关分析 思路: 裸线段树: (玄学ac): 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  6. AC日记——丢瓶盖 洛谷 P1316

    题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入输出 ...

  7. AC日记——滑动窗口 洛谷 P1886

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  8. AC日记——挤牛奶 洛谷 P1204

    题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开 ...

  9. AC日记——信息传递 洛谷 P2661 (tarjan求环)

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

随机推荐

  1. 通过uboot传参设置mtd分区流程源码分析

    因为公司同事反映他使用的开板无法将根目录下的ip_work目mounth成功,由于本人当时没有去现场查看问题,只是象征性的询问内核是否创建了/dev/mtdblock5设备节点,因为该开发板默认是挂载 ...

  2. A1035 Password (20)(20 分)

    A1035 Password (20)(20 分) To prepare for PAT, the judge sometimes has to generate random passwords f ...

  3. L1-049 天梯赛座位分配 (20 分)

    天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位 ...

  4. Linux命令之---cat

    命令简介 cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 命令格式 cat [选项] [文 ...

  5. java并发面试题-基础

    多线程 java中有几种方法可以实现一个线程? 1.直接继承thread类:2.实现runnable接口: 如何停止一个正在运行的线程?可以使用正在运行的线程,支持线程中断,通常是定义一个volati ...

  6. 如何看待微软新开源的LightGBM?

    GBDT虽然是个强力的模型,但却有着一个致命的缺陷,不能用类似mini batch的方式来训练,需要对数据进行无数次的遍历.如果想要速度,就需要把数据都预加载在内存中,但这样数据就会受限于内存的大小: ...

  7. [转载]在Robotium中使用ID

    原文地址:在Robotium中使用ID作者:逍遥云翳 在Robotium的API中不提供使用ID的方式. 如果我们想在Robotium中使用ID就需要自己通过ID来找到控件的实例,然后通过Roboti ...

  8. C# 序列化和反序列化 详解

    什么是序列化以及如何实现序列化? 如何将对象数据写入 XML 文件? 如何从 XML 文件读取对象数据? 什么是序列化以及如何实现序列化? 序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内 ...

  9. ansible Failed to connect to the host via ssh: no such identity: /root/.ssh/id_rsa.bak

    中控机和远端主机配置完密钥后,在中控台上通过ansible检测联通性 ansible -i inventory.cfg all -m ping 10.1.1.1 | UNREACHABLE! => ...

  10. P4555 最长双回文串

    题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 n的串 S ,求 S的最长双回文子串 T ,即可将 ...