QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#288016 | #7969. 套娃 | PYD1 | WA | 0ms | 12236kb | C++14 | 4.9kb | 2023-12-21 15:50:37 | 2023-12-21 15:50:37 |
Judging History
answer
#include <set>
#include <map>
#include <list>
#include <queue>
#include <cmath>
#include <time.h>
#include <random>
#include <bitset>
#include <vector>
#include <cstdio>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define mk make_pair
#define fi first
#define se second
inline int read(){
int t = 0,f = 1;
register char c = getchar();
while (c < 48 || c > 57) f = (c == '-') ? (-1) : (f),c = getchar();
while (c >= 48 && c <= 57) t = (t << 1) + (t << 3) + (c ^ 48),c = getchar();
return f * t;
}
const int N = 1e5 + 10,INF = 0x3f3f3f3f;
int n,v[N],ans[N];
struct Node{
int l,r;
bool operator < (const Node &rhs) const {return this->l != rhs.l ? this->l < rhs.l : this->r > rhs.r;}
}ns[N],tmp[N];
vector <int> vec[N];
struct DSU{
int fa[N];
void init(int n) {for (int i = 1;i <= n;i++) fa[i] = i;}
int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
void merge(int x,int y){
int a = find(x),b = find(y);
if (a != b) fa[a] = b;
}
}dsu;
struct Segment_tree{
int tag[N << 2],pmn[N << 2],resmn[N << 2];
void pushup(int i,int l,int r){
pmn[i] = min(pmn[i << 1],pmn[i << 1 | 1]);
resmn[i] = min(resmn[i << 1],resmn[i << 1 | 1]);
}
void spread(int i,int l,int r,int v) {tag[i] = pmn[i] = v,resmn[i] = l - v + 1;}
void pushdown(int i,int l,int r){
if (!tag[i]) return ;
int mid = (l + r) >> 1;
spread(i << 1,l,mid,tag[i]),spread(i << 1 | 1,mid + 1,r,tag[i]);
tag[i] = 0;
}
void build(int i,int l,int r){
tag[i] = 0;
if (l == r) {pmn[i] = i,resmn[i] = 1;return ;}
int mid = (l + r) >> 1;
build(i << 1,l,mid),build(i << 1 | 1,mid + 1,r);
pushup(i,l,r);
}
void modify(int i,int l,int r,int ql,int qr,int v){
if (l >= ql && r <= qr) {spread(i,l,r,v);return ;}
int mid = (l + r) >> 1;pushdown(i,l,r);
if (ql <= mid) modify(i << 1,l,mid,ql,qr,v);
if (qr > mid) modify(i << 1 | 1,mid + 1,r,ql,qr,v);
pushup(i,l,r);
}
int query(int i,int l,int r,int ql,int qr){
if (l >= ql && r <= qr) return resmn[i];
int mid = (l + r) >> 1,ans = INF;pushdown(i,l,r);
if (ql <= mid) ans = min(ans,query(i << 1,l,mid,ql,qr));
if (qr > mid) ans = min(ans,query(i << 1 | 1,mid + 1,r,ql,qr));
return ans;
}
int bs(int i,int l,int r,int ql,int qr,int v){
if (r < ql || l > qr) return INF;
if (l == r) return pmn[i] > v ? l : INF;
int mid = (l + r) >> 1;
if (qr > mid){
if (pmn[i << 1 | 1] > v) return min(mid + 1,bs(i << 1,l,mid,ql,qr,v));
else return bs(i << 1 | 1,mid + 1,r,ql,qr,v);
}
return bs(i << 1,l,mid,ql,qr,v);
}
}TR;
int change(int p,int v){
if (ans[p] != -1) return dsu.find(p);
ans[p] = v,dsu.merge(p,p + 1);
return dsu.find(p);
}
void upd(int x,int m){
printf("upd(%d)\n",x);
if (!m){
int cur = 1;
while (cur <= n) cur = change(cur,x);
return ;
}
sort(ns + 1,ns + m + 1);
int tmpcnt = 0,ncnt = 0;Node cur = (Node){-1,-1};
for (int i = 1;i <= m;i++){
if (cur.l == -1) cur = ns[i];
else if (ns[i].l > cur.r) tmp[++tmpcnt] = cur,cur = ns[i];
else cur.l = min(cur.l,ns[i].l),cur.r = max(cur.r,ns[i].r);
}
tmp[++tmpcnt] = cur;
sort(tmp + 1,tmp + tmpcnt + 1);
puts("tmp:");
for (int i = 1;i <= tmpcnt;i++) printf("(%d,%d)\n",tmp[i].l,tmp[i].r);
int lst = 0;
for (int i = 1;i <= tmpcnt;i++){
if (lst + 1 < tmp[i].l) ns[++ncnt] = (Node){lst + 1,tmp[i].l - 1};
lst = tmp[i].r;
}
if (lst + 1 <= n) ns[++ncnt] = (Node){lst + 1,n};
puts("ns:");
for (int i = 1;i <= ncnt;i++) printf("(%d,%d)\n",ns[i].l,ns[i].r);
for (int i = 1;i <= ncnt;i++){
int cur = ns[i].l;
while (cur <= ns[i].r) cur = change(cur,x);
}
}
void solve(int x){
printf("solve(%d)\n",x);
int lst = 0,ncnt = 0;
for (int p : vec[x]){
if (lst + 1 <= p - 1){
int l = TR.query(1,1,n,lst + 1,p - 1),r = p - lst - 1;
if (l <= r) ns[++ncnt] = (Node){l,r};
}
lst = p;
}
if (lst + 1 <= n){
int l = TR.query(1,1,n,lst + 1,n),r = n - lst;
if (l <= r) ns[++ncnt] = (Node){l,r};
}
for (int i = 1;i <= ncnt;i++){
printf("(%d,%d)\n",ns[i].l,ns[i].r);
}
upd(x,ncnt);
lst = 0;int lstv = -INF;
for (int p : vec[x]){
if (lst + 1 <= p - 1){
int l = TR.bs(1,1,n,lst + 1,p - 1,lstv),r = p - 1;
if (l <= r) TR.modify(1,1,n,l,r,lstv);
}
lst = lstv = p;
}
if (lst + 1 <= n){
int l = TR.bs(1,1,n,lst + 1,n,lstv),r = n;
if (l <= r) TR.modify(1,1,n,l,r,lstv);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
#endif
n = read();
for (int i = 1;i <= n;i++) vec[v[i] = read()].emplace_back(i);
TR.build(1,1,n),dsu.init(n + 1),memset(ans,-1,sizeof(ans));
for (int i = 0;i <= n;i++){
solve(i);
}
for (int i = 1;i <= n;i++) printf("%d ",ans[i]);puts("");
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 12236kb
input:
6 0 0 0 1 2 3
output:
solve(0) (1,3) upd(0) tmp: (1,3) ns: (4,6) solve(1) (1,3) upd(1) tmp: (1,3) ns: (4,6) solve(2) (2,4) upd(2) tmp: (2,4) ns: (1,1) (5,6) solve(3) (3,5) upd(3) tmp: (3,5) ns: (1,2) (6,6) solve(4) (4,6) upd(4) tmp: (4,6) ns: (1,3) solve(5) upd(5) solve(6) upd(6) 2 3 4 0 0 0
result:
wrong answer 1st lines differ - expected: '2 3 4 0 0 0', found: 'solve(0)'