[很可能是精度问题] 50pts 球球巨佬
查看原帖
[很可能是精度问题] 50pts 球球巨佬
49677
miserExist楼主2021/8/15 19:10

虽然样例没过

但是bzoj过了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
#define int long long
//#define debug cout<<1;

const int N = 1e5 + 1002,M = 110,inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;

template <class T> void read(T &w){
	w=0;int f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){(w*=10)+=ch-'0';ch=getchar();}
	w*=f;
}

template <class T> void write(T w){
	if(w<0){putchar('-');w*=-1;}
	if(w/10) write(w/10);
	putchar(w%10+'0');
}

int n,m;

struct node
{
	int l,r;
	int sum;
	double maxx;
	
}tr[N * 4];


void build(int u,int l,int r)
{
	tr[u].l = l, tr[u].r = r;
	if(l == r)
	{
		tr[u].sum = 1;
		tr[u].maxx = 0;
		return;
	}
	int mid = l + r >> 1;
	build(u << 1,l, mid), build(u << 1 | 1, mid + 1, r);
}

int query(int u,double MAXN)
{
	
	if(tr[u].maxx <= MAXN)
	{
		return 0;
	}
	if(tr[u].l == tr[u].r)
	{
		if(tr[u].maxx > MAXN) return 1;
		else return 0;
	}
	
	if(tr[u << 1].maxx <= MAXN)
	{
		return query(u << 1 | 1, MAXN);
	}
	
	if(tr[u << 1].maxx > MAXN)
	{
		return query(u << 1, MAXN) + tr[u].sum - tr[u << 1].sum;
	}
	
	
	
}


void pushup(int u)
{
	tr[u].maxx = max(tr[u << 1].maxx, tr[u << 1 | 1].maxx);
	
	int mid = tr[u].l + tr[u].r >> 1;
	tr[u].sum = tr[u << 1].sum + query(u << 1 | 1, tr[u << 1].maxx);
	
}




void modify(int u,int pos,double k)
{
	if(tr[u].l == tr[u].r && tr[u].l == pos)
	{
		tr[u].maxx = k;
		return;
	}
	int mid = tr[u].l + tr[u].r >> 1;
	if(pos <= mid) modify(u << 1, pos,k);
	if( pos > mid) modify(u << 1 | 1,  pos, k);
	pushup(u);
}


signed main()
{

		read(n), read(m);
		
		build(1,1,n);
		
		
		for(int i = 1; i <= m; i ++)
		{
			int a,b;
			read(a), read(b);
			//debug
			modify(1,  a, (double)( (double)b/ (double)a) );
			//debug
			write(tr[1].sum);
			//cout << "!";
			puts("");
		}
	
	return 0;
}

2021/8/15 19:10
加载中...