您的位置:首页 > 其它

【NOIP 模拟赛】钟 模拟+链表

2017-08-13 19:18 381 查看
biubiu~~

这道题实际上就是优化模拟,就是找到最先死的让他死掉,运用时间上的加速,题解上说,要用堆优化,也就是这个意思。

对于链表,单项链表和循环链表都不常用,最常用的是双向链表,删除和插入比较方便。

所谓挂链就是把链表中的值域换成一坨别的东东西......

#include <cstdio>
inline void read(int &sum){
register char ch=getchar();bool symbol=0;
for(sum=0;ch<'0'||ch>'9';ch=getchar())if(ch=='-')symbol=1;
for(;ch>='0'&&ch<='9';sum=(sum<<1)+(sum<<3)+ch-'0',ch=getchar());
if(symbol)sum=-sum;
}
const int C=110;
const int N=1000100;
int fight[C][C],get[C][C][C];
int n,c;
int a
,qian
,hou
,val
,Num,size[C];
int main(){
read(c),read(n);
Num=c;
for(int i=1;i<=c;i++)
for(int j=1;j<=c;j++)
read(fight[i][j]);
for(int i=1;i<=n;i++)
read(a[i]),size[a[i]]++;
qian[1]=0,hou[0]=1;
for(int i=1;i<=n;i++)
qian[i+1]=i,hou[i]=i+1,val[i]=1;
for(int k=0;k<=c;k++)
for(int i=0;i<=c;i++)
for(int j=0;j<=c;j++)
get[k][i][j]=fight[k][i]+fight[k][j];
while(Num!=1){
for(int i=hou[0];i<=n;i=hou[i])
val[i]+=get[a[i]][a[qian[i]]][a[hou[i]]];
for(int i=hou[0];i<=n;i=hou[i])
if(val[i]<=0){
size[a[i]]--;
if(!size[a[i]])Num--;
qian[hou[i]]=qian[i];
hou[qian[i]]=hou[i];
}
}
printf("%d",a[hou[0]]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: