此题有爷用set过了吗
查看原帖
此题有爷用set过了吗
38636
寒冰大大楼主2020/9/14 21:44

刚开始脑海中想的代码以为set可以过,然后打了过了样例交上去最慢1.83s以为改改就能过(虽然WA完了),然后改着改着就变成了暴力分了

set的每个节点是维护一个等差数列

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include<algorithm>

#define int long long

#define its set <node>::iterator

using namespace std;

int n,m,q;

struct node{
	mutable int l,r,delta,st;
	node (int ll=0,int rr=0,int ss=0,int dd=0) {l=ll,r=rr,delta=dd,st=ss;}
	bool operator <(const node &b)
	const{
		return l<b.l;
	}
};

set <node> s[300300],looker;

int getans(int y)
{
	its _3mlooker=looker.end();
	int ba=1;
	its it=looker.lower_bound(node(y));
	int l,r,st,delta;
	if(it->l==y&&it!=looker.end()) ; else --it;
	_3mlooker=++it; --it;
	l=it->l,r=it->r,st=it->st,delta=it->delta;
	int ans1=0;
	if(r-l>=1)
	{
		looker.erase(it);
		if(y!=l) looker.insert(node(l,y-1,st,delta));
		ans1=st+(y-l)*delta;
		if(y!=r)_3mlooker=looker.insert(node(y,r-1,st+(y-l+1)*delta,delta)).first,_3mlooker++,ba=1;
	}
	else 
	{
		looker.erase(it);
		ans1=st;
	}
	it=_3mlooker;
	for(;ba&&it!=looker.end();it++) 
	it->l--,it->r--;
	looker.insert(node(n,n,ans1,ans1));
	return ans1;
}

int getans(int x,int y)
{
	its _3mlooker=s[x].end();
	its _looker=looker.end();
	int ba=1,bb=1;
	its it=s[x].lower_bound(node(y));
	if(it->l==y&&it!=s[x].end()) ; else --it;
	_3mlooker=++it; --it;
	int l,r,st,delta;
	l=it->l,r=it->r,st=it->st,delta=it->delta;
	int ans1,ans2;
	if(r-l>=1)
	{
		s[x].erase(it);
		if(l!=y) s[x].insert(node(l,y-1,st,delta));
		ans1=st+(y-l)*delta;
		if(y!=r) _3mlooker=s[x].insert(node(y,r-1,st+(y-l+1)*delta,delta)).first,_3mlooker++,ba=1;
	}
	else 
	{
		s[x].erase(it);
		ans1=st;
	}
	it=looker.lower_bound(node(x));
	if(it->l==x&&it!=looker.end()) ; else --it;
	_looker=++it; --it;
	l=it->l,r=it->r,st=it->st,delta=it->delta;
	if(r-l>=1)
	{
		looker.erase(it);
		if(x!=l) looker.insert(node(l,x-1,st,delta));
		ans2=st+(x-l)*delta;
		if(x!=r)_looker=looker.insert(node(x,r-1,st+(x-l+1)*delta,delta)).first,_looker++,bb=1;
	}
	else
	{
		looker.erase(it);
		ans2=st;
	}	
	it=_3mlooker;
	for(;ba&&it!=s[x].end();it++) 
	it->l--,it->r--;
	it=_looker;
	for(;bb&it!=looker.end();it++) 
	it->l--,it->r--;
	looker.insert(node(n,n,ans1,ans1));
	s[x].insert(node(m-1,m-1,ans2,ans2));
//	for(its it=s[x].begin();it!=s[x].end();it++) cout<<"("<<it->l<<", "<<it->r<<", "<<it->st<<") ";
//	cout<<endl;
	return ans1;
}

signed main()
{
	freopen("3m.txt","r",stdin);
	freopen("3m.out","w",stdout);
	ios::sync_with_stdio(false);
	register int i,j;
	cin>>n>>m>>q;
	int x,y;
	for(i=1;i<=n;i++)
	{
		s[i].insert(node(1,m-1,(i-1)*m+1,1));
	}
	looker.insert(node(1,n,m,m));
	for(i=1;i<=q;i++)
	{
		cin>>x>>y;
		if(y!=m) cout<<getans(x,y)<<endl;
		else cout<<getans(x)<<endl;
	}
	return 0;
}

2020/9/14 21:44
加载中...