p3183食物鏈
#define man 300050int 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逛畫展
intn,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 1000050intn,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 55intt,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值是否成立即可...