QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#385851 | #6127. Kawa Exam | liyujiangwx | ML | 3ms | 29928kb | C++17 | 3.7kb | 2024-04-11 09:03:20 | 2024-04-11 09:03:20 |
Judging History
answer
#include<bits/stdc++.h>
#define rs now<<1|1
#define ls now<<1
using namespace std;
inline int read(){
int x=0,f=0;
char c=getchar();
while(c<'0'||c>'9'){f|=(c=='-');c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return f?-x:x;
}
const int N=3e5+10;
const int Max=3e5+10;
struct edge{
int to,ne,id;
edge(int to=0,int ne=0,int id=0):
to(to),ne(ne),id(id){;}
}a[Max<<1];
int h[N],cnt=1,tot,dfn[N],idx,low[N],stk[N],col[N],ans[N],res;
int top,n,m,T,bel[N],fr[N],to[N],siz[N],son[N],Son,ys[N],Tot;
vector < int > vec[N];
struct SegmentTree{
int maxx[N<<2];
void pushup(int now){maxx[now]=max(maxx[ls],maxx[rs]);};
void build(int now,int l,int r){
maxx[now]=0;
if(l==r) return ;
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
}
void update(int now,int l,int r,int to,int v){
if(l==r) {
maxx[now]+=v;
return ;
}
int mid=(l+r)>>1;
if(mid>=to) update(ls,l,mid,to,v);
else update(rs,mid+1,r,to,v);
pushup(now);
}
int get(){return maxx[1];}
void clear(){build(1,1,Tot+5);}
void change(int to,int v){update(1,1,Tot+5,to,v);}
}val,rev;
void clear(){
val.clear();rev.clear();
for(int i=1;i<=m;++i) ans[i]=0;
for(int i=1;i<=cnt;++i) a[i]=edge();
for(int i=1;i<=tot;++i) vec[i].clear();
for(int i=1;i<=n+tot;++i) dfn[i]=low[i]=h[i]=siz[i]=son[i]=0;
cnt=1;Tot=idx=top=tot=res=Son=0;
}
void Add(int x,int y,int z){
a[++cnt]=edge(y,h[x],z);
h[x]=cnt;
}
void tarjan(int x,int las){
dfn[x]=low[x]=++idx;
stk[++top]=x;
for(int i=h[x];i;i=a[i].ne){
if((las^1)==i) continue;
if(!dfn[a[i].to]) {
tarjan(a[i].to,i);
low[x]=min(low[x],low[a[i].to]);
}else low[x]=min(low[x],dfn[a[i].to]);
}
if(dfn[x]==low[x]){
++tot;
while(stk[top+1]!=x) vec[tot].emplace_back(stk[top--]);
}
}
void dfs1(int x,int y){
siz[x]=vec[x-n].size();
for(int i=h[x];i;i=a[i].ne) {
if(a[i].to==y) continue;
dfs1(a[i].to,x);
siz[x]+=siz[a[i].to];
son[x]=siz[son[x]]>siz[a[i].to]?son[x]:a[i].to;
}
}
void ad(int x){val.change(x,1);rev.change(x,-1);}
void del(int x){val.change(x,-1);rev.change(x,1);}
void adds(int x,int y,int opt){
for(auto i:vec[x-n])
if(opt) ad(col[i]);
else del(col[i]);
for(int i=h[x];i;i=a[i].ne) if(a[i].to!=y&&a[i].to!=Son) adds(a[i].to,x,opt);
}
void dfs2(int x,int y,int opt,int down){
int fa=0;
for(int i=h[x];i;i=a[i].ne) {
if(a[i].to!=son[x]&&a[i].to!=y) dfs2(a[i].to,x,0,down);
else if(a[i].to==y) fa=a[i].id;
}
if(son[x]){
dfs2(son[x],x,1,down);
Son=son[x];
}
adds(x,y,1);
ans[fa]=val.get()+rev.get()-down;
if(!opt){Son=0;adds(x,y,0);}
}
void dfs3(int x,int y,int opt){
for(auto i:vec[x-n]) {
int tmp=col[i];
if(opt) rev.change(tmp,1);
else rev.change(tmp,-1);
}
for(int i=h[x];i;i=a[i].ne) if(a[i].to!=y) dfs3(a[i].to,x,opt);
}
int main(){
T=read();
while(T--){
n=read();m=read();
for(int i=1;i<=n;++i) ys[++Tot]=col[i]=read();
sort(ys+1,ys+1+Tot);Tot=unique(ys+1,ys+1+Tot)-ys-1;
for(int i=1;i<=n;++i) col[i]=lower_bound(ys+1,ys+1+Tot,col[i])-ys;
for(int i=1,x,y;i<=m;++i){
fr[i]=x=read();
to[i]=y=read();
Add(x,y,i);
Add(y,x,i);
}
for(int i=1;i<=n;++i) if(!dfn[i]) tarjan(i,cnt<<2);
for(int i=1;i<=tot;++i) for(auto j:vec[i]) bel[j]=i+n;
for(int i=1;i<=m;++i)
if(bel[fr[i]]!=bel[to[i]]) {
Add(bel[fr[i]],bel[to[i]],i);
Add(bel[to[i]],bel[fr[i]],i);
}
for(int i=n+1;i<=n+tot;++i)
if(!siz[i]) {
dfs1(i,0);
dfs3(i,0,1);
int tmp=rev.get();
res+=tmp;
dfs2(i,0,0,tmp);
dfs3(i,0,0);
}
for(int i=1;i<=m;++i) {
printf("%d",ans[i]+res);
if(i!=m) putchar(' ');
}
if(T) putchar('\n');
clear();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 3ms
memory: 29928kb
input:
3 7 5 1 2 1 2 1 2 1 1 2 1 3 2 4 5 6 5 7 3 3 1 2 3 1 2 1 3 2 3 2 3 12345 54321 1 2 1 2 1 1
output:
6 5 5 5 4 1 1 1 1 1 1
result:
ok 3 lines
Test #2:
score: -100
Memory Limit Exceeded
input:
5557 2 7 79960 79960 2 2 1 1 1 1 2 2 1 1 2 1 1 2 9 8 21881 70740 70740 21881 22458 22458 639 21881 70740 3 3 1 6 5 8 7 5 5 7 2 3 5 1 7 6 6 7 13064 20716 6746 13064 6746 69225 5 5 4 1 4 1 1 6 4 5 3 2 3 2 8 4 45146 14400 45146 45146 14400 72969 14400 45146 8 6 1 3 4 6 8 3 18 13 48132 37949 92338 92338...
output:
2 2 2 2 2 2 2 6 6 7 6 6 6 6 6 3 3 3 4 4 3 3 7 7 7 7 9 9 9 8 9 8 9 8 9 9 10 9 9 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 9 10 9 16 16 16 16 16 17 16 16 10 10 11 10 12 11 10 10 10 10 10 10 10 12 10 10 10 10 10 11 10 9 9 9 9 9 9 9 9 9 9 9 9 9 10 ...