【JSOI2008】【bzoj1012】最大數maxnumber
題面
維護一個數列,提供以下兩種操作:
1、 查詢操作:查詢當前數列中末尾L個數中的最大的數,並輸出這個數的值。
2、 插入操作:將n加上t,其中t是最近一次查詢操作的答案(如果還未執行過查詢操作,則t=0),並將所得結果對一個固定的常數D取模,將所得答案插入到數列的末尾。
題解
1、思路:維護一顆葉節點數為m的線段樹(就算m次操作都是插入也只有m個元素),區間查詢即可。複雜度O(
m*log_2m
)。 2、資料有毒。。。bzojAC的code洛谷MLE,洛谷AC的bzojTLE。
BZOJAC[洛谷MLE,不知道為什麼]
//#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 200005;
int sgt[maxn<<2];
void change(int p, int l, int r, int x, int v){
if(l == r){
sgt[p] = v;
return ;
}
int m = (l+r)/2;
if(x <= m)change(p*2,l,m,x,v);
if(x > m)change(p*2+1,m+1,r,x,v);
sgt[p] = max(sgt[p*2],sgt[p*2+1]);
}
int query(int p, int l, int r, int L, int R){
if(L <= l && r <= R)return sgt[p];
int m = (l+r)/2, ans = 0;
if(L <= m)ans = max(ans, query(p*2,l,m,L,R));
if(R > m)ans = max(ans, query(p*2+1,m+1,r,L,R));
return ans;
}
int main(){
//ios::sync_with_stdio(false);
int n=0, m, mod, t=0;
scanf("%d %d",&m, &mod);//cin>>m>>mod;
for(int i = 1; i <= m; i++){
char op[2]; int x; //cin>>op>>x;
scanf("%s%d", op, &x);
if(op[0] == 'Q'){
printf("%d\n", t=query(1,1,m,n-x+1,n));
//cout<<(t = query(1,1,m,n-x+1,n))<<"\n";
}else{
change(1,1,m,++n,(x+t)%mod);
}
}
return 0;
}
luoguAC[bzojTLE,好像是scanf的鍋]
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 200010;
typedef long long LL;
struct node{
int l, r;
LL val, addmark;
}sgt[maxn<<2];
void build(int p, int l, int r){
sgt[p].l = l, sgt[p].r = r;
if(l == r){
//sgt[p].val = a[l];
}else{
int m = (l+r)/2;
build(p*2,l,m);
build(p*2+1,m+1,r);
sgt[p].val = max(sgt[p*2].val,sgt[p*2+1].val);
}
}
void change(int p, int x, int v){
if(sgt[p].l == sgt[p].r){
sgt[p].val = v;
return ;
}
int m = (sgt[p].l+sgt[p].r)/2;
if(x <= m)change(p*2,x,v);
if(x > m)change(p*2+1,x,v);
sgt[p].val = max(sgt[p*2].val,sgt[p*2+1].val);
}
LL query(int p, int l, int r){
if(l <= sgt[p].l && sgt[p].r <= r)return sgt[p].val;
LL m = (sgt[p].l+sgt[p].r)/2, ans = 0;
if(l <= m)ans = max(ans, query(p*2,l,r));
if(r > m)ans = max(ans, query(p*2+1,l,r));
return ans;
}
int main(){
ios::sync_with_stdio(false);
LL n=0, m, mod, t=0;
cin>>m>>mod;
build(1,1,m);
for(int i = 1; i <= m; i++){
char op; LL x; cin>>op>>x;
if(op == 'Q'){
cout<<(t = query(1,n-x+1,n))<<"\n";
}else{
change(1,++n,(x+t)%mod);
}
}
return 0;
}
相關文章
- [JSOI2008] 最大數 (ST表)JS
- [JSOI2008] 最大數 (單調棧)JS
- 求最大公約數 & 最大公約數
- P1197-[JSOI2008]星球大戰JS
- 最大數問題
- P1227 【[JSOI2008]完美的對稱】JS
- 求最大質因數
- Redis最大clients數研究Redisclient
- LeetCode-179-最大數LeetCode
- 004 最大公約數
- 最大公約數,最小公倍數
- 最小公倍數&&最大公約數
- 小於n的最大數
- C. 最大公約數
- MySQL 修改最大連線數MySql
- 最大公約數和最小公倍數
- 最小公倍數和最大公約數
- 輸入10個整數,求最大數
- 求最大公公約數(最大公因數)—— 歐幾里得演算法演算法
- mysql關於最大連線數、最大併發執行緒數的區別MySql執行緒
- 2.6.6 指定程式的最大數量
- vertica 設定最大會話數會話
- 三個數的最大乘積
- 【數學問題】最大公約數與最小公倍數
- C++:最小公倍數與最大公約數C++
- LeetCode 面試題16.07[最大數值]LeetCode面試題
- 聊聊介面最大併發處理數
- 測試 mysql 的最大連線數MySql
- 相鄰兩數的最大差值
- Linux-CentOS 最大開啟檔案數和程式數LinuxCentOS
- 如何從整數陣列中找到最大和最小數陣列
- 數列區間最大值(ST表)
- 最大值(最短路+最短路計數)
- acwing246 區間最大公約數
- 房間安排(當天最大房間數)
- 求最大公約數(輾轉相除法)
- MySQL 預設最大連線數是多少?MySql
- activemq修改IO模型和最大連線數MQ模型