A、Border

给你一堆数字,你可以从这些数字取出任意多个组合成一个新的数字,问你这个新的数字在k进制下的最后一位一共有多少种情况

首先考虑k进制下的最后一位是这个数字对k取余,然后有一个扩展贝祖定理:

a1x1+...+anxn=d*gcd(a1...an)

其中d是正整数

那么把gcd求出来然后算20000次倍数丢进set即可

代码:

#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=500005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
bool bigeql(db a,db b){if(a>b||fabs(a-b)<=eps)return true;return false;}
bool eql(db a,db b){if(fabs(a-b)<eps) return 1;return 0;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}
inline int read(){char ch=getchar();int s=0,w=1;while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}while(ch>=48&&ch<=57){s=(s<<1)+(s<<3)+ch-48;ch=getchar();}return s*w;
}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+48);
}
int gcd(int a, int b){if(a==0) return b;if(b==0) return a;if(!(a&1)&&!(b&1)) return gcd(a>>1,b>>1)<<1;else if(!(b&1)) return gcd(a,b>>1);else if(!(a&1)) return gcd(a>>1,b);else return gcd(abs(a-b),min(a,b));
}
int lcm(int x,int y){return x*y/gcd(x,y);}int n,k,a[maxn];
set<int> s;signed main(){ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>k;cin>>a[1];int g=a[1];re(i,2,n) cin>>a[i],g=gcd(g,a[i]);for(int i=1;i<=200000;++i)s.insert((g*i)%k);cout<<s.size()<<endl;for(auto i=s.begin();i!=s.end();++i)cout<<*i<<' ';return 0;
}

B、 Sum in the tree

给你一棵树,每个点有点权a,同时给定从根节点到该节点所有点权a的和s

现在把某些s擦除了,需要你重建树使得a的和最小,不能重建输出-1,点权必须大于等于0

输出-1的条件很好说,如果父节点的s小于当前节点s,输出-1

简单的贪心做法是能填0则填0,然后递归地计算儿子

但是这样的做法有个问题,如果你在当前层填了0,那么可能在儿子上会产生额外消耗,看一个样例:

5

1 2 2 3

1 -1 2 3 -1

这里如果把三号节点填上0,那么四号和五号节点的a总和是3,但是如果三号节点填上1,四号和五号节点的总和是1

这意味着我们在填数字的时候应该尽量令父节点的a值更大,那么才有可能使得儿子的a值更小

需要知道儿子数量不会比1小

代码:

#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=500005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
bool bigeql(db a,db b){if(a>b||fabs(a-b)<=eps)return true;return false;}
bool eql(db a,db b){if(fabs(a-b)<eps) return 1;return 0;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}
inline int read(){char ch=getchar();int s=0,w=1;while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}while(ch>=48&&ch<=57){s=(s<<1)+(s<<3)+ch-48;ch=getchar();}return s*w;
}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+48);
}
int gcd(int a, int b){if(a==0) return b;if(b==0) return a;if(!(a&1)&&!(b&1)) return gcd(a>>1,b>>1)<<1;else if(!(b&1)) return gcd(a,b>>1);else if(!(a&1)) return gcd(a>>1,b);else return gcd(abs(a-b),min(a,b));
}
int lcm(int x,int y){return x*y/gcd(x,y);}int n;
int p[maxn],s[maxn],a[maxn];
vei g[maxn];
bool can=1;void dfs(int x,int f){if(!can) return;if(s[x]==-1){int mn=inf;fo(i,0,g[x].size()){if(g[x][i]!=f)mn=min(mn,s[g[x][i]]);}
//        cout<<mn<<endl;if(mn>s[f]&&mn!=inf)s[x]=mn,a[x]=mn-s[f];elses[x]=s[f],a[x]=0;}else{if(s[f]>s[x]){can=0;return;}else{a[x]=s[x]-s[f];}}fo(i,0,g[x].size()){if(g[x][i]!=f)dfs(g[x][i],x);}
}signed main(){ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0);p[1]=1;cin>>n;re(i,2,n) cin>>p[i],g[p[i]].pub(i);re(i,1,n) cin>>s[i];dfs(1,0);int ans=0;re(i,1,n) ans+=a[i];if(can) cout<<ans;else cout<<-1;return 0;
}

C、Substring Removal

签到,给你一个字符串,你需要删去一个连续子串使得剩下的串的字符集大小为1,保证原串至少有两种不同的字符

计算一下前缀最长字符集为1的子串和后缀最长字符集为1的子串,累加一下答案即可

注意特判一下前缀和后缀的字符一模一样的情况,乘法取个余即可

代码:

