Submission #143998

#TimeUsernameProblemLanguageResultExecution timeMemory
143998OrtAutomobil (COCI17_automobil)C++11
0 / 100
19 ms504 KiB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/rope>
#define MEM(a, b) memset(a, (b), sizeof(a))
#define ALL(c) (c).begin(),(c).end()
#define sz(a) ((int)(a.size()))
#define ll long long
#define LINF (ll)1e18
#define INF (int)1e9
#define MINF 0x3F3F3F3F
#define pb push_back
#define fs first
#define sc second
#define mp make_pair
#define MOD 1000000007
#define IO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define MAX 1000005
#define watch(x) cerr<<#x<<" = "<<(x)<<endl;

using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;

template<class T> using indexed_set = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

ll sol;
ll n, m, k, x, y;
ll sum_w;

char c;
vector<pll> upd_r, upd_c;
map<ll,ll> Mr, Mc;

inline ll mult(ll a, ll b) {
	return (a*b)%MOD;
}

inline ll add(ll a, ll b) {
	return (a+b+MOD)%MOD;
}

inline ll gauss(ll from, ll to, ll nums) {
	return mult( add(from, to) , nums )>>1;
}

inline ll val(ll y, ll x) {
	return add( mult(y-1, m),x);
}


int main() {
	cin >> n >> m >> k;
	for(int i=0;i<k;i++) {
		cin >> c >> x >> y;
		if(c=='R') {
			if(Mr.find(x)==Mr.end()) Mr[x] = y;
			else Mr[x] *= y;
		}
		else {
			if(Mc.find(x)==Mc.end()) Mc[x] = y;
			else Mc[x] *= y;
		}
	}
	for(auto x:Mr) upd_r.pb(mp(x.first,x.second));
	for(auto x:Mc) upd_c.pb(mp(x.first,x.second));
	
	
	
	sort(ALL(upd_r)); sort(ALL(upd_c));
	for(int i=0;i<sz(upd_c);i++) {
		ll col = upd_c[i].fs;
		ll col_up = upd_c[i].sc;
		ll last_row = 1;
		for(int j=0;j<sz(upd_r);j++) {
			ll row = upd_r[j].fs;
			ll row_up = upd_r[j].sc;
			if(row==last_row) {
				ll c = val(row, col);
				sol = add(sol, mult(c, mult(col_up,row_up) ) );
				sum_w = add(sum_w, c);
				last_row = row+1;
				continue;
			}
			else if(row==last_row+1) {
				ll c = val(last_row, col);
				sol = add(sol, mult(c,col_up) );
				sum_w = add(sum_w, c);
				last_row = row+1;
			}
			else {
				ll cl = val(last_row, col);
				ll ch = val(row-1, col);
				ll sum_range = gauss(cl, ch, row-last_row);
				ll mult_range = mult(sum_range, col_up);
				sol = add(sol, mult_range);
				sum_w = add(sum_w, sum_range);
				last_row = row+1;	
			}
			ll c = val(row, col);
			sol = add(sol, mult(c, mult(col_up,row_up) ) );
			sum_w = add(sum_w, c);
			last_row = row+1;
		}
		if(last_row>n) continue;
		else if(last_row==n) {
			ll c = val(n, col);
			sol = add(sol, mult(c, col_up) );
			sum_w = add(sum_w, c);
		}
		else {
			ll cl = val(last_row, col);
			ll ch = val(n, col);
			ll sum_range = gauss(cl, ch, n-last_row+1);
			ll mult_range = mult(sum_range, col_up);
			sol = add(sol, mult_range);
			sum_w = add(sum_w, sum_range);
		}
	}
	for(int i=0;i<sz(upd_r);i++) {
		ll row = upd_r[i].fs;
		ll row_up = upd_r[i].sc; ll last_col = 1;
		for(int j=0;j<sz(upd_c);j++) {
			ll col = upd_c[j].fs;
			ll col_up = upd_c[j].sc;
			if(last_col==col) {
				last_col = col + 1;
				continue;
			}
			else if(col==last_col+1) {
				ll c = val(row, last_col);
				sol = add(sol, mult(c,row_up) );
				sum_w = add(sum_w, c);
				last_col = col + 1;
				continue;
			}
			else {
				ll cl = val(row, last_col);
				ll ch = val(row, col-1);
				ll sum_range = gauss(cl, ch, col-last_col);
				ll mult_range = mult(sum_range, row_up);
				sol = add(sol, mult_range);
				sum_w = add(sum_w, sum_range);
				last_col = col+1;
			}
		}
		if(last_col>m) continue;
		else if(last_col==m) {
			ll c = val(row, m);
			sol = add(sol, mult(c,row_up) );
			sum_w = add(sum_w, c);
		}
		else {
			ll cl = val(row,last_col);
			ll ch = val(row, m);
			ll sum_range = gauss(cl, ch, m-last_col+1);
			ll mult_range = mult(sum_range, row_up);
			sol = add(sol, mult_range);
			sum_w = add(sum_w, sum_range);		
		}	
	}
	ll t = mult(n, m);
	ll total_no_update = mult(t, t+1)>>1;
	ll res = total_no_update - sum_w;
	cout << add(sol, res);
	return 0;
}

Compilation message (stderr)

automobil.cpp: In function 'int main()':
automobil.cpp:127:7: warning: unused variable 'col_up' [-Wunused-variable]
    ll col_up = upd_c[j].sc;
       ^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...