首页 > 代码库 > 【NOIP 模拟赛】钟 模拟+链表

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

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[N],qian[N],hou[N],val[N],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;}

 

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