Codeforces Round 1002 (Div. 2)

B. Cost of the Array

  • \(n\ne k\)时答案不是1就是2,看了半小时才看出来,唉……
#include <bits/stdc++.h>
using namespace std;
int a[200005],h[200005];
long long s[200005];
int ask(int n,int k)
{
	auto check=[](int x)
	{
		return s[x]-s[1]==x-1;
	};
	int p=partition_point(h+2,h+n+1,check)-h;
	if(p<=n&&n-p>=k-2)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		int n,k;
		cin>>n>>k;
		for(int i=1;i<=n;i++)
		{
			h[i]=i;
			cin>>a[i];
			s[i]=s[i-1]+a[i];
		}
		if(n==k)
		{
			int ans=n/2+1;
			for(int i=2;i<=n;i+=2)
			{
				if(a[i]!=i/2)
				{
					ans=i/2;
					break;
				}
			}
			cout<<ans<<"\n";
		}
		else if(ask(n,k)==0)
		{
			cout<<1<<"\n";
		}
		else
		{
			cout<<2<<"\n";
		}
	}
	return 0;
}

C. Customer Service

  • 假设这道题的条件没那么特殊,我觉得你也应该看出来这是一个【匹配】模型
#include <bits/stdc++.h>
using namespace std;
int a[305][305],p[305];
long long s[305][305];
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				cin>>a[i][j];
			}
			reverse(a[i]+1,a[i]+n+1);
			p[i]=0;
			for(int j=1;j<=n;j++)
			{
				s[i][j]=s[i][j-1]+a[i][j];
				if(s[i][j]==j)
				{
					p[i]++;
				}
				else
				{
					break;
				}
			}
			q.push(p[i]);
		}
		int ans=0;
		while(q.size())
		{
			int n1=q.top();
			q.pop();
			if(n1>=ans)
			{
				ans++;
			}
		}
		cout<<ans<<"\n";
	}
	return 0;
}

D. Graph and Graph

  • 这最短路模型也挺显然吧……还是在纸上推了一会儿才发现,或许是因为不太自信?
#include <bits/stdc++.h>
using namespace std;
vector<int>a1[1005],a2[1005];
bool b[1005][1005];
int n,d[1000005];
bool h[1000005];
typedef pair<int,int> c;
priority_queue<c,vector<c>,greater<c> >q;
void dijkstra(int s)
{
	while(q.size())
	{
		q.pop();
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			d[i*1000+j]=INT_MAX;
		}
	}
	d[s]=0;
	q.push(make_pair(0,s));
	while(q.size())
	{
		int n0=q.top().second;
		if(q.top().first!=d[n0])
		{
			q.pop();
			continue;
		}
		int n1=n0/1000,n2=n0%1000;
		if(n1==n2&&h[n1]==true)
		{
			cout<<q.top().first<<"\n";
			return;
		}
		q.pop();
		for(int i=0;i<a1[n1].size();i++)
		{
			for(int j=0;j<a2[n2].size();j++)
			{
				int t0,t1=a1[n1][i],t2=a2[n2][j];
				t0=t1*1000+t2;
				if(d[n0]+abs(t1-t2)<d[t0])
				{
					d[t0]=d[n0]+abs(t1-t2);
					q.push(make_pair(d[t0],t0));
				}
			}
		}
	}
	cout<<-1<<"\n";
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		int s1,s2;
		cin>>n>>s1>>s2;
		for(int i=0;i<n;i++)
		{
			h[i]=false;
			a1[i].clear();
			a2[i].clear();
			for(int j=0;j<n;j++)
			{
				b[i][j]=false;
			}
		}
		s1--;
		s2--;
		int m1,m2;
		cin>>m1;
		for(int i=1;i<=m1;i++)
		{
			int u,v;
			cin>>u>>v;
			u--;
			v--;
			a1[u].push_back(v);
			a1[v].push_back(u);
			b[u][v]=b[v][u]=true;
		}
		cin>>m2;
		for(int i=1;i<=m2;i++)
		{
			int u,v;
			cin>>u>>v;
			u--;
			v--;
			a2[u].push_back(v);
			a2[v].push_back(u);
			if(b[u][v]==true)
			{
				h[u]=h[v]=true;
			}
		}
		dijkstra(s1*1000+s2);
	}
	return 0;
}
posted @ 2025-02-06 21:56  D06  阅读(18)  评论(0)    收藏  举报
//雪花飘落效果