最近實驗室正在為其管理的超級計算機編制一套任務管理系統,而你被安排完成其中的查詢部分。超級計算機中的任務用三元組(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 31 2 6
2 3 3
1 3 2
3 3 4
3 1 3 2
1 1 3 4
2 2 4 3
輸出樣例#1:
2811
樣例解釋
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的乙個排列
solution:
本題主席樹板子。
題意是個區間修改單點查詢,只不過查詢的時候是要前k小的和。
每個區間$[l,r]+k$,而查詢只要乙個位置$x_i$的情況,想到差分序列,然後搞字首和做到單點修改單點查詢。
我們對等級$p_i$離散,並構建主席樹,由於要求前$k$小的等級和,所以多維護乙個等級和的字首和$sum$。
對於每個詢問,沿著查詢的時刻的權值線段樹自頂向下判斷,模擬求第$k$小數,每次累加返回$sum$就好了。(注意,這樣查詢會出現乙個問題,當乙個等級在同一時刻多次出現時,就會出現遍歷到該等級子節點時$siz>k$,此時不能直接返回$sum$,而應返回$sum/siz*k$)
**:
/*code by 520 -- 9.13
*/#include
#define il inline
#define ll long long
#define re register
#define for(i,a,b) for(re int (i)=(a);(i)<=(b);(i)++)
#define bor(i,a,b) for(re int (i)=(b);(i)>=(a);(i)--)
using
namespace
std;
const
int n=200005
;int n,m,rt[n],*q[n],w[n],tot,cnt,num;
struct
arr}a[n
<<1
];struct
nodet[n*40
];int
gi()
il bool cmp(const
int *a,const
int *b)
void build(int l,int r,int &rt)
void update(int k,int tag,int l,int r,int lst,int &rt)
ll query(
int rt,int k,int l,int
r)int
main(),a[i+n]=arr;
q[i]=&a[i].val,q[i+n]=&a[i+n].val;
}sort(q+1,q+n*2+1
,cmp);
int lst=-1
; for(i,
1,n<<1
)
if(*q[i]!=lst) lst=*q[i],*q[i]=++cnt,w[cnt]=lst;
else *q[i]=cnt;
sort(a+1,a+n*2+1
); build(
1,cnt,rt[0
]); lst=rt[0
];
for(re int i=1,j=1;i<=m;i++)
ll pre=1
,k,a,b,c;
while(m--)
return0;
}
P3168 CQOI2015 任務查詢系統
最近實驗室正在為其管理的超級計算機編制一套任務管理系統,而你被安排完成其中的查詢部分。超級計算機中的任務用三元組 si,ei,pi 描述,si,ei,pi 表示任務從第si秒開始,在第ei秒後結束 第si秒和ei秒任務也在執行 其優先順序為pi。同一時間可能有多個任務同時執行,它們的優先順序可能相同...
P3168 CQOI2015 任務查詢系統
p3168 cqoi2015 任務查詢系統 傳送門 給你 m 條資訊,即乙個優先順序為 p i 的任務,處理時間為 l i r i 給你 n 條詢問,每條詢問 在 x 時刻優先順序前 k 小的任務 p 的總和為多少。1 n,m 10 5,1 p i 10 7 n,m 這樣的範圍,大概是 o nlog...
P3168 CQOI2015 任務查詢系統
傳送門 求前 k 小的數的和,考慮主席樹 但是如果每個時間都暴力插入顯然會gg 發現每個任務都是區間,查詢是單點查詢 所以考慮維護差分陣列 直接用主席樹維護差分陣列,因為同一時間差分可能有多次修改,所以要把當前修改全部搞完才算當前時間的線段樹 詢問就在相應時間點的線段樹上走 具體看 理解吧 incl...