QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#540423 | #8939. Permutation | ucup-team635# | RE | 81ms | 2324kb | Rust | 4.4kb | 2024-08-31 17:00:53 | 2024-08-31 17:00:55 |
Judging History
answer
fn main() {
let t = read();
for _ in 0..t {
solve();
}
}
fn solve() {
let n = read();
//rand() % 10 + 2;
let mut solver = Oracle::new(n);
let mut l = 0;
let mut r = n;
while r - l >= 2 {
let x = solver.find(l, r);
if r - l == 2 {
l = l ^ x ^ (l + 1);
break;
}
if r - l == 3 {
if x == l {
if solver.find(l, l + 2) == x {
l = l + 1;
} else {
l = l + 2;
}
} else if x == l + 1 {
if solver.find(l, l + 2) == x {
// l = l;
} else {
l = r - 1;
}
} else {
if solver.find(l + 1, r) == x {
l = x - 1;
} else {
// l = l
}
}
break;
}
let p = [l, (3 * l + r) / 4, (l + r) / 2, (l + 3 * r) / 4, r];
let mut pos = p.iter().position(|p| x < *p).unwrap();
if pos <= 2 {
if solver.find(p[0], p[2]) == x {
if p[pos - 1] + 2 <= p[pos] {
if solver.find(p[pos - 1], p[pos]) == x {
} else {
if pos == 1 {
pos += 1;
} else {
pos -= 1;
}
}
l = p[pos - 1];
r = p[pos];
} else {
l = p[0];
r = p[2];
}
} else {
if solver.find(p[pos - 1], p[3]) == x {
pos = 3;
} else {
pos = 4;
}
l = p[pos - 1];
r = p[pos];
}
} else {
if solver.find(p[2], p[4]) == x {
if p[pos - 1] + 2 <= p[pos] {
if solver.find(p[pos - 1], p[pos]) == x {
} else {
if pos == 3 {
pos += 1;
} else {
pos -= 1;
}
}
l = p[pos - 1];
r = p[pos];
} else {
l = p[2];
r = p[4];
}
} else {
if solver.find(p[1], p[pos]) == x {
pos = 2;
} else {
pos = 1;
}
l = p[pos - 1];
r = p[pos];
}
}
}
if !solver.answer(l) {
println!("ERROR: {:?}", solver.p);
println!("{} {} {}", solver.sum, solver.cnt, l);
assert!(false);
}
}
fn read() -> usize {
let mut s = String::new();
std::io::stdin().read_line(&mut s).unwrap();
s.trim().parse().unwrap()
}
struct Oracle {
p: Vec<usize>,
sum: usize,
cnt: usize,
}
impl Oracle {
fn new(n: usize) -> Self {
let mut p = (0..n).collect::<Vec<_>>();
shuffle(&mut p);
Self { p, sum: 0, cnt: 0 }
}
fn find(&mut self, l: usize, r: usize) -> usize {
assert!(l + 2 <= r && r <= self.p.len(), "{l} {r}");
self.sum += r - l;
self.cnt += 1;
println!("? {} {}", l + 1, r);
read() - 1
/*
let mut x = (l..r).collect::<Vec<_>>();
x.sort_by_key(|x| self.p[*x]);
x[x.len() - 2]
*/
}
fn answer(&self, x: usize) -> bool {
println!("! {}", x + 1);
true
/*
let c = (1.5 * (self.p.len() as f64).log2()).ceil() as usize;
self.p[x] == self.p.len() - 1 && self.cnt <= c && self.sum <= 3 * self.p.len()
*/
}
}
fn rand_memory() -> usize {
Box::into_raw(Box::new("I hope this is a random number")) as usize
}
fn rand() -> usize {
static mut X: usize = 0;
unsafe {
if X == 0 {
X = rand_memory();
}
X ^= X << 13;
X ^= X >> 17;
X ^= X << 5;
X
}
}
fn shuffle<T>(a: &mut [T]) {
for i in 1..a.len() {
let p = rand() % (i + 1);
a.swap(i, p);
}
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 2324kb
input:
3 5 3 3 3 3 6 6 5 6 3 4 3 3 3
output:
? 1 5 ? 3 5 ? 3 5 ? 3 4 ! 4 ? 1 6 ? 4 6 ? 2 6 ? 2 3 ! 2 ? 1 4 ? 3 4 ? 3 4 ! 4
result:
ok Correct (3 test cases)
Test #2:
score: 0
Accepted
time: 81ms
memory: 2320kb
input:
10000 10 2 2 1 3 3 10 10 10 8 7 10 5 1 5 6 10 4 4 4 4 4 10 10 6 3 2 10 3 3 5 2 10 1 5 5 9 9 10 1 3 1 6 10 2 4 4 9 8 10 3 3 3 3 3 10 4 1 7 8 9 10 8 7 8 4 4 10 4 1 5 9 8 10 7 8 7 4 3 10 5 1 7 8 8 10 8 8 8 8 9 10 2 1 2 7 10 6 6 7 10 10 10 1 3 1 6 10 7 9 7 5 4 10 7 8 7 4 4 10 3 4 4 10 10 10 4 4 4 4 3 10...
output:
? 1 10 ? 1 5 ? 1 2 ? 3 5 ? 3 4 ! 4 ? 1 10 ? 6 10 ? 8 10 ? 6 7 ! 6 ? 1 10 ? 1 5 ? 3 7 ? 6 7 ! 7 ? 1 10 ? 1 5 ? 3 5 ? 3 5 ? 3 4 ! 3 ? 1 10 ? 6 10 ? 3 10 ? 1 2 ! 1 ? 1 10 ? 1 5 ? 3 5 ? 1 2 ! 1 ? 1 10 ? 1 5 ? 1 7 ? 8 10 ? 8 9 ! 8 ? 1 10 ? 1 5 ? 1 7 ? 6 7 ! 7 ? 1 10 ? 1 5 ? 1 7 ? 8 10 ? 8 9 ! 10 ? 1 10 ?...
result:
ok Correct (10000 test cases)
Test #3:
score: 0
Accepted
time: 49ms
memory: 2136kb
input:
10000 3 1 2 11 5 3 5 8 7 2 2 19 3 4 3 13 12 12 7 5 7 5 2 3 3 3 19 6 6 7 1 2 1 2 2 15 11 11 11 11 10 11 14 1 1 3 5 5 5 16 4 4 1 8 7 8 3 3 2 19 13 17 5 2 1 2 2 2 4 1 2 3 7 2 2 3 3 2 2 17 1 1 2 8 7 6 14 9 9 9 9 8 20 9 3 9 13 14 13 6 4 4 4 5 18 7 7 7 7 7 7 7 8 8 6 8 3 8 6 7 6 3 16 10 10 10 10 10 10 6 1 ...
output:
? 1 3 ? 1 2 ! 3 ? 1 11 ? 1 5 ? 3 8 ? 6 8 ? 7 8 ! 6 ? 1 2 ! 1 ? 1 19 ? 1 9 ? 1 14 ? 10 14 ? 12 14 ? 11 14 ! 10 ? 1 7 ? 4 7 ? 2 5 ? 2 3 ! 3 ? 1 3 ? 2 3 ! 2 ? 1 19 ? 1 9 ? 5 9 ? 1 4 ? 1 2 ? 1 3 ! 3 ? 1 2 ! 1 ? 1 15 ? 8 15 ? 8 11 ? 8 11 ? 10 11 ? 9 11 ! 9 ? 1 14 ? 1 7 ? 1 3 ? 4 7 ? 4 5 ? 4 5 ! 4 ? 1 16 ...
result:
ok Correct (10000 test cases)
Test #4:
score: 0
Accepted
time: 74ms
memory: 2108kb
input:
10000 47 23 23 19 11 9 11 5 5 14 8 8 8 8 9 25 6 12 6 13 13 13 13 7 4 4 4 4 9 2 2 2 2 27 27 27 27 27 24 27 23 21 7 7 6 5 5 5 5 43 41 37 21 7 8 5 1 22 6 4 14 20 20 20 21 34 29 25 29 17 17 17 17 16 42 20 20 20 20 20 19 17 16 47 21 21 21 21 21 22 19 19 41 25 25 30 33 34 33 36 36 19 17 17 16 12 13 12 21 ...
output:
? 1 47 ? 1 23 ? 12 23 ? 1 11 ? 6 11 ? 3 11 ? 3 5 ? 4 5 ! 4 ? 1 14 ? 8 14 ? 8 10 ? 8 10 ? 8 9 ! 10 ? 1 25 ? 1 12 ? 1 18 ? 13 18 ? 13 15 ? 13 15 ? 13 14 ! 14 ? 1 7 ? 4 7 ? 4 5 ? 4 5 ! 5 ? 1 9 ? 1 4 ? 1 2 ? 1 2 ! 1 ? 1 27 ? 14 27 ? 21 27 ? 21 27 ? 24 27 ? 22 27 ? 22 23 ! 22 ? 1 21 ? 1 10 ? 6 10 ? 1 5 ?...
result:
ok Correct (10000 test cases)
Test #5:
score: -100
Runtime Error
input:
10000 100 47 5 47 61 53 68 71 71 71 71 9 2 2 1 4 53 46 35 14 6 6 6 6 6 33 3 16 16 31 31 31 31 32 82 60 42 60 29 29 28 23 23 23 24 88 39 8 39 59 59 59 59 59 60 71 24 29 29 59 59 59 59 58 60 61 92 52 52 56 88 88 88 88 89 88 24 11 11 9 5 5 6 66 51 51 66 45 43 45 39 38 40 92 43 43 38 20 20 20 20 20 19 4...
output:
? 1 100 ? 1 50 ? 26 75 ? 51 75 ? 51 62 ? 57 68 ? 69 75 ? 69 71 ? 70 71 ? 70 71 ! 70 ? 1 9 ? 1 4 ? 1 2 ? 3 4 ! 3 ? 1 53 ? 27 53 ? 14 53 ? 1 13 ? 1 6 ? 4 6 ? 4 6 ? 5 6 ! 5 ? 1 33 ? 1 16 ? 1 24 ? 25 33 ? 29 33 ? 31 33 ? 31 33 ? 31 32 ! 33 ? 1 82 ? 42 82 ? 21 61 ? 21 41 ? 21 30 ? 26 30 ? 21 25 ? 23 25 ?...