#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=500005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=998244353;
const db eps=1e-10;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
bool bigeql(db a,db b){if(a>b||fabs(a-b)<=eps)return true;return false;}
bool eql(db a,db b){if(fabs(a-b)<eps) return 1;return 0;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}
inline int read(){char ch=getchar();int s=0,w=1;while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}while(ch>=48&&ch<=57){s=(s<<1)+(s<<3)+ch-48;ch=getchar();}return s*w;
}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+48);
}
int gcd(int a, int b){if(a==0) return b;if(b==0) return a;if(!(a&1)&&!(b&1)) return gcd(a>>1,b>>1)<<1;else if(!(b&1)) return gcd(a,b>>1);else if(!(a&1)) return gcd(a>>1,b);else return gcd(abs(a-b),min(a,b));
}
int lcm(int x,int y){return x*y/gcd(x,y);}int n;
string s;signed main(){ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;cin>>s;s='#'+s;int c1=1,ans=0;char c=s[1];re(i,2,n){if(s[i]==c) c1++;else break;}int c2=1;c=s[n];rre(i,n-1,1){if(s[i]==c) c2++;else break; }ans=c1+c2;if(s[1]==s[n]){
//        cout<<"nmsl"<<endl;ans+=(c1*c2)%MOD;ans%=MOD;}ans+=1;cout<<ans;return 0;
}

D、Nature Reserve

给你平面上的一堆点,你需要找到一个圆使得这个圆与y=0至多只有一个交点,并且这个圆包含了所有的点

输出最小的半径,如果不存在这样的圆输出-1

考虑-1的情况,如果y=0两侧都有点则一定不可能,剩下的所有情况都可以画出一个巨型的圆使得它满足条件

现在可以二分圆的半径了

圆心位于y=R这条直线上,R是二分的半径,求出以所有点为圆心,R为半径的圆与y=R的交线,如果这些交线至少有一个公共交点,那么返回true

这个可能有点绕,考虑一个圆,半径为r包含了某个点的情况,那么圆心一定在以这个点为圆心,r为半径的圆里,画图康康就知道了

剩下的是计算交线的位置,维护左右区间即可,如下图:

 注意特判一下l小于0的情况

以及double的二分最好限定次数,每次令l=m或者r=m即可,不需加加减减

代码:

#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=500005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
//bool chk(int now){}
//int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
bool bigeql(db a,db b){if(a>b||fabs(a-b)<=eps)return true;return false;}
bool eql(db a,db b){if(fabs(a-b)<eps) return 1;return 0;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}
inline int read(){char ch=getchar();int s=0,w=1;while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}while(ch>=48&&ch<=57){s=(s<<1)+(s<<3)+ch-48;ch=getchar();}return s*w;
}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+48);
}
int gcd(int a, int b){if(a==0) return b;if(b==0) return a;if(!(a&1)&&!(b&1)) return gcd(a>>1,b>>1)<<1;else if(!(b&1)) return gcd(a,b>>1);else if(!(a&1)) return gcd(a>>1,b);else return gcd(abs(a-b),min(a,b));
}
int lcm(int x,int y){return x*y/gcd(x,y);}int n;
struct point{db x,y;void read(){cin>>x>>y;}
}p[maxn];bool chk(db R){db l=-inf,r=inf;re(i,1,n){db x=p[i].x,y=p[i].y;if(2*y*R-y*y<0.0) return 0;db len=sqrt(2*y*R-y*y);if(x-len>r||x+len<l) return 0;l=max(l,x-len),r=min(r,x+len);}
//    cout<<R<<" nmsl"<<endl;return 1;
}db half(db l,db r){int cnt=1000;while(cnt--){db m=(l+r)/2.0;if(chk(m)) r=m;else l=m;}return l;
}signed main(){ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0);cout<<fixed<<setprecision(10);cin>>n;bool neg=0,pos=0;re(i,1,n){p[i].read();if(p[i].y>0.0) pos=1;else neg=1;}if(pos&&neg){cout<<-1;return 0;}re(i,1,n){p[i].y=fabs(p[i].y);}db ans=half(0,1e17);
//    cout<<ans<<" nmsl"<<endl;cout<<ans;return 0;
}

E、Reachability from the Capital

一张有向图,给定起点,问你最少需要加多少条边使得从s可以抵达所有的城市

SALA第一场的原题,只要先缩点然后考虑入度为0的且不为起点的点有几个就完事了

代码:

