2 条题解

  • 0
    @ 2025-8-21 15:31:12

    只移动前后边界,二分搜索越界的机器人

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define MAX_SIZE 333333
    
    int a[MAX_SIZE];
    int n, m, s;
    int lower_(int x){
    	int* t = lower_bound(a + 1, a + n + 1, x);
    	return (t - a - 1);
    }
    int upper_(int x){
    	int *t = upper_bound(a + 1, a + n + 1, x);
    	return (t - a);
    }
    
    signed main() {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cin >> n >> m >> s;
    	for (int i = 1; i <= n; i++){
    		cin >> a[i];
    	}
    	sort(a + 1, a + n + 1);
    	int ss = -s;
    	int q = 0;
    	int p = n + 1;
    	while(m--){
    		int op, d, a, b;
    		cin >> op;
    		if (op == 1){
    			cin >> d;
    			ss -= d;
    			s -= d;
    			a = lower_(ss);
    			b = upper_(s);
    			q = max(q, a);
    			p = min(p, b);
    			//cout << "q = " << q << "; p = " << p << "\n";
    		}else if (op == 2){
    			cin >> d;
    			ss += d;
    			s += d;
    			a = lower_(ss);
    			b = upper_(s);
    			q = max(q, a);
    			p = min(p, b);
    			//cout << "q = " << q << "; p = " << p << "\n";
    		}else {
    			cout << max(p - q - 1, 0LL) << "\n";
    		}
    	}
    	return 0;
    }
    
    • 0
      @ 2025-8-21 15:25:19
      #include<bits/stdc++.h>
      #define int long long
      using namespace std;
      
      const int N = 300000 + 10;
      int n, m, k, op, x, tot, a[N];
      //tot记录目前一共向正方向移动了多少个单位,可以是负数(负数代表向反方向移动) 
      deque<int> q;//定义双向队列 
      
      signed main(){
      	cin >> n >> m >> k;
      	for(int i=1;i<=n;i++)	cin >> a[i];//需要另开一个数组输入,因为要排序 
      	sort(a + 1, a + 1 + n);//排序 
      	for(int i=1;i<=n;i++)	q.push_back(a[i]);//进队 
      	for(int i=1;i<=m;i++){
      		cin >> op;
      		if(op == 3)	cout << q.size() << endl;//输出队列长度,也就是元素个数 
      		else if(op == 1){
      			cin >> x;
      			tot += x;//刷新tot 
      			while(!q.empty()){
      				int v = q.back();
      				if(v + tot > k)	q.pop_back();//如果此埴轮移动完超过k,就被淘汰了 
      				else	break;
      			}
      		}else if(op == 2){
      			cin >> x;
      			tot -= x;//刷新tot 
      			while(!q.empty()){
      				int v = q.front();
      				if(v + tot < -k)	q.pop_front();//如果此埴轮移动完小于-k,也会被淘汰 (从队头弹出) 
      				else	break;
      			}
      		}
      	}
      	return 0;
      }
      
      
      • 1

      信息

      ID
      86
      时间
      1000ms
      内存
      128MiB
      难度
      9
      标签
      递交数
      106
      已通过
      12
      上传者