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;
}

浙公网安备 33010602011771号