专栏文章

6.3错题总结

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip4za2j
此快照首次捕获于
2025/12/03 06:15
3 个月前
此快照最后确认于
2025/12/03 06:15
3 个月前
查看原文

T3(P8893 「UOI-R1」智能推荐)

考试思路:dfs从k开始,如果能做第参数题,就标记,不能就看还要做第几题才能做

考试代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int n,k,p,r,ans;
vector<int>e[5005];
bool vis[5005],flag;
void dfs(int x)
{
	if(vis[x]==1)
		return ;
	if(e[x].size()==0)
	{
		flag=1;
		return ;
	}
	bool s=0;
	for(int i=0;i<e[x].size();i++)
		if(vis[e[x][i]]==0)
			dfs(e[x][i]),s=1;
	if(s==0)
	{
		vis[x]=1;
		ans++;
		return ;
	}
	for(int i=0;i<e[x].size();i++)
		if(vis[e[x][i]]==0)
			s=0;
	if(s==0)
		flag=1;
	else
	{
		vis[x]=1;
		ans++;
	}
	return ;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>k>>p;
	for(int i=1;i<=p;i++)
	{
		int x;
		cin>>x;
		vis[x]=1;
	}
	cin>>r;
	for(int i=1;i<=r;i++)
	{
		int s,m;
		cin>>s>>m;
		for(int j=1;j<=m;j++)
		{
			int x;
			cin>>x;
			e[s].push_back(x);
		}
	}
	dfs(k);
	if(flag==1)
		cout<<"-1\n";
	else
		cout<<ans;
	return 0;
}

错误原因:算法都搞错了

正确思路:拓扑+dp

正确代码:
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int n,m,p,in[N],dp[N];
vector<int>v[N];
queue<int>q;
bool vis[N];
void topu()
{
	while(!q.empty())
    {
		int x=q.front();
		q.pop();
		for(int i=0;i<v[x].size();i++)
        {
			int y=v[x][i];	
			in[y]--;
			if(in[y]==0)
            {
				if(!vis[y])
					dp[y]=max(dp[y],dp[x]+1);
				q.push(y);
			}
		}
	}
}
int main()
{
	cin>>n>>m>>p;
	for(int i=1;i<=p;i++)
    {
		int x;
		cin>>x;
		q.push(x);
		vis[x]=1;
	}
	int r;
	cin>>r;
	for(int i=1;i<=r;i++)
    {
		int id,x;
		cin>>id>>x;
		for(int j=1;j<=x;j++)
        {
			int x1;
			cin>>x1;
			v[x1].push_back(id);
			in[id]++;
		}
	}
	topu();
    if(dp[m]<=0)
    {
        cout<<-1<<endl;
        return 0;
    }
	cout<<dp[m]<<endl;
    return 0;
}

T4(P3948 数据结构)

考试思路:骗分

考试代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int n,opt,mod,mn,mx;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>opt>>mod>>mn>>mx;
	if(mod==2)
	{
		while(opt--)
		{
			char a;
			int l,r,x;
			cin>>a>>l>>r;
			if(a=='Q')
				cout<<r-l+1<<'\n';
			else
				cin>>x;
		}
		cin>>opt;
		while(opt--)
		{
			int l,r;
			cin>>l>>r;
			cout<<r-l+1<<'\n';
		}
	}
	else
		cout<<-1;
	return 0;
}

错误原因:题面太唬人,给吓倒了

正确思路:差分,如果询问,就转前缀再判断

正确代码:
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[80010],b[80010],sum[80010],ans,now,n,opt,mod,mn,mx,l,r,x,f;
char ch[5];
signed main()
{
	cin>>n>>opt>>mod>>mn>>mx;
	for(int j=1;j<=opt;j++)
	{
		cin>>ch>>l>>r;
		if(ch[0]=='A')
		{
			cin>>x;
			b[l]+=x;
			b[r+1]-=x;
		}
		else
		{
			ans=0;
			now=0;
			for(int i=1;i<=r;i++)
			{
				now+=b[i];
				if(i>=l&&(now*i)%mod>=mn&&(now*i)%mod<=mx)
					ans++;
			}
			cout<<ans<<'\n';
		}
	}
	cin>>f;
	for(int i=1;i<=n;i++)
	{
		a[i]=a[i-1]+b[i];
		if((a[i]*i)%mod>=mn&&(a[i]*i)%mod<=mx)
			sum[i]=sum[i-1]+1;
		else
			sum[i]=sum[i-1];
	}
	for(int j=1;j<=f;j++)
	{
		cin>>l>>r;
		cout<<sum[r]-sum[l-1]<<'\n';
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...