#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=5005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}
inline int read(){char ch=getchar();int s=0,w=1;while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}while(ch>=48&&ch<=57){s=(s<<1)+(s<<3)+ch-48;ch=getchar();}return s*w;
}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+48);
}int n,m,ss,x,y;
vei g[maxn],scc[maxn],gg[maxn];
int dfn[maxn],low[maxn];
bool ins[maxn];
stack<int> s;
int timer=0,cnt=0,c[maxn];
int deg[maxn],ans=0;void build(){re(i,1,n){fo(j,0,g[i].size()){if(c[i]!=c[g[i][j]]) deg[c[g[i][j]]]++;}}re(i,1,cnt) if(deg[i]==0&&i!=c[ss]) ans++;
}void tarjan(int x){dfn[x]=low[x]=++timer;s.push(x),ins[x]=1;fo(i,0,g[x].size()){int y=g[x][i];if(!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if(ins[y])low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]){++cnt;int y;do{y=s.top();s.pop();ins[y]=0;c[y]=cnt;scc[cnt].pub(y);}while(x!=y);}
}signed main(){ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>m>>ss;re(i,1,m) cin>>x>>y,g[x].pub(y);re(i,1,n) if(!dfn[i]) tarjan(i);
//    re(i,1,n) cout<<c[i]<<' ';cout<<endl;
    build();cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/oneman233/p/11557976.html

20190919CF训练相关推荐

  1. 自己动手实现20G中文预训练语言模型示例

    起初,我和大部分人一样,使用的是像Google这样的大公司提供的Pre-training Language Model.用起来也确实方便,随便接个下游任务,都比自己使用Embedding lookup ...

  2. 显卡不够时,如何训练大型网络

    https://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ%3D%3D&chksm=970c2143a07ba855562ca86bfa19b78a26fe ...

  3. ELECTRA 超过bert预训练NLP模型

    论文:ELECTRA: Pre-training Text Encoders As Discriminators Rather Then Generators 本文目前在ICLR 2020盲审中,前几 ...

  4. python实现glove,gensim.word2vec模型训练实例

    20210331 https://blog.csdn.net/sinat_26917383/article/details/83029140 glove实例 https://dumps.wikimed ...

  5. 分布式训练使用手册-paddle 数据并行

    分布式训练使用手册¶ 分布式训练基本思想¶ 分布式深度学习训练通常分为两种并行化方法:数据并行,模型并行,参考下图: 在模型并行方式下,模型的层和参数将被分布在多个节点上,模型在一个mini-batc ...

  6. 深度学习的分布式训练--数据并行和模型并行

    <div class="htmledit_views"> 在深度学习这一领域经常涉及到模型的分布式训练(包括一机多GPU的情况).我自己在刚刚接触到一机多卡,或者分布式 ...

  7. 谷歌BERT预训练源码解析(二):模型构建

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39470744/arti ...

  8. pytorch 多GPU训练总结(DataParallel的使用)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_40087578/arti ...

  9. 命名实体识别训练集汇总(一直更新)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/leitouguan8655/artic ...

最新文章

  1. 准确度判断 语义分割_Mask R-CNN(目标检测语义分割)测试
  2. Struts2之ModelDriven
  3. C++读取与保持图片
  4. 大鱼吃小鱼easyx_对于一个大一计科新生,有什么代码行数在 500~1000 的程序(C 语言)可以试着写来练手?...
  5. es6 --- 解构赋值的简洁性
  6. 添加python的系统路径_如何将项目路径添加到系统路径永久地?
  7. python 类 对象 知乎_python基础知识:类,对象,模块三者的区别
  8. [导入]ASP.NET Ajax程序设计第II卷:客户端Microsoft Ajax Library与异步通信层及源代码.zip(101.50 MB)...
  9. 【学习笔记】圆方树(CF487E Tourists)
  10. VUE项目导入bootstrap
  11. 产品经理岗位职责说明_11份公司高层管理人员的岗位职责说明书,改改就能用,拿去参考...
  12. java宠物店管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  13. ad软件画pcb方法总结_AD软件中导入BRD的PCB文件总结分享,,,,
  14. Linux安装ParaView
  15. 算法7:求用小矩形覆盖大矩形有多少种方式
  16. 陶哲轩实分析 习题5.5.2
  17. 网页编程----HTML网页编程
  18. 操作系统中的信号量及P、V操作
  19. mac下用户用户组命令行操作
  20. sql语句插入一条记录同时获取刚插入的id

热门文章

  1. 模拟ATM机存取款管理系统设计(C++)
  2. go结构体初始化_浅谈golang结构体偷懒初始化
  3. 传奇开服怎么开服?不会技术自己能开服吗?传奇开服需要准备什么?前期需要投入多少?
  4. leecode [保持城市天际线]代码实现
  5. Merge用法:Oracle 10g中对Merge语句的增强
  6. 小工具:批量替换文件夹下所有文件内容中的指定词
  7. 移动端小说APP体验报告
  8. Linux九阴真经之大伏魔拳残卷5 nginx
  9. java开发工程师培训费,南通渡课Java开发工程师培训费用是多少
  10. W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x419b4c50)