社区讨论
读错题+网络流==50分
P4093[HEOI2016/TJOI2016] 序列参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi7wwjpm
- 此快照首次捕获于
- 2025/11/21 04:57 4 个月前
- 此快照最后确认于
- 2025/11/21 04:57 4 个月前
rt
比赛时老师出这题
被我读错题还建图乱搞得了50分
有毒
CPP#include <cstdio>
#include <cstring>
using namespace std;
#define re register int
#define in inline
#define inf 99999999
#define maxn 100005
#define maxm 20000006
#define mod 100000
int n,m,s,t,tt;
int ans=0;
struct node{
int to,next,ti;
}bian[maxm];
int head[maxn];
int cnt=1;
int mx[maxn];
int mi[maxn];
int dui[maxn];
int dis[maxn];
int front,rear;
int ins[maxn];
in int min(int a,int b)
{
if(a<b) return a;
return b;
}
in int max(int a,int b)
{
if(a>b) return a;
return b;
}
in void add(int u,int v,int ti)
{
cnt++;
bian[cnt].to=v;
bian[cnt].ti=ti;
bian[cnt].next=head[u];
head[u]=cnt;
}
in int read()
{
int ans=0;
char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar()) ;
for(;ch>='0'&&ch<='9';ch=getchar()) ans=ans*10+ch-'0';
return ans;
}
void build()
{
re i,j;
for(i=1;i<=n;i++){
for(j=i+1;j<=n;j++) {
if(mx[i]<=mx[j]&&mi[i]<=mi[j]) {
add(i,j,-1);
}
}
}
for(i=1;i<=n;i++) add(s,i,-1),add(i,tt,0);
add(tt,t,0);
}
in bool spfa()
{
re i;
int u,v;
for(i=1;i<=n+3;i++) dis[i]=inf;
dis[s]=0;
front=1,rear=2;
dui[1]=s;
ins[s]=1;
while(front!=rear){
u=dui[front];
ins[u]=0;
for(i=head[u];i;i=bian[i].next){
v=bian[i].to;
if(dis[v]-dis[u]>bian[i].ti){
dis[v]=dis[u]+bian[i].ti;
if(!ins[v]) {
dui[rear]=v;
ins[v]=1;
rear++;
rear%=mod;
}
}
}
front++;
front%=mod;
}
if(dis[t]!=inf) return 1;
return 0;
}
int main()
{
//freopen("sequence.in","r",stdin);
//freopen("sequence.out","w",stdout);
n=read(),m=read();
re i;
for(i=1;i<=n;i++) mx[i]=read(),mi[i]=mx[i];
int x,y;
for(i=1;i<=m;i++){
x=read(),y=read();
mx[x]=max(mx[x],y);
mi[x]=min(mi[x],y);
}
s=n+1,t=n+2,tt=n+3;
build();
//while(spfa()) adjust();
//printf("%d\n",-ans);
spfa();
printf("%d\n",-dis[t]);
}
/*
3 4
1 2 3
1 2
2 3
2 1
3 4
*/
回复
共 2 条回复,欢迎继续交流。
正在加载回复...