求助卡常
查看原帖
求助卡常
121813
老子是北瓜楼主2022/7/19 15:23

RT,我看别人写的两只log都能卡过去,我这单log居然吸了氧还T一个点……

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<unordered_map>
#define ll long long
#define ull unsigned long long
#define dbg cout<<"ok"<<endl;
#define mod
#define N 4000003

using namespace std;

int q,n,temp[N],tot,lg,table[N];
int t[N][2],val[N],ans,best,all;

struct query {
	int opt,t,x,y,k;
} a[N];

unordered_map<int,int> ma;

inline void add(int x,int k,int val){
	for(; x<=n; x+=x&(-x)) t[x][k] += val;
}

void work()
{	
	int p = 0 , m = lg;
	int sum0=0,sum1=0,target;
	
	for(int i=m; i>=0; --i)
	{
		int k = p|(1<<i);
		if(sum0 + t[k][0] <= all - (sum1 + t[k][1] - val[k]) && k<=n)
		{
			sum0 += t[k][0];
			sum1 += t[k][1];
			p = k;
		}
	}
	
	best = table[p]; ans = sum0;
	
	if(all - sum1 < ans) return;
	
	p=0; target=sum1; sum1=0;
	
	for(int i=m; i>=0; --i)
	{
		int k = p|(1<<i);
		if(sum1 + t[k][1] <= target && k<=n)
		{
			sum1 += t[k][1];
			p = k;
		}
	}
	
	best = table[p+1], ans = all - sum1;
}

inline int qread(){
	int num = 0 ; char ch = getchar();
	while(ch < '0' || ch > '9') ch = getchar();
	while(ch >= '0' && ch <= '9') {
		num = num*10 + ch-'0';
		ch = getchar();
	}
	return num;
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	
	q=qread();
	
	for(int i=1; i<=q; ++i)
	{
		a[i].opt=qread();
		if(a[i].opt == 1)
		{
			a[i].t=qread(); a[i].x=qread(); a[i].y=qread();
			temp[++tot] = a[i].x;
		}
		else
			a[i].k=qread();
	}
	
	sort(temp+1,temp+1+tot);
	
	for(int i=1; i<=tot; ++i)
		if(ma.find(temp[i]) == ma.end() ){
			ma[temp[i]] = ++n;
			table[n] = temp[i];
		}
	
	lg = log2(n);
	
	for(int i=1; i<=q; ++i)
	{
		a[i].x = ma[a[i].x];
		if(a[i].opt == 1)
		{
			add(a[i].x,a[i].t,a[i].y);
			if(a[i].t) 
			{
				all += a[i].y;
				val[a[i].x] += a[i].y;
			}
		}
		else
		{
			int p = a[i].k;
			add(a[p].x,a[p].t,-a[p].y);
			if(a[p].t)
			{
				all -= a[p].y;
				val[a[p].x]-= a[p].y;
			}
		}
		
		ans = 0;
		work();
		
		if(ans == 0) cout<<"Peace"<<endl; 
		else cout<<best<<" "<<(ans<<1)<<endl;
	}
	return 0;
}
2022/7/19 15:23
加载中...