QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#741895#6127. Kawa ExamACR01WA 488ms48348kbC++144.5kb2024-11-13 15:26:182024-11-13 15:26:44

Judging History

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

  • [2024-11-13 15:26:44]
  • 评测
  • 测评结果:WA
  • 用时:488ms
  • 内存:48348kb
  • [2024-11-13 15:26:18]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+5;
int n,m,a[N],b[N],allnum;
struct EDGE{int to,num;};
vector<EDGE> e[N],g[N];
vector<int> nd[N];
int cnt,tot,top;
int dfn[N],low[N],stk[N],col[N];
void Tarjan(int pos,int lst)
{
	allnum++;
	stk[++top]=pos;
	dfn[pos]=low[pos]=++cnt;
	for(int i=0;i<e[pos].size();i++)
	{
		int v=e[pos][i].to,num=e[pos][i].num;
		if((num^1)==lst) continue;
		if(!dfn[v]){
			Tarjan(v,num);
			low[pos]=min(low[pos],low[v]);
		}
		else if(!col[v]) low[pos]=min(low[pos],dfn[v]);
	}
	if(low[pos]==dfn[pos])
	{
		col[pos]=++tot;
		nd[tot].push_back(pos);
		while(stk[top]!=pos)
		{
			nd[tot].push_back(stk[top]);
			col[stk[top--]]=tot;
		}
		top--;
	}
}
bool used[N];
int ct,hs[N],sz[N],trk[N],rt[N],root;
void dfs1(int pos,int fa)
{
	rt[pos]=root;
	sz[pos]=nd[pos].size();
	dfn[pos]=++ct;
	trk[ct]=pos;
	for(int i=0;i<g[pos].size();i++)
	{
		int v=g[pos][i].to;
		if(v==fa) continue;
		dfs1(v,pos);
		sz[pos]+=sz[v];
		if(sz[hs[pos]]<sz[v]) hs[pos]=v;
	}
}
int nmx,mx[N],ctt[N];
int pla[N],ans[N];
bool vis[N];
void del(int col){
	if(pla[ctt[col]])pla[ctt[col]]--;
	ctt[col]--;
	pla[ctt[col]]++;
	if(pla[nmx]==0) nmx--;
}
void add(int col){
	if(pla[ctt[col]])pla[ctt[col]]--;
	ctt[col]++;
	if(ctt[col]>nmx) nmx=ctt[col];
	pla[ctt[col]]++;
}
int tt;
void dfs2(int pos,int fa,bool save)
{
	for(int i=0;i<g[pos].size();i++)
	{
		int v=g[pos][i].to;
		if(v==fa||v==hs[pos]) continue;
		dfs2(v,pos,false);
	} 
	if(hs[pos]) dfs2(hs[pos],pos,true);
	for(int i=0;i<g[pos].size();i++)
	{
		int v=g[pos][i].to;
		if(v==fa||v==hs[pos]) continue;
		for(int j=dfn[v];j<=dfn[v]+sz[v]-1;j++)
		{
			int now=trk[j];
			for(int k=0;k<nd[now].size();k++)
			{
				int col=a[nd[now][k]];
				add(col);
			}
		}
	}
	for(auto now:nd[pos])
	{
		int col=a[now];
		add(col);
	}
	mx[pos]=nmx;
	if(save==false){
		for(int i=dfn[pos];i<=dfn[pos]+sz[pos]-1;i++)
		{
			for(auto v:nd[trk[i]]){
				int col=a[v];
				del(col);
			}
		}
	}
}
void dfs3(int pos,int fa,bool save,int nm)
{
	vis[pos]=true;
	int ppk=0;
	for(int i=0;i<g[pos].size();i++)
	{
		int v=g[pos][i].to,num=g[pos][i].num;
		if(v==hs[pos]) ppk=num;
		if(v==fa||v==hs[pos]) continue;
		dfs3(v,pos,false,num);
	} 
	if(hs[pos])	dfs3(hs[pos],pos,true,ppk);
	for(int i=0;i<g[pos].size();i++)
	{
		int v=g[pos][i].to;
		if(v==fa||v==hs[pos]) continue;
		for(int j=dfn[v];j<=dfn[v]+sz[v]-1;j++)
		{
			int now=trk[j];
			for(int k=0;k<nd[now].size();k++)
			{
				int col=a[nd[now][k]];
				del(col);
			}
		}
	}
	for(auto now:nd[pos])
	{
		int col=a[now];
		del(col);
	}
	ans[nm]=nmx+mx[pos]+tt-mx[rt[root]];
	if(save==false){
		for(int i=dfn[pos];i<=dfn[pos]+sz[pos]-1;i++)
		{
			for(auto v:nd[trk[i]]){
				int col=a[v];
				add(col);
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++)
			cin>>a[i],b[i]=a[i];
		sort(b+1,b+n+1);
		int mm=unique(b+1,b+n+1)-b-1;
		for(int i=1;i<=n;i++)
			a[i]=lower_bound(b+1,b+mm+1,a[i])-b;
//		for(int i=1;i<=n;i++)
//			cout<<a[i]<<" ";
//		cout<<"***\n";
		cnt=tot=top=tt=root=ct=0;
		for(int i=0;i<=n;i++)
		{
			e[i].clear();
			g[i].clear();
			nd[i].clear();
			col[i]=dfn[i]=low[i]=stk[i]=sz[i]=0;
			hs[i]=trk[i]=rt[i]=mx[i]=ctt[i]=0;
			pla[i]=0;
			vis[i]=false;
		}
		for(int i=0;i<=m;i++)
			ans[i]=used[i]=0;
		for(int i=1;i<=m;i++)
		{
			int u,v;
			cin>>u>>v;
			e[u].push_back(EDGE{v,(i<<1)});
			e[v].push_back(EDGE{u,(i<<1)|1});
		}
		for(int i=1;i<=n;i++)
			if(!dfn[i]) Tarjan(i,0);
		for(int i=1;i<=n;i++)
		{
			for(int j=0;j<e[i].size();j++)
			{
				int v=e[i][j].to,num=e[i][j].num/2;
				if(col[v]==col[i]){
					used[num]=true;
					continue;
				}
				g[col[i]].push_back(EDGE{col[v],num});
			}
		}
		for(int i=1;i<=n;i++)
		{
			if(!sz[col[i]]){
				root=col[i];
				nmx=pla[0]=0;
				dfs1(col[i],0);
				dfs2(col[i],0,false);
				tt+=mx[col[i]];
			}
		}
		for(int i=1;i<=n;i++)
		{
			if(vis[col[i]]) continue;
			int now=col[i];
			pla[0]=0;
			nmx=0;
			for(int j=dfn[now];j<=dfn[now]+sz[now]-1;j++)
			{
				for(auto v:nd[trk[j]])
					add(a[v]);
			}
			dfs3(col[i],0,true,0);
		}
		for(int i=1;i<=m;i++)
		{
			if(used[i]==true) cout<<tt;
			else cout<<ans[i];
			if(i!=m) cout<<" ";
		}
		cout<<"\n";
	}
    return 0;
}
/*
1
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
*/

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 28144kb

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
Wrong Answer
time: 488ms
memory: 48348kb

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 8 6 6 9 6 6
3 3 3 5 5 3 3
10 10 10 10
10 10 10 8 9 8 10 8 9 9 11 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
18 17 17 18 17 18 17 17
15 10 15 13 17 16 10 10 10 10 10 10 10 17 15 10 10 10 10 15
17 9 9 9 17 16 9 9 9 9 1...

result:

wrong answer 2nd lines differ - expected: '6 6 7 6 6 6 6 6', found: '6 6 8 6 6 9 6 6'