| Task: | Ruudukko | 
| Sender: | Laserr | 
| Submission time: | 2022-11-09 11:27:06 +0200 | 
| Language: | C++ (C++11) | 
| Status: | READY | 
| Result: | 100 | 
| group | verdict | score | 
|---|---|---|
| #1 | ACCEPTED | 28 | 
| #2 | ACCEPTED | 33 | 
| #3 | ACCEPTED | 39 | 
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | ACCEPTED | 0.00 s | 1, 2, 3 | details | 
| #2 | ACCEPTED | 0.00 s | 1, 2, 3 | details | 
| #3 | ACCEPTED | 0.00 s | 1, 2, 3 | details | 
| #4 | ACCEPTED | 0.01 s | 2, 3 | details | 
| #5 | ACCEPTED | 0.01 s | 2, 3 | details | 
| #6 | ACCEPTED | 0.01 s | 2, 3 | details | 
| #7 | ACCEPTED | 0.27 s | 3 | details | 
| #8 | ACCEPTED | 0.44 s | 3 | details | 
| #9 | ACCEPTED | 0.52 s | 3 | details | 
Code
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct ruutu {
	unsigned long long first;
	unsigned long long second;
	unsigned long long x;
	unsigned long long y;
	ruutu(unsigned long long first_, unsigned long long second_, unsigned long long x_, unsigned long long y_) {
		first = first_;
		second = second_;
		x = x_;
		y = y_;
	}
	bool operator<(const ruutu& p) {
		if (first != p.first) return first < p.first;
		else if (y != p.y) return y < p.y;
		else return x < p.x;
	}
};
struct rivi {
	unsigned long long summa, valiaika, edellinen;
	rivi() {
		summa = 0;
		valiaika = 0;
		edellinen = 0;
	}
};
int main() {
	unsigned long long n;
	cin >> n;
	unsigned long long mod = 1000000007;
	unsigned long long s = 0;
	vector<ruutu> v;
	vector<rivi> r_x(n);
	vector<rivi> r_y(n);
	for (unsigned long long i = 0; i < n; i++) { // y
		for (unsigned long long j = 0; j < n; j++) { // x
			unsigned long long x;
			cin >> x;
			v.push_back(ruutu(x, 1, j, i));
		}
	}
	sort(v.begin(), v.end());
	for (ruutu i : v) {
		if (i.first > r_x[i.x].edellinen) {
			r_x[i.x].summa += r_x[i.x].valiaika % mod;
			r_x[i.x].valiaika = 0;
		}
		if (i.first > r_y[i.y].edellinen) {
			r_y[i.y].summa += r_y[i.y].valiaika % mod;
			r_y[i.y].valiaika = 0;
		}
		i.second += r_x[i.x].summa % mod;
		i.second += r_y[i.y].summa % mod;
		r_x[i.x].edellinen = i.first % mod;
		r_y[i.y].edellinen = i.first % mod;
		s += i.second;
		r_x[i.x].valiaika += i.second % mod;
		r_y[i.y].valiaika += i.second % mod;
	}
	cout << s % mod;
}Test details
Test 1
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 3 1 1 1 1 1 1 1 1 1  | 
| correct output | 
|---|
| 9 | 
| user output | 
|---|
| 9 | 
Test 2
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 3 1 2 3 6 5 4 7 8 9  | 
| correct output | 
|---|
| 135 | 
| user output | 
|---|
| 135 | 
Test 3
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 3 7 8 1 4 5 4 3 9 6  | 
| correct output | 
|---|
| 57 | 
| user output | 
|---|
| 57 | 
Test 4
Group: 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...  | 
| correct output | 
|---|
| 10000 | 
| user output | 
|---|
| 10000 | 
Test 5
Group: 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 100 1 2 3 4 5 6 7 8 9 10 11 12 13 ...  | 
| correct output | 
|---|
| 187458477 | 
| user output | 
|---|
| 187458477 | 
Test 6
Group: 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 100 2995 8734 1018 2513 7971 5063 ...  | 
| correct output | 
|---|
| 964692694 | 
| user output | 
|---|
| 964692694 | 
Test 7
Group: 3
Verdict: ACCEPTED
| input | 
|---|
| 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...  | 
| correct output | 
|---|
| 1000000 | 
| user output | 
|---|
| 1000000 | 
Test 8
Group: 3
Verdict: ACCEPTED
| input | 
|---|
| 1000 1 2 3 4 5 6 7 8 9 10 11 12 13 ...  | 
| correct output | 
|---|
| 229147081 | 
| user output | 
|---|
| 229147081 | 
Test 9
Group: 3
Verdict: ACCEPTED
| input | 
|---|
| 1000 520283 805991 492643 75254 527...  | 
| correct output | 
|---|
| 951147313 | 
| user output | 
|---|
| 951147313 | 
