QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#424963 | #7859. Bladestorm | lmeowdn | ML | 8ms | 50736kb | C++14 | 3.6kb | 2024-05-29 20:15:17 | 2024-05-29 20:15:18 |
Judging History
answer
//Shirasu Azusa 2024.5
#include <bits/stdc++.h>
#define fi first
#define se second
#define eb emplace_back
#define mp make_pair
using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
template<class T,class S>
bool chmax(T &a,const S b) {return (a<b?a=b,1:0);}
template<class T,class S>
bool chmin(T &a,const S b) {return (a>b?a=b,1:0);}
int popcnt(int x) {return __builtin_popcount(x);}
int popcnt(ll x) {return __builtin_popcountll(x);}
int topbit(int x) {return (x==0?-1:31-__builtin_clz(x));}
int topbit(ll x) {return (x==0?-1:63-__builtin_clzll(x));}
int lowbit(int x) {return (x==0?-1:__builtin_ctz(x));}
int lowbit(ll x) {return (x==0?-1:__builtin_ctzll(x));}
#define int long long
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vp;
typedef tuple<int,int,int> tiii;
int read() {
int x=0,w=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
while(isdigit(c)) {x=x*10+(c-'0'); c=getchar();}
return x*w;
}
const int N=2e6+5;
int n,ls[N],rs[N],fa[N],sz[N],tag[N],f[N],g[N],rt,ans[N],a[N],k;
ull w[N];
vi e[N];
void add(int p,int z) {tag[p]+=z;}
void psd(int p) {tag[ls[p]]+=tag[p],tag[rs[p]]+=tag[p],g[p-1]+=tag[p],tag[p]=0;}
void psu(int p) {fa[ls[p]]=fa[rs[p]]=p,fa[p]=0,sz[p]=sz[ls[p]]+sz[rs[p]]+1;}
int merge(int x,int y) {
if(!x||!y) return x+y; psd(x), psd(y);
if(w[x]>w[y]) return rs[x]=merge(rs[x],y), psu(x), x;
else return ls[y]=merge(x,ls[y]), psu(y), y;
}
void split(int x,int k,int &l,int &r) {
if(!x) {l=r=0; return;} psd(x);
if(sz[ls[x]]+1>k) r=x, split(ls[x],k,l,ls[x]), psu(x);
else l=x, split(rs[x],k-sz[ls[x]]-1,rs[x],r), psu(x);
}
int getrk(int x) {
int res=sz[ls[x]]+1;
while(fa[x]) {
if(x==rs[fa[x]]) res+=sz[ls[fa[x]]]+1;
x=fa[x];
}
return res;
}
int qry(int x) {
int res=g[x]; x++;
while(x) res+=tag[x], x=fa[x];
return res;
}
void chgfa(int x,int y,int z) { //fa=x -> tag-z,fa=y
//cout<<"change father from "<<x<<" to "<<y<<", delta="<<z<<endl;
int px=getrk(x+1), qx=getrk(x+n+k+2);
//cout<<" "<<px<<" "<<qx<<endl;
if(px+1==qx) return;
int a,b,c; split(rt,px,a,b), split(b,qx-px-1,b,c);
rt=merge(a,c); add(b,z);
//cout<<"QWQ "<<a<<" "<<c<<endl;
int py=getrk(y+1); split(rt,py,a,c);
rt=merge(merge(a,b),c);
}
void dfs(int u) {
rt=merge(rt,u+1);
for(int v:e[u]) dfs(v);
rt=merge(rt,u+n+k+2);
}
void print() {
rep(i,1,2*n+4) {
cout<<"info of "<<i<<", "<<ls[i]<<" "<<rs[i]<<" "<<sz[i]<<" "<<fa[i]<<" "<<tag[i]<<endl;
}
}
void work() {
n=read(), k=read(); mt19937_64 rnd; rt=0;
rep(i,1,3*n) w[i]=rnd(), e[i].clear(), sz[i]=1;
rep(i,1,n) a[i]=read();
rep(i,n,n+k-1) f[i]=n+k, e[f[i]].eb(i);
rep(i,0,n-1) f[i]=i+k, e[f[i]].eb(i);
per(i,n+k-1,0) g[i]=g[f[i]]+1;
//rep(i,0,n) cout<<g[i]<<" "; puts("");
dfs(n+k);
//print();
set<int> q; rep(i,1,n) q.insert(i); q.insert(n+k), q.insert(0);
per(i,n,1) {
ans[i]=qry(0)-1; if(i==1) break;
int x=a[i]; auto it=q.lower_bound(x);
int l=*prev(it), r=*next(it); q.erase(it);
//cout<<"WORK "<<l<<" "<<x<<" "<<r<<endl;
int nw=qry(r); if(l+k<=x) chgfa(x,r,nw-qry(x));
rep(i,max(x+1,l+k),min(r-1,x-1+k)) chgfa(i,r,nw-qry(i));
//print();
}
rep(i,1,n) printf("%lld ",ans[i]); puts("");
rep(i,1,3*n) w[i]=ls[i]=rs[i]=tag[i]=f[i]=g[i]=fa[i]=ans[i]=sz[i]=a[i]=ans[i]=0, e[i].clear();
}
signed main() {
int T=read(); while(T--) work();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 8ms
memory: 50736kb
input:
3 7 2 4 7 3 6 1 2 5 11 3 10 7 4 9 6 8 5 1 3 2 11 9 2 1 2 3 7 8 9 4 5 6
output:
1 2 3 3 4 4 4 1 2 3 3 3 3 3 4 4 4 4 1 1 2 3 4 4 4 5 5
result:
ok 3 lines
Test #2:
score: -100
Memory Limit Exceeded
input:
40319 1 1 1 2 1 1 2 2 1 2 1 2 2 1 2 2 2 2 1 3 1 1 2 3 3 1 1 3 2 3 1 2 1 3 3 1 2 3 1 3 1 3 1 2 3 1 3 2 1 3 2 1 2 3 3 2 1 3 2 3 2 2 1 3 3 2 2 3 1 3 2 3 1 2 3 2 3 2 1 3 3 1 2 3 3 3 1 3 2 3 3 2 1 3 3 3 2 3 1 3 3 3 1 2 3 3 3 2 1 4 1 1 2 3 4 4 1 1 2 4 3 4 1 1 3 2 4 4 1 1 3 4 2 4 1 1 4 2 3 4 1 1 4 3 2 4 1 ...