ODT RE 求调 玄关
查看原帖
ODT RE 求调 玄关
763542
Furina_Hate_Comma楼主2024/10/4 22:47

本人不擅长使用 set<node>::iterator 已知问题出现在26行 -- p;

求RE原因 或 如何修改

#include<bits/stdc++.h>
using namespace std;
#define it set<node>::iterator
#define int long long

#define mp make_pair
#define PII pair<int, int>

struct cht{
   struct node{
       int l, r;
       mutable int x;
       node(int ll, int rr, int vv){
           l = ll, r = rr, x = vv;
       }
       bool operator<(const node &b) const {
           return l < b.l;
       }
   };
   set<node> s;
   it split(int pos){
       it p = s.lower_bound(node(pos, -1, 0));
       cout << "trd\n";
       if(p != s.end() && pos == p -> l) return p;
       cout << "bye\n";
       -- p;
       cout << "hre\n";
       int ll = p -> l, rr = p -> r, vv = p -> x;
       cout << "arr\n";
       s.erase(p);
       cout << "saf\n";
       s.insert(node(ll, pos - 1, vv));
       return s.insert(node(pos, rr, vv)).first;
   }
   void assign(int l, int r, int x){
       cout << "aqa\n";
       it rr = split(r + 1), ll = split(l);
       cout << "qaq\n";
       s.erase(ll, rr);
       s.insert(node(l, r, x));
   }
   vector<PII> get_vector(int l, int r){
       vector<PII> ret;
       it rr = split(r + 1), ll = split(l);
       for(it i = ll ; i != rr ; i ++)
           ret.push_back(mp((i -> x), ((i -> r) - (i -> l) + 1)));
       sort(ret.begin(), ret.end());
       return ret;
   }
}t1, t2;
int query(int l, int r){
   vector<PII> a, b;
   a = t1.get_vector(l, r);
   b = t2.get_vector(l, r);
   int j = 0, ans = 0;
   for(int i = 0 ; i < a.size() && j < b.size() ;){
       if(a[i].second == b[i].second){
           ans += a[i].second * a[i].first * b[j].first;
           i ++, j ++;
       }
       else if(a[i].second > b[j].second){
           ans += b[j].second * a[i].first * b[j].first;
           a[i].second -= b[j].second;
           j ++;
       }
       else{
           ans += a[i].second * a[i].first * b[j].first;
           b[j].second -= a[i].second;
           i ++;
       }
   }
   return ans;
}

void solve(){
   int n, m;
   cin >> n >> m;
   for(int i = 1 ; i <= n ; i ++){
       int x;
       cin >> x;
       t1.assign(i, i, x);
   }
   for(int i = 1 ; i <= n ; i ++){
       int x;
       cin >> x;
       t2.assign(i, i, x);
   }
   // cout << "bruh\n";
   for(int i = 1 ; i <= m ; i ++){
       int md, l, r, v;
       cin >> md >> l >> r >> v;
       if(md == 1) t1.assign(l, r, v);
       if(md == 2) t2.assign(l, r, v);
       if(md == 3){
           cout << query(l, r) << '\n';
           t1.assign(l, r, v);
           t2.assign(l, r, v);
       }
   }
}
signed main(){
   solve();
}
2024/10/4 22:47
加载中...