P14521 【MX-S11-T2】加减乘除题解

当时思路想到了但是发现区间求交有点绕,给我绕晕了,我就只写了暴力就算了。

其实就是对区间进行取交集,之后离散化后在值域树状数组上求前缀个数即可。

#include<bits/stdc++.h>
#define ll long long
#define int ll
#define ls p<<1
#define rs p<<1|1
#define re register 
#define pb push_back
#define pir pair<int,int> 
#define f(a,x,i) for(int i=a;i<=x;i++)
#define fr(a,x,i) for(int i=a;i>=x;i--)
#define fi first
#define se second
#define lowbit(x) (x&-x)
using namespace std;
const int N=5e5+10;
const int M=5e6+10;
const int mod=1e9+7;
const int INF=1e9+7;
mt19937 rnd(251);

int n,m;

struct ss{
	int op,x,l=114514,r=-114514;
}a[N];


struct sss{
	int y,l,r;
};
vector<sss> g[N];

int quest[M];
unordered_map<int,int> rns;

vector<int> val;
int len;

pair<int,int> jiao(int l,int r,int pl,int pr){
	return make_pair(max(l,pl),min(r,pr));
}

void dfs(int x,int d){
	for(int i=0;i<g[x].size();i++){
		int y=g[x][i].y;
		int k=a[x].op*a[x].x;
		int l=g[x][i].l-k,r=g[x][i].r-k;
		
		
		
		pair<int,int> ans=jiao(l,r,a[x].l+d,a[x].r+d);
		if(ans.fi>ans.se) continue;
		a[y].l=ans.fi-d;
		a[y].r=ans.se-d;
		dfs(y,d+k);
		
		for(int i=1;i<=n;i++){
			
		}
		
	}
}

int t[M];

void add(int x,int k){
	while(x<=len){
		t[x]+=k;
		x+=lowbit(x);
	}
} 

int query(int x){
	int sum=0;
	while(x){
		sum+=t[x];
		x-=lowbit(x);
	}
	return sum;
}



void solve(){
	cin>>n>>m;
	
	for(int i=2;i<=n;i++){
		int x,l,r;
		cin>>x>>l>>r;
		g[x].push_back({i,l,r});
	}
	
	for(int i=1;i<=n;i++){
		char c;
		cin>>c>>a[i].x;
		a[i].op=((c=='-')?-1:1);
	}
	
	for(int i=1;i<=m;i++){
		cin>>quest[i];
		val.push_back(quest[i]);
	}
	a[1].l=-2e18-5;
	a[1].r=2e18+5;
	
	dfs(1,0);
	
	for(int i=1;i<=n;i++){
		val.push_back(a[i].l);
		val.push_back(a[i].r);
		val.push_back(a[i].r+1);
	} 
	
	for(int i=1;i<=n;i++){
		sort(a+1,a+1)
	}
	
	sort(val.begin(),val.end());
	len=unique(val.begin(),val.end())-val.begin();
	for(int i=0;i<len;i++){
		rns[val[i]]=i+1;
	}
	
	for(int i=1;i<=n;i++){
		a[i].l=rns[a[i].l];
		a[i].r=rns[a[i].r];
	}
	for(int i=1;i<=m;i++){
		quest[i]=rns[quest[i]];
	}
	
	for(int i=1;i<=n;i++){
		if(a[i].r<a[i].l){
			continue;
		}
		add(a[i].l,1);
		add(a[i].r+1,-1);
	}
	for(int i=1;i<=m;i++){
		cout<<query(quest[i])<<"\n";
	}
	
} 



signed main(){
//  	freopen("kingdom3.in","r",stdin);
//  	freopen("a.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(nullptr);   
    int t=1;
//	cin>>t;
	while(t--){
		solve();
	} 
    return 0;
}
posted @ 2025-11-17 17:40  sad_lin  阅读(8)  评论(0)    收藏  举报