[留档]基础模板(持续更新中)
作者:互联网
\(\mathfrak{CSP-S\ 2020\ RP++}\)
\(\mathbb{CSP-S\ 2020\ RP++}\)
\(\mathcal{CSP-S\ 2020\ RP++}\)
\(\mathtt{CSP-S\ 2020\ RP++}\)
\(\mathsf{CSP-S\ 2020\ RP++}\)
\(\mathit{CSP-S\ 2020\ RP++}\)
快读
inline void Read(int &x){
int f=1;x=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-48;
c=getchar();
}
x*=f;
}
倍增LCA
int dep[N],f[N][20];
struct Edge {
int to,nxt;
}e[N<<1];
int head[N],cnt;
void ade(int u,int v){
e[++cnt].to=v,e[cnt].nxt=head[u],head[u]=cnt;
}
void DFS(int now,int ff){
dep[now]=dep[ff]+1;
f[now][0]=ff;
for(int i=1;i<=19;i++){
f[now][i]=f[f[now][i-1]][i-1];
}
for(int i=head[now];i;i=e[i].nxt){
int v=e[i].to;
if(v!=ff)DFS(v,now);
}
}
inline int LCA(int u,int v){
if(dep[u]<dep[v])swap(u,v);
for(int i=19;i>=0;i--){
if(dep[f[u][i]]>=dep[v])u=f[u][i];
}
if(u==v)return u;
for(int i=19;i>=0;i--){
if(f[u][i]!=f[v][i]){
u=f[u][i],v=f[v][i];
}
}
return f[u][0];
}
一个常数有一点大的高精
struct BigNumber {
int len,sgn;
string s;
BigNumber(string _s=""){
s=_s,len=_s.size(),sgn=1;
}
void Read(){
string _s;cin>>_s;
s=_s,len=s.size(),sgn=1;
}
void Erase(){
s.erase(0,s.find_first_not_of('0'));
if(s=="")s="0";
}
};
void Print(BigNumber a){
if(a.sgn==-1)putchar('-');
cout<<a.s<<endl;
}
bool operator < (BigNumber a,BigNumber b){
if(a.sgn!=b.sgn)return a.sgn<b.sgn;
if(a.len!=b.len)return a.len<b.len;
for(int i=0;i<a.len;i++){
if(a.s[i]!=b.s[i])return a.s[i]<b.s[i];
}
return 0;
}
bool operator == (BigNumber a,BigNumber b){
if(a.sgn!=b.sgn)return 0;
if(a.len==b.len){
for(int i=0;i<a.len;i++){
if(a.s[i]!=b.s[i])return 0;
}
return 1;
}
return 0;
}
BigNumber operator + (BigNumber a,BigNumber b){
BigNumber ans;
if(a.len<b.len)for(int i=0;i<b.len-a.len;i++)a.s="0"+a.s;
else if(b.len<a.len)for(int i=0;i<a.len-b.len;i++)b.s="0"+b.s;
int sum=0,up=0;
a.len=a.s.size(),b.len=b.s.size();
for(int i=a.len-1;i>=0;i--){
sum=a.s[i]+b.s[i]-96+up;
up=sum/10,sum%=10;
ans.s=(char)(sum+48)+ans.s;
}
if(up)ans.s=(char)(up+48)+ans.s;
ans.Erase(),ans.len=ans.s.size();
return ans;
}
BigNumber operator - (BigNumber a,BigNumber b){
BigNumber ans;
if(a<b){
swap(a,b),ans.sgn=-1;
}
int len=a.len-b.len,dn=0;
for(int i=b.len-1;i>=0;i--){
if(a.s[len+i]<b.s[i]+dn)ans.s=(char)(a.s[len+i]-b.s[i]-dn+58)+ans.s,dn=1;
else ans.s=(char)(a.s[len+i]-b.s[i]-dn+48)+ans.s,dn=0;
}
for(int i=len-1;i>=0;i--){
if(a.s[i]-'0'<dn)ans.s=(char)(a.s[i]-dn+10)+ans.s,dn=1;
else ans.s=(char)(a.s[i]-dn)+ans.s,dn=0;
}
ans.Erase();ans.len=ans.s.size();
return ans;
}
BigNumber operator * (BigNumber a,BigNumber b){
BigNumber ans;
for(int i=b.len-1;i>=0;i--){
BigNumber tmp;
int pro=0,up=0,now=b.s[i]-48;
if(now!=0){
for(int j=1;j<b.len-i;j++)tmp.s+="0";
for(int j=a.len-1;j>=0;j--){
pro=now*(a.s[j]-48)+up;
up=pro/10,pro%=10;
tmp.s=(char)(pro+48)+tmp.s;
}
if(up)tmp.s=(char)(up+48)+tmp.s;
tmp.len=tmp.s.size();
}
ans=ans+tmp;
}
ans.Erase(),ans.len=ans.s.size();
return ans;
}
BigNumber operator / (BigNumber a,BigNumber b){
BigNumber ans,tmp;
tmp.s.append(a.s,0,b.len-1),tmp.len=tmp.s.size();
for(int i=b.len-1;i<a.len;i++){
tmp.s+=a.s[i],tmp.Erase(),tmp.len=tmp.s.size();
for(char c='9';c>='0';c--){
BigNumber now,newans;
now.s+=c,now.len=1;
newans=now*b,newans.len=newans.s.size();
if(newans<tmp||newans==tmp){
ans.s+=c;
tmp=tmp-newans;
break;
}
}
}
ans.Erase(),ans.len=ans.s.size();
return ans;
}
int main(){
BigNumber a,b;
a.Read(),b.Read();
Print(a+b);
Print(a-b);
Print(a*b);
BigNumber q=a/b;
Print(q);
Print(a-b*q);
return 0;
}
Tarjan and Toposort
#define N 10010
#define M 100010
int n,m,num[N],ind[N],ans;
int dfn[N],low[N],tim;
int col[N],vis[N],tot;
int dis[N],f[N],topo[N],ctop;
vector<int>out[N],in[N];
//边表代码省略了
stack<int>s;
void Tarjan(int u){
dfn[u]=low[u]=++tim;
s.push(u),vis[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}else if(vis[v]){
low[u]=min(low[u],dfn[v]);
}
}
int v;
if(dfn[u]==low[u]){
tot++;
do {
v=s.top(),s.pop();
vis[v]=0,col[v]=tot;
dis[tot]+=num[v];
} while(u!=v);
}
}
void Toposort(){
queue<int>q;
for(int i=1;i<=tot;i++){
if(!ind[i])q.push(i);
}
while(!q.empty()){
int u=q.front();q.pop();
topo[++ctop]=u;
for(int i=0;i<out[u].size();i++){
int v=out[u][i];
if(!--ind[v])q.push(v);
}
}
}
int main(){
Read(n),Read(m);
for(int i=1;i<=n;i++)Read(num[i]);
//加边代码省略了
for(int i=1;i<=n;i++){
if(!dfn[i])Tarjan(i);
}
for(int i=1;i<=cnt;i++){
if(col[e[i].frm]!=col[e[i].to]){
int u=col[e[i].frm],v=col[e[i].to];
out[u].push_back(v);
in[v].push_back(u);
ind[v]++;
}
}
Toposort();
for(int i=1;i<=tot;i++){
int u=topo[i];
f[u]=dis[u];
for(int j=0;j<in[u].size();j++){
f[u]=max(f[u],f[in[u][j]]+dis[u]);
}
}
for(int i=1;i<=tot;i++){
ans=max(ans,f[i]);
}
cout<<ans<<endl;
return 0;
}
Dijkstra
#define N 100010
int n,m,s,dis[N];
bool vis[N];
//边表代码省略了
struct Node {
int idx;
int dis;
};
bool operator < (Node a,Node b){
return a.dis>b.dis;//STL默认大根堆,所以要反过来
}
priority_queue<Node>q;
void Dijkstra(){
dis[s]=0,q.push((Node){s,0});
while(!q.empty()){
Node tmp=q.top();q.pop();
int u=tmp.idx;
if(!vis[u]){
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].wei;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v]){
q.push((Node){v,dis[v]});
}
}
}
}
}
}
int main(){
Read(n),Read(m),Read(s);
for(int i=1;i<=n;i++)dis[i]=0x7fffffff;
//加边代码省略了
Dijkstra();
for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
return 0;
}
死了的SPFA
void SPFA(){
queue<int>q;
for(int i=1;i<=n;i++)dis[i]=0x7fffffff;
dis[s]=0,q.push(s),vis[s]=1;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].wei;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v]){
q.push(v),vis[v]=1;
}
}
}
}
}
标签:tmp,BigNumber,int,留档,更新,len,ans,模板,dis 来源: https://www.cnblogs.com/juruoajh/p/13933615.html