20190919CF训练
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训练相关推荐
- 自己动手实现20G中文预训练语言模型示例
起初,我和大部分人一样,使用的是像Google这样的大公司提供的Pre-training Language Model.用起来也确实方便,随便接个下游任务,都比自己使用Embedding lookup ...
- 显卡不够时,如何训练大型网络
https://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ%3D%3D&chksm=970c2143a07ba855562ca86bfa19b78a26fe ...
- ELECTRA 超过bert预训练NLP模型
论文:ELECTRA: Pre-training Text Encoders As Discriminators Rather Then Generators 本文目前在ICLR 2020盲审中,前几 ...
- python实现glove,gensim.word2vec模型训练实例
20210331 https://blog.csdn.net/sinat_26917383/article/details/83029140 glove实例 https://dumps.wikimed ...
- 分布式训练使用手册-paddle 数据并行
分布式训练使用手册¶ 分布式训练基本思想¶ 分布式深度学习训练通常分为两种并行化方法:数据并行,模型并行,参考下图: 在模型并行方式下,模型的层和参数将被分布在多个节点上,模型在一个mini-batc ...
- 深度学习的分布式训练--数据并行和模型并行
<div class="htmledit_views"> 在深度学习这一领域经常涉及到模型的分布式训练(包括一机多GPU的情况).我自己在刚刚接触到一机多卡,或者分布式 ...
- 谷歌BERT预训练源码解析(二):模型构建
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39470744/arti ...
- pytorch 多GPU训练总结(DataParallel的使用)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_40087578/arti ...
- 命名实体识别训练集汇总(一直更新)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/leitouguan8655/artic ...
最新文章
- 准确度判断 语义分割_Mask R-CNN(目标检测语义分割)测试
- Struts2之ModelDriven
- C++读取与保持图片
- 大鱼吃小鱼easyx_对于一个大一计科新生,有什么代码行数在 500~1000 的程序(C 语言)可以试着写来练手?...
- es6 --- 解构赋值的简洁性
- 添加python的系统路径_如何将项目路径添加到系统路径永久地?
- python 类 对象 知乎_python基础知识:类,对象,模块三者的区别
- [导入]ASP.NET Ajax程序设计第II卷:客户端Microsoft Ajax Library与异步通信层及源代码.zip(101.50 MB)...
- 【学习笔记】圆方树(CF487E Tourists)
- VUE项目导入bootstrap
- 产品经理岗位职责说明_11份公司高层管理人员的岗位职责说明书,改改就能用,拿去参考...
- java宠物店管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
- ad软件画pcb方法总结_AD软件中导入BRD的PCB文件总结分享,,,,
- Linux安装ParaView
- 算法7:求用小矩形覆盖大矩形有多少种方式
- 陶哲轩实分析 习题5.5.2
- 网页编程----HTML网页编程
- 操作系统中的信号量及P、V操作
- mac下用户用户组命令行操作
- sql语句插入一条记录同时获取刚插入的id
热门文章
- 模拟ATM机存取款管理系统设计(C++)
- go结构体初始化_浅谈golang结构体偷懒初始化
- 传奇开服怎么开服?不会技术自己能开服吗?传奇开服需要准备什么?前期需要投入多少?
- leecode [保持城市天际线]代码实现
- Merge用法:Oracle 10g中对Merge语句的增强
- 小工具:批量替换文件夹下所有文件内容中的指定词
- 移动端小说APP体验报告
- Linux九阴真经之大伏魔拳残卷5 nginx
- java开发工程师培训费,南通渡课Java开发工程师培训费用是多少
- W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x419b4c50)