6.3错题总结
wangyichenawm · · 个人记录
T3(P8893 「UOI-R1」智能推荐)
考试思路:dfs从k开始,如果能做第参数题,就标记,不能就看还要做第几题才能做
考试代码:
#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
正确代码:
#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 数据结构)
考试思路:骗分
考试代码:
#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;
}
错误原因:题面太唬人,给吓倒了
正确思路:差分,如果询问,就转前缀再判断
正确代码:
#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;
}