吸氧70 不吸氧65 求助!
查看原帖
吸氧70 不吸氧65 求助!
508316
cyhyyds楼主2021/9/20 15:43

思路很简单,应该可以看得出来吧

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 3e6 + 7;
const int inf = 0x3f3f3f3f;

#define int ll

int n, pos = 0;

struct Array {
	int l;
	int r;
	int len;
	
	ll sum;
}a[N];

signed main () {
    scanf ("%d", &n);
    
    for (int i = 1; i <= n; i ++) {
    	int op, l, r;
		
		ll k;
    	
        scanf ("%lld", &op);
        
        if (op == 1) {
           	scanf ("%lld%lld", &l, &r);
            
            a[++ pos].l = l;
            
            a[pos].r = r;
            
            a[pos].len = r - l + 1;
            
            a[pos].sum = (a[pos].r + a[pos].l) * a[pos].len / 2;
        }
        
        else if (op == 2) {
            scanf ("%lld", &k);
            
            ll ans = 0;
            
            while (114514) {
            	if (k >= a[pos].len) {
            		k -= a[pos].len;
					
					ans += a[pos].sum;
					
					pos --;
				}
				
				else {
					//cout << "now posl: " << a[pos].l << " now posr: " << a[pos].r << "  now k: " << k << endl;
					ans += (a[pos].r + a[pos].r - k + 1) * k / 2;
					
					a[pos].r -= k;
					
					a[pos].len = a[pos].r - a[pos].l + 1;
					
					a[pos].sum = (a[pos].l + a[pos].r) * a[pos].len / 2;
					
					break;
				}
			}
            
            printf ("%lld\n", ans);
        }
    }
    
    return 0;
}
2021/9/20 15:43
加载中...