树套树60pts MLE+TLE求助
查看原帖
树套树60pts MLE+TLE求助
319995
THUD楼主2024/6/16 19:25
#include<bits/stdc++.h>
#define px first
#define py second
#define mkp make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ostream_iterator<ll> output(cout," ");
const int N=100005;
//const int MOD=;
typedef pair<int,int> P;
template<typename T>
class Dynamic_SegTree{
  public: 
	void add(int l,int r,const T& v){add(1,l,r,v);}
	void add(int i,const T& v){add(1,i,i,v);}
	T sum(int l,int r){return query_sum(1,l,r);}
	T qmax(int l,int r){return query_max(1,l,r);}
	T query(int i){return query_sum(1,i,i);}
	Dynamic_SegTree(ll si){tr.emplace_back();tr.emplace_back(1,si);}
  private:
	void update(int i,const T& x){
		tr[i].v[0]+=tr[i].len*x;
		tr[i].v[1]+=x;
		tr[i].tag+=x;
	}
	struct Node{
		T v[2],tag;
		ll l,r,mid,len;
		int ls,rs;
		Node(ll l_,ll r_){
			l=l_,r=r_,mid=(l+r)>>1,len=r-l+1;
			v[1]=v[0]=tag=ls=rs=0;
		}
		Node(){l=r=-1;v[0]=0;v[1]=numeric_limits<T>::min();tag=0;}
	};
	vector<Node> tr;
	void create_son(int i){
		if(tr[i].l==tr[i].r) return ;
		if(!tr[i].ls) tr[i].ls=tr.size(),tr.emplace_back(tr[i].l,tr[i].mid);
		if(!tr[i].rs) tr[i].rs=tr.size(),tr.emplace_back(tr[i].mid+1,tr[i].r);
	}
	void push_down(int i){
		create_son(i);
		if(tr[i].tag!=0){
			update(tr[i].ls,tr[i].tag);
			update(tr[i].rs,tr[i].tag);
			tr[i].tag=0;
		}
	}
	void push_up(int i){
		tr[i].v[0]=tr[tr[i].ls].v[0]+tr[tr[i].rs].v[0];
		tr[i].v[1]=max(tr[tr[i].ls].v[1],tr[tr[i].rs].v[1]);
	}
	void add(int i,ll l,ll r,const T& v){
		if(tr[i].l>=l&&tr[i].r<=r){update(i,v);return ;}
		push_down(i);
		if(tr[i].mid>=l) add(tr[i].ls,l,r,v);
		if(tr[i].mid<r) add(tr[i].rs,l,r,v);
		push_up(i);
	}
	T query_sum(int i,ll l,ll r){
		if(tr[i].l>=l&&tr[i].r<=r) return tr[i].v[0];
		push_down(i);
		T ans=0;
		if(tr[i].mid>=l&&tr[i].ls) ans+=query_sum(tr[i].ls,l,r);
		if(tr[i].mid<r&&tr[i].rs) ans+=query_sum(tr[i].rs,l,r);
		return ans;
	}
	T query_max(int i,ll l,ll r){
		if(tr[i].l>=l&&tr[i].r<=r) return tr[i].v[1];
		push_down(i);
		T ans=numeric_limits<T>::min();
		if(tr[i].mid>=l&&tr[i].ls) ans=max(ans,query_max(tr[i].ls,l,r));
		if(tr[i].mid<r&&tr[i].rs) ans=max(ans,query_max(tr[i].rs,l,r));
		return ans;
	}
};
template<typename T,typename Nest> 
class NestBIT{
	static int lowbit(int x){return x&(-x);}
	vector<Nest> tr;
	size_t n;
  public:
	void add(int i,int l,int r,const T& x){for(;i<=n;i+=lowbit(i)) tr[i].add(l,r,x);}
	void add(int i,int j,const T& x){for(;i<=n;i+=lowbit(i)) tr[i].add(j,x);}
	T presum(int i,int l,int r){T ans=0;for(;i>=1;i-=lowbit(i)) ans+=tr[i].sum(l,r);return ans;}
	T presum(int i,int j){T ans=0;for(;i>=1;i-=lowbit(i)) ans+=tr[i].query(j);return ans;}
	template<typename... A> NestBIT(size_t si,A&&... ags): n(si),tr(si+1,Nest(ags...)){}
	template<typename... A>
	T sum(int l,int r,A&&... ags){return presum(r,ags...)-presum(l-1,ags...);}
	template<typename... A> T query(int i,A&&... ags){return sum(i,i,ags...);}
};
int n,k,cnt[N];
pair<int,P> b[N];
signed main(){
	scanf("%d%d",&n,&k);
	NestBIT<int,Dynamic_SegTree<int>> a(k,k);
	for(int i=1;i<=n;i++) scanf("%d%d%d",&b[i].px,&b[i].py.px,&b[i].py.py);
	sort(b+1,b+n+1);
	for(int i=1,sum=1;i<=n;i++){
		//cerr<<b[i].px<<" "<<b[i].py.px<<" "<<b[i].py.py<<endl;
		if(b[i+1]==b[i]){
			sum++;
			continue;
		}
		a.add(b[i].py.px,b[i].py.py,sum);
		/*for(int j=1;j<=k;j++)
			for(int l=1;l<=k;l++)
				cerr<<a.query(j,l)<<" \n"[l==k];
		cerr<<a.presum(b[i].py.px,1,b[i].py.py)-1<<endl;*/
        cnt[a.presum(b[i].py.px,1,b[i].py.py)-1]+=sum;
        sum=1;
    }
    for(int i=0;i<n;i++) printf("%d\n",cnt[i]);
	return 0;
}

解法为树状数组套动态开点线段树,码风诡异勿喷
record #6TLE #7,9,10MLE

2024/6/16 19:25
加载中...