求助
  • 板块P4198 楼房重建
  • 楼主www159
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/3/11 21:38
  • 上次更新2023/11/5 02:11:28
查看原帖
求助
96320
www159楼主2021/3/11 21:38

第九个点本地能过,但测评机卡了。 求大佬指点迷津 .

#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;
}
2021/3/11 21:38
加载中...