QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#785102 | #6127. Kawa Exam | wallace114514 | TL | 0ms | 78120kb | C++14 | 4.1kb | 2024-11-26 16:52:06 | 2024-11-26 16:52:08 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m,low[N],dfn[N],tarjan_index,col[N],cnt,maxn=0,a[N];
int u[N],v[N];
int num[N],siz[N],son[N],fa[N],temp_cnt[N],res[N];
int id[N],l[N],r[N],new_index,ans[N];
vector<pair<int,int>> g[N],mp[N];
vector<int> new_g[N];
stack<int> st;
struct seg_tree{
int val[N<<2];
void update(int rt,int l,int r,int pos,int x) {
if(l==r) {val[rt]+=x;return;}
int mid=(l+r)>>1;
if(pos<=mid) update(rt*2,l,mid,pos,x);
else update(rt*2+1,mid+1,r,pos,x);
val[rt]=max(val[rt*2],val[rt*2+1]);
}
}In,Out;
void tarjan(int x,int last) {
dfn[x]=low[x]=++tarjan_index;
st.push(x);
for(int i=0;i<g[x].size();i++) {
if(g[x][i].second==last) continue;
if(!dfn[g[x][i].first]) {
tarjan(g[x][i].first,g[x][i].second);
low[x]=min(low[x],low[g[x][i].first]);
}else low[x]=min(low[x],dfn[g[x][i].first]);
}
if(dfn[x]==low[x]) {
cnt++;
col[x]=cnt;
temp_cnt[a[x]]++;
mp[cnt].push_back({a[x],1});
while(st.top()!=x) {
if(!temp_cnt[a[st.top()]]) mp[cnt].push_back({a[st.top()],temp_cnt[a[st.top()]]});
temp_cnt[a[st.top()]]++;
col[st.top()]=cnt;
st.pop();
}
for(int i=0;i<mp[cnt].size();i++) {
mp[cnt][i].second=temp_cnt[mp[cnt][i].first];
temp_cnt[mp[cnt][i].first]=0;
}
st.pop();
}
}
void dfs1(int x,int last) {
for(int i=0;i<mp[x].size();i++) {
Out.update(1,1,maxn,mp[x][i].first,mp[x][i].second);
}
siz[x]=1;son[x]=0;fa[x]=last;
l[x]=++new_index;id[new_index]=x;
for(int i=0;i<new_g[x].size();i++) {
if(new_g[x][i]==last) continue;
dfs1(new_g[x][i],x);
if(siz[new_g[x][i]]>siz[son[x]])
son[x]=new_g[x][i];
siz[x]+=siz[new_g[x][i]];
}r[x]=new_index;
}
void dfs2(int x) {
ans[x]=-Out.val[1];
for(int i=0;i<new_g[x].size();i++) {
if(new_g[x][i]==son[x]||new_g[x][i]==fa[x]) continue;
dfs2(new_g[x][i]);
int v=new_g[x][i];
for(int j=l[v];j<=r[v];j++) {
for(int k=0;k<mp[id[j]].size();k++) {
In.update(1,1,maxn,mp[id[j]][k].first,-mp[id[j]][k].second);
Out.update(1,1,maxn,mp[id[j]][k].first,mp[id[j]][k].second);
}
}
}
if(son[x]) {dfs2(son[x]);}
for(int i=0;i<new_g[x].size();i++) {
if(new_g[x][i]==son[x]||new_g[x][i]==fa[x]) continue;
int v=new_g[x][i];
for(int j=l[v];j<=r[v];j++) {
for(int k=0;k<mp[id[j]].size();k++) {
In.update(1,1,maxn,mp[id[j]][k].first,mp[id[j]][k].second);
Out.update(1,1,maxn,mp[id[j]][k].first,-mp[id[j]][k].second);
}
}
}
for(int i=0;i<mp[x].size();i++) {
In.update(1,1,maxn,mp[x][i].first,mp[x][i].second);
Out.update(1,1,maxn,mp[x][i].first,-mp[x][i].second);
}
ans[x]+=In.val[1]+Out.val[1];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
memset(In.val,0,sizeof(In.val));
int t;
cin>>t;
while(t--) {
cin>>n>>m;
new_index=cnt=tarjan_index=maxn=0;
for(int i=1;i<=n;i++) {
cin>>a[i];
low[i]=dfn[i]=l[i]=0;
maxn=max(maxn,a[i]);
g[i].clear();
new_g[i].clear();
mp[i].clear();
}
for(int i=1;i<=m;i++) {
cin>>u[i]>>v[i];
g[u[i]].push_back({v[i],i});
g[v[i]].push_back({u[i],i});
}
for(int i=1;i<=n;i++) {
if(!dfn[i]) tarjan(i,0);
}
for(int i=1;i<=m;i++) {
if(col[u[i]]!=col[v[i]]) {
new_g[col[u[i]]].push_back(col[v[i]]);
new_g[col[v[i]]].push_back(col[u[i]]);
}
}
int sum=0;
for(int i=1;i<=cnt;i++) {
if(!l[i]) {
dfs1(i,i);
sum+=Out.val[1];
dfs2(i);
for(int j=1;j<=(maxn<<2);j++)
In.val[j]=Out.val[j]=0;
}
}
for(int i=1;i<=m;i++) {
if(col[u[i]]==col[v[i]]) {res[i]=sum;}
else {
res[i]=sum;
if(fa[col[u[i]]]==col[v[i]]) res[i]+=ans[col[u[i]]];
else res[i]+=ans[col[v[i]]];
}
}
for(int i=1;i<=m;i++) {
cout<<res[i];
if(i!=m) cout<<' ';
}
cout<<'\n';
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 78120kb
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
Time 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 7 8 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 ...