1. 程式人生 > >【NOIP 模擬賽】鐘 模擬+鏈表

【NOIP 模擬賽】鐘 模擬+鏈表

color blog 不常用 get 循環鏈表 fig problem bsp 常用

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 模擬賽】鐘 模擬+鏈表