Submission details
Task:Forest density
Sender:Giaco
Submission time:2025-09-22 17:06:05 +0300
Language:Rust (2021)
Status:READY
Result:
Test results
testverdicttime
#10.00 sdetails
#20.35 sdetails
#30.32 sdetails

Compiler report

warning: unused imports: `max`, `min`
 --> input/code.rs:1:16
  |
1 | use std::cmp::{max, min};
  |                ^^^  ^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused imports: `HashMap`, `HashSet`
 --> input/code.rs:2:24
  |
2 | use std::collections::{HashMap, HashSet};
  |                        ^^^^^^^  ^^^^^^^

warning: variable does not need to be mutable
  --> input/code.rs:63:14
   |
63 |         let (mut s, mut e): ((usize, usize), (usize, usize)) = ((input!(it), input!(it)), (input!(it), input!(it)));
   |              ----^
   |              |
   |              help: remove this `mut`
   |
   = note: `#[warn(unused_mut)]` on by default

warning: variable does not need to be mutable
  --> input/code.rs:63:21
   |
63 |         let (mut s, mut e): ((usize, usize), (usize, usize)) = ((input!(it), input!(it)), (input!(it), input!(it)));
   |                     ----^
   |                     |
   |                     help: remove this `mut`

warning: 4...

Code

use std::cmp::{max, min};
use std::collections::{HashMap, HashSet};
use std::io::{self, Read};

macro_rules! input {
    ($it: expr) => {
        $it.next().unwrap().parse().unwrap()
    };
    ($it: expr, $T: ty) => {
        $it.next().unwrap().parse::<$T>().unwrap()
    };
}
/*
mod classes;
mod homework;

fn main() {
    // println!("{}", "-".repeat(20));
    classes::c07::task2();
    // homework::hw2::task1();
    // println!("{}", "-".repeat(20));
}
// */

fn main() {

    let mut buf = String::new();
    io::stdin().read_to_string(&mut buf).unwrap();

    let mut it = buf.split_whitespace();

    let (n, mut q): (usize, usize) = (input!(it), input!(it));
    let mut f: Vec<Vec<usize>> = vec![vec![0; n]; n];

    for i in 0..n {
        let s: String = input!(it);
        let v: Vec<char> = s.chars().collect();
        for j in 0..n {
            if v[j] == '*' {
                f[i][j] = 1;
            }
        }
    }

    // prefix sum
    let mut ps: Vec<Vec<usize>> = vec![vec![0; n+1]; n+1];
    for i in 1..n {
        ps[1][i+1] = f[0][i];
    }
    // for i in 1..n {
    //     ps[i+1][1] = f[i][0];
    // }
    for i in 1..n {
        for j in 0..n {
            ps[i+1][j+1] = f[i][j] + ps[i+1][j] + ps[i][j+1] - ps[i][j];
        }
    }

    // println!("{:?}", ps);

    while q>0 {
        q-=1;
        let (mut s, mut e): ((usize, usize), (usize, usize)) = ((input!(it), input!(it)), (input!(it), input!(it)));
        // s.0-=1;
        // s.1-=1;
        // e.0-=1;
        // e.1-=1;
        // println!("{:?}, {:?}", s, e);
        let rtn = ps[e.0][e.1] + ps[s.0-1][s.1-1] - ps[e.0][s.1-1] - ps[s.0-1][e.1];
        println!("{} ", rtn);
    }
}


Test details

Test 1

Verdict:

input
10 100
**.*.*.**.
*.**.*..*.
.*****.**.
**....***.
...

correct output
10
14
5
7
8
...

user output
10 
14 



...
Truncated

Test 2

Verdict:

input
1000 200000
**.**.****..**.***..**.***.**....

correct output
41079
2824
15631
1548
8483
...

user output
41079 
2824 
15631 
1548 
8483 
...
Truncated

Test 3

Verdict:

input
1000 200000
******************************...

correct output
1000000
1000000
1000000
1000000
1000000
...

user output
999001 
999001 
999001 
999001 
999001 
...
Truncated