模板練習 LUOGU

2022-07-12 07:54:11 字數 2061 閱讀 8252

p3183食物鏈

#define man 300050

int fa[man],opt,x,y,fx,fy,n,k,ans=0

;int find(int

x)int

main()

if(opt==1

)

//y是x的獵物或者天敵,謊言

fa[find(x)]=find(y);//

x的同類是y的同類

fa[find(x+n)]=find(y+n);//

x的獵物是y的獵物

fa[find(x+n+n)]=find(y+n+n);//

x的天敵是y的天敵

}

else

if(opt==2

)

//x是y的同類或者y是x的天敵,謊言

fa[find(x)]=find(y+n+n);//

y的天敵是x

fa[find(x+n)]=find(y);//

x的獵物是y

fa[find(x+n+n)]=find(y+n);//

x的天敵是y的獵物(由迴圈關係可得)

} }

cout

return0;

}

p1638逛畫展

int

n,m;

int pos[2050];//

第i個畫師的最後出現的下標

int pic[1000050];//

畫作int cnt,l=1;//

已經出現的畫師的數量及不斷更新的左端點

int ml=0,mr=0,ans=1e9+7;//

最終答案的左右端點及區間的長度

intmain()

cout

<"

"return0;

}

3.差分約束

求最小值時用最長路,求最大值是用最短路

p3275 [scoi2011]糖果

#define man 1000050

intn,m;

struct edgee[man];

int head[man<<1],num=0

;inline

void add(int

from,int to,int

dis);

head[

from]=num;

}int

dis[man],vis[man],cnt[man];

inline

void spfa(int

s)

for(rint i=head[u];i;i=e[i].next)}}

}while

(q.size());

}int

main()

}for(rint i=n;i>=1;i--) add(0,i,1

); spfa(0);

long

long ans=0

;

for(rint i=1;i<=n;i++)

printf(

"%lld\n

",ans);

return0;

}

4.二分圖匹配

p2055 假期的宿舍

#define man 55

intt,n;

inta[man],b[man],c[man][man],tot,ans;

intused[man],link[man];

bool find(int

s) }

}return0;

}int

main()

ans=0,tot=0

;

for(rint i=1;i<=n;i++)

}if(ans==tot) printf("

^_^\n");

else printf("

t_t\n");

}return0;

}

luogu 模板 分治 FFT

題目背景有提示啊。給定乙個陣列f ff,求gi j 1 igi jf jg i sum g f j gi j 1i gi j fj 考慮寫出g gg的生成函式。g x g x f x g 0 g x g x f x 1g x 1 1 f x beging x g x f x g 0 g x g x ...

LUOGU 3089 字尾排序(模板)

傳送門 這是乙個神奇的演算法,sa i 表示排名第i為的元素是啥,rk i 表示第i個元素排名是啥。然後使用基數排序 倍增的思想去處理。主要是參考的這位大佬的部落格 include include include include using namespace std const int maxn ...

luogu 3806 模板 點分治

給定一棵有n個點的樹,有m個詢問,每個詢問樹上距離為k的點對是否存在。樹的權值最多不超過c。n 10000,m 100,c 1000,k 10000000。關於樹的路徑的問題,點分治是一種最吼的工具。由於這道題的m比較小,列舉k,通過set儲存每顆子樹中點的路徑值,在set中查詢每個k值是否成立即可...