QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#785102#6127. Kawa Examwallace114514TL 0ms78120kbC++144.1kb2024-11-26 16:52:062024-11-26 16:52:08

Judging History

你现在查看的是最新测评结果

  • [2024-11-26 16:52:08]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:78120kb
  • [2024-11-26 16:52:06]
  • 提交

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;
}

Details

Tip: Click on the bar to expand more detailed information

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 ...

result: