第九个点本地能过,但测评机卡了。 求大佬指点迷津 .
#include<iostream>
#include<fstream>
#include<cstdio>
#define dd double
using namespace std;
template <typename T>
inline void rd(T& x){
x = 0;
T f = 1;
char s = getchar();
while(s < '0' || s > '9') s = getchar();
if(s == '-'){
f = -f;
s = getchar();
}
while(s <= '9' && s >= '0'){
x = (x<<1)+(x<<3)+(s^48);
s = getchar();
}
x *= f;
}
template <typename T>
inline void wrt(T x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9){
wrt(x/10);
}
putchar(x%10+'0');
}
//l,r要特判 。
#define self node[o]
#define ls node[o<<1]
#define rs node[o<<1|1]
#define mid ((l+r)>>1)
void upMax(int o){
self.maxn = max(ls.maxn, rs.maxn);
}
//右区间的左儿子。
void upRight(int o, int l, int r, dd lv){
if(self.maxn <= lv){
self.len = 0;
return;
}
if(l == r){
self.len = 1;
return;
}
self.len = 0;
if(ls.maxn > lv){
upRight(o<<1, l, mid, lv);
self.len += ls.len;
}
else{
upRight(o<<1|1, mid+1, r, lv);
}
self.len += rs.len;
}
void change(int o, int l, int r, int pos, dd v){
if(l == pos && r == pos){
self.maxn = v;
self.len = 1;
return;
}
if(pos <= mid) change(o<<1, l, mid, pos, v);
if(pos > mid) change(o<<1|1, mid+1, r, pos, v);
//修改完成之后,进行特判和右下沉。
// int ans = 0;
self.len = ls.len;
upMax(o);
//从左节点up
upRight(o<<1|1, mid+1, r, ls.maxn);
// upRight(o, mid+1, r, v);
self.len += rs.len;
}
int m, n;
//int x[maxn], y[maxn];
int main(){
ofstream fl;
fl.open("D:\\OneDrive - whu.edu.cn\\桌面\\www.txt");
rd(n), rd(m);
int x, y;
while(m--){
rd(x), rd(y);
change(1, 1, n, x, (dd)y/(dd)x);
// cout<<5000-m<<":";
fl<<node[1].len<<endl;
wrt(node[1].len);
putchar('\n');
}
fl.close();
return 0;
}