#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define IOS ios::sync_with_stdio(0); cin.tie(0);
#define lli long long int
#define pb push_back
#define all(x) x.begin(),x.end()
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define repp(i,a,b) for(int i=a;i>=b;i--)
#define vi vector<lli>
#define vvi vector<vi>
#define vpi vector<pair<lli,lli>>
#define pi pair<lli,lli>
#define msi multiset<lli>
#define mspi multiset<pair<lli,lli>>
#define mii map<lli,lli>
#define mpi map<pair<lli,lli>,lli>
#define si set<lli>
#define spi set<pair<lli,lli>>
#define qi queue<lli>
#define pqi priority_queue<lli>
#define pqimin priority_queue<lli,vi,greater<lli>>
#define geti(n) lli n; cin>>n;
#define get2i(n,m) lli n,m; cin>>n>>m;
#define get3i(n,m,k) lli n,m,k; cin>>n>>m>>k;
#define getvi(v,n) vi v(n); for(lli i=0;i<n;i++) cin>>v[i];
#define getvvi(v,n,m) vvi v(n,vi(m)); for(lli i=0;i<n;i++) for(lli j=0;j<m;j++) cin>>v[i][j];
#define getvpi(v,n) vpi v(n); for(lli i=0;i<n;i++) cin>>v[i].first>>v[i].second;
#define getpi (p) pi p; cin>>p.first>>p.second;
#define getmii(m,n) mii m; for(lli i=0;i<n;i++) { lli a,b; cin>>a>>b; m[a]=b; }
#define getstr(s) string s; cin>>s;
template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<class T1, class T2> using ordered_map = tree<T1, T2, less<T1>, rb_tree_tag, tree_order_statistics_node_update>;
void print(lli n) { cout << n << "\n"; }
void print(lli n, lli m) { cout << n << " " << m << "\n"; }
void print(lli n, lli m, lli k) { cout << n << " " << m << " " << k << "\n"; }
void print(vi v) { for (auto i : v) cout << i << " "; cout << "\n"; }
void print(vvi v) { for (auto i : v) { for (auto j : i) cout << j << " "; cout << "\n"; } }
void print(string s) { cout << s << "\n"; }
const lli MOD = 1e9 + 7;
struct mi {
int v;
explicit operator int() const { return v; }
mi() { v = 0; }
mi(long long _v) : v(_v % MOD) { v += (v < 0) * MOD; }
};
mi &operator+=(mi &a, mi b) {
if ((a.v += b.v) >= MOD) a.v -= MOD;
return a;
}
mi &operator-=(mi &a, mi b) {
if ((a.v -= b.v) < 0) a.v += MOD;
return a;
}
mi operator+(mi a, mi b) { return a += b; }
mi operator-(mi a, mi b) { return a -= b; }
mi operator*(mi a, mi b) { return mi((long long)a.v * b.v); }
mi &operator*=(mi &a, mi b) { return a = a * b; }
mi pow(mi a, long long p) {
assert(p >= 0);
return p == 0 ? 1 : pow(a * a, p / 2) * (p & 1 ? a : 1);
}
mi inv(mi a) {
assert(a.v != 0);
return pow(a, MOD - 2);
}
mi operator/(mi a, mi b) { return a * inv(b); }
struct manacher{
vector<int> p;
void run_manacher(string s){
int n = s.size();
p.assign(n,1);
int l = 1, r = 1;
rep(i,1,n-1){
p[i] = max(0, min(p[l+r-i], r-i));
while(i+p[i] < n && i-p[i] >= 0 && s[i+p[i]] == s[i-p[i]]){
p[i]++;
}
if(i+p[i]>r){
l = i-p[i];
r = i+p[i];
}
}
}
void build(string s){
string t;
for(auto v: s){
t += "#";
t += v;
}
run_manacher(t+"#");
}
int getlongest_palindrome(int centre, bool odd){
int pos = 2*centre+1+(!odd);
return p[pos]-1;
}
bool checkpalindrome(int l, int r){
if((r-l+1) <= getlongest_palindrome((l+r)/2, (r-l+1)%2)){
return true;
}
return false;
}
};
vi complete_subset_graphs(vi adj){
// adj[i] = 1 << j if i is connected to j
// n<=20
lli n = adj.size();
vi dp(1ll<<n,0);
rep(mask,0,(1<<n)-1){
bool complete = true;
rep(i,0,n-1){
if((mask & (1ll<<i))){
if(((adj[i] | (1ll<<i))&mask) != mask){
complete = false;
break;
}
}
}
if(complete) dp[mask] = 1;
}
return dp;
}
vi subsets_of_mask(lli mask){
vi subsets;
for(lli submask = mask; submask != 0; submask = (submask-1)&mask){
//lli subset = mask^submask;
// subset is a subset of mask
// {submask} = {mask} - {subset}
// tc 3^N
subsets.pb(submask);
}
return subsets;
}
vpi prm_fact(lli a) {
vpi res;
for (lli i = 2; i * i <= a; ++i) {
if (a % i == 0) {
int cnt = 0;
while (a % i == 0) {
a /= i;
cnt++;
}
res.pb({i, cnt});
}
}
if (a > 1) res.pb({a, 1});
return res;
}
lli solver(vpi& st){
msi m1,m2;
lli n = st.size();
rep(i,0,n-1){
lli x = st[i].first;
lli y = st[i].second;
if(m1.empty() || x < *m1.rbegin()){
m1.insert(x);
}
else{
m2.insert(x);
}
if(m1.empty() || y < *m1.rbegin()){
m1.insert(y);
}
else{
m2.insert(y);
}
while(m1.size() > m2.size() + 1){
lli pusher = *m1.rbegin();
m1.erase(m1.find(pusher));
m2.insert(pusher);
}
while(m2.size() > m1.size()){
lli pusher = *m2.begin();
m2.erase(m2.find(pusher));
m1.insert(pusher);
}
}
lli med = *m1.rbegin();
lli ans = 0;
rep(i,0,n-1){
ans += abs(med - st[i].first) + abs(med - st[i].second);
}
return ans;
}
void solve() {
lli n,k;
cin>>k>>n;
vpi st;
lli ans = 0;
vector<array<lli,4>> sorter;
rep(i,0,n-1){
char start,end;
lli a,b;
cin>>start>>a>>end>>b;
if(start == end)ans += abs(b-a);
else {
st.push_back({a,b});
array<lli,4> arr = {a+b,i,a,b};
sorter.push_back(arr);
}
}
sort(all(sorter));
if(k==1){
ans += solver(st) + st.size();
}
else{
st.clear();
rep(i,0,(sorter.size()-1)/2){
st.pb({sorter[i][2], sorter[i][3]});
}
ans += solver(st) + st.size();
st.clear();
rep(i,(sorter.size()-1)/2 + 1,sorter.size()-1){
st.pb({sorter[i][2], sorter[i][3]});
}
ans += solver(st) + st.size();
st.clear();
}
cout<<ans<<"\n";
}
signed main() {
IOS int t=1;
while(t--)
solve();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |