#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
int n,q;cin>>n>>q;
long long ans2[200005]={0},cnt2=0;
while(n--){
string s, t;
cin >> s;
s += '+';
int flag = 1, sign = 1, a = 0, b = 0;
char x;
for (int i = 0; i < s.size(); i++){
if (t.size() > 0 && (s[i] == '=' || s[i] == '+' || s[i] == '-')){
int num = 0;
if (t[t.size() - 1] >= '0' && t[t.size() - 1] <= '9'){
for (int j = 0; j < t.size(); j++) num = num * 10 + t[j] - '0';
b += num * flag * sign;
}
else{
for (int j = 0; j < t.size() - 1; j++) num = num * 10 + t[j] - '0';
if (t.size() == 1) num = 1;
x = t[t.size() - 1];
a += num * flag * sign;
}
t = "";
}
if (s[i] == '=') flag = -1, sign = 1;
else if (s[i] == '+') sign = 1;
else if (s[i] == '-') sign = -1;
else t += s[i];
}
ans2[++cnt2]=b/a*-1;
}
sort(ans2+1,ans2+cnt2+1);
int ans[200005]={0},cnt=0;
for(int i=1;i<=cnt2;){
ans[++cnt]=ans2[i];
while(ans2[i]==ans2[i+1])i++;
i++;
}
while(q--){
int l,r;cin>>l>>r;
int L=-1,R=-1;
int left=1,right=cnt,mid;
while(left<=right){
mid=(left+right)/2;
if(ans[mid]>=l){right=mid-1;L=mid;}
else left=mid+1;
}
left=1;right=cnt;
while(left<=right){
mid=(left+right)/2;
if(ans[mid]<=r){left=mid+1;R=mid;}
else right=mid-1;
}
if(L==-1||R==-1)cout<<"0"<<endl;
else cout<<R-L+1<<endl;
}
return 0;
}
RT,我的思路是先解方程,再统计答案并去重,再2分求解。
大佬们有更好的思路吗?
又及:这题评黄还是绿