关于入门赛H
  • 板块灌水区
  • 楼主woshiguage
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/11/10 21:20
  • 上次更新2023/11/10 22:55:39
查看原帖
关于入门赛H
680101
woshiguage楼主2023/11/10 21:20
#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分求解。

大佬们有更好的思路吗?

又及:这题评黄还是绿

2023/11/10 21:20
加载中...