【19级算法训练赛第十场】题解
19级算法训练赛第十场
比赛地址:https://vjudge.net/contest/367058#overview 密码:IWantToACC
内容涉及:A数学定理 B贪心入门 C枚举or数位dp D枚举or唯一分解定理 E离散化+差分 F唯一分解定理 G计算机常识+二进制 H签到
直播讲解高清录像放在B站上,点击下面链接进入
视频链接:https://www.bilibili.com/video/bv1ak4y197pm
A-[NOIP2017]小凯的疑惑
#include<bits/stdc++.h> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); using namespace std; typedef long long ll; typedef pair<int,int> pii; const int maxn = 1e6+10; using namespace std; int main(){ ios; ll a,b;cin>>a>>b; cout<<a*b-(a+b)<<endl; return 0; }
B-合并果子
#include <iostream> #include <algorithm> #include <string> #include <cstring> #include <map> #include <set> #include <deque> #include <queue> #include <vector> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); #define PI acos(-1) #define fs first #define sc second using namespace std; typedef long long ll; typedef pair<int,int> pii; const ll maxn = 1e6+10; double eps = 1e-8; int T,N; priority_queue<int,vector<int>,greater<int>> q; int main(){ ios; cin>>T; while(T--){ while (q.size()) q.pop(); cin>>N; for(int i = 1;i<=N;i++){ int cur;cin>>cur; q.push(cur); } ll res = 0; while(q.size()>=2){ int t1 = q.top();q.pop(); int t2 = q.top();q.pop(); res += t1 + t2; q.push(t1+t2); } cout<<res<<endl; } return 0; }
C - 不要62
#include <iostream> #include <algorithm> #include <string> #include <cstring> #include <map> #include <set> #include <deque> #include <queue> #include <vector> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); #define PI acos(-1) #define fs first #define sc second using namespace std; typedef long long ll; typedef pair<int,int> pii; const ll maxn = 1e6+10; double eps = 1e-8; int N,M; int dp[maxn][2]; int nums[10]; int dfs(int pos,bool limit,bool pre_is6){ if(!limit && dp[pos][pre_is6] != -1) return dp[pos][pre_is6]; if(pos == 0) return 1; int up = limit? nums[pos]:9; int sum = 0; for(int i = 0;i<=up;i++){ if(i == 4) continue; if(i == 2 && pre_is6) continue; sum += dfs(pos-1,limit && i == nums[pos],i == 6); } if(!limit) dp[pos][pre_is6] = sum; return sum; } int solve(int x){ int pos = 0; while(x){ nums[++pos] = x%10; x/=10; } return dfs(pos,1,0); } int main(){ memset(dp,-1, sizeof(dp)); while(scanf("%d %d",&N,&M)){ if(N == 0 && M == 0) break; printf("%d\n",solve(M)-solve(N-1)); } return 0; }
D - [NOIP2009]Hankson的趣味题
#include <iostream> #include <algorithm> #include <string> #include <cstring> #include <map> #include <set> #include <deque> #include <queue> #include <vector> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); #define PI acos(-1) #define fs first #define sc second using namespace std; typedef long long ll; typedef pair<int,int> pii; const ll maxn = 1e6+10; double eps = 1e-8; int T; int a0,a1,b0,b1; bool vis[maxn]; int P[maxn],tail; struct node{ int a,b,c,d; }; map<int,node> mp; inline void read(int &x){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); x = s*w; } inline void write(int X) { if(X<0) {putchar('-'); X=~(X-1);} int s[20],top=0; while(X) {s[++top]=X%10; X/=10;} if(!top) s[++top]=0; while(top) putchar(s[top--]+'0'); } void initP(int N){ for(int i = 2;i<=N;i++){ if(!vis[i]) P[tail++] = i; for(int j = 0;P[j]<=N/i;j++){ vis[P[j]*i] = true; if(i%P[j] == 0) break; } } } void divP(){ int idx = 0; for(int t:{a0,a1,b0,b1}){ ++idx; for(int j = 0;j<tail && P[j]*P[j] <=t;j++){ if(t%P[j] == 0){ int cnt = 0; while(t%P[j] == 0){ cnt++; t/=P[j]; } if(idx == 1) mp[P[j]].a = cnt; if(idx == 2) mp[P[j]].b = cnt; if(idx == 3) mp[P[j]].c = cnt; if(idx == 4) mp[P[j]].d = cnt; } } if(t>1){ if(idx == 1) mp[t].a = 1; if(idx == 2) mp[t].b = 1; if(idx == 3) mp[t].c = 1; if(idx == 4) mp[t].d = 1; } } } ll fun(){ ll res = 1; for(auto p:mp){ node cur = p.second; int a = cur.a,b = cur.b,c = cur.c,d = cur.d; int cnt = 0; for(int i = 0;i<=31;i++){ if(min(i,a) == b && max(i,c) == d) cnt++; } res *= cnt; } return res; } int main(){ initP(1<<16); cin>>T; while(T--){ read(a0),read(a1),read(b0),read(b1); mp.clear(); divP(); printf("%d\n",fun()); } return 0; }
E - Covered Points Count
#include<bits/stdc++.h> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); #define PI acos(-1) #define fs first #define sc second using namespace std; typedef long long ll; typedef pair<ll,ll> pii; const int maxn = 1e6+10; using namespace std; int N; pii lr[maxn]; ll arr[maxn],tail; ll ca[maxn],idx; ll ans[maxn]; map<ll,ll> pos,rpos; void Lisa(){ arr[0] = -1; sort(arr+1,arr+tail+1); for(int i = 1;i<=tail;i++){ if(arr[i] != arr[i-1]) pos[arr[i]] = ++idx,rpos[idx] = arr[i]; } } int main(){ ios; cin>>N; for(int i = 1;i<=N;i++){ ll l,r;cin>>l>>r; arr[++tail] = l,arr[++tail] = r+1; lr[i] = {l,r}; } Lisa(); for(int i = 1;i<=N;i++){ ll l = lr[i].fs,r = lr[i].sc; ca[pos[l]] += 1; ca[pos[r+1]] -=1; } for(int i = 1;i<=idx;i++) ca[i] += ca[i-1]; for(int i = 1;i<=idx-1;i++){ ans[ca[i]] += rpos[i+1] - rpos[i]; } for(int i = 1;i<=N;i++) cout<<ans[i]<<" ";cout<<endl; return 0; }
F - [NOIP2009]细胞分裂
#include<bits/stdc++.h> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); #define PI acos(-1) #define fs first #define sc second using namespace std; typedef long long ll; typedef pair<int,int> pii; const int maxn = 1e6+10; const int inf = 2e9; using namespace std; int N,M1,M2; bool vis[maxn]; int P[maxn/10],tail; struct node { int a,b; }; map<int,node> mp; int ans = inf; void initP(int N){ for(int i = 2;i<=N;i++){ if(!vis[i]) P[tail++] = i; for(int j = 0;P[j]<=N/i;j++){ vis[P[j] * i] = true; if(i % P[j] == 0) break; } } } void divM(int x = M1){ for(int i = 0;i<tail && P[i]*P[i] <= x;i++){ if(x%P[i] == 0){ int cnt = 0; while(x%P[i] == 0){ cnt++; x/=P[i]; } mp[P[i]].b = cnt * M2; } } if(x>1) mp[x].b = M2; } void divP(int x){ mp.clear(); divM(); for(int i = 0;i<tail && P[i]*P[i] <= x;i++){ if(x%P[i] == 0){ int cnt = 0; while(x%P[i] == 0){ cnt++; x/=P[i]; } mp[P[i]].a = cnt; } } if(x>1) mp[x].a = 1; } int sovle(){ int mx = 0; for(auto p:mp){ auto cur = p.second; int a = cur.a,b = cur.b; if(b > 0 && a == 0) return inf; if(b > 0) mx = max(mx,(b-1)/a + 1); } return mx; } int main(){ ios; initP(1<<16); cin>>N>>M1>>M2; while(N--){ int x;cin>>x; divP(x); ans = min(ans,sovle()); } if(ans == inf) cout<<-1<<endl; else cout<<ans<<endl; return 0; }
G - 输出二进制补码
#include <iostream> #include <algorithm> #include <string> #include <cstring> #include <map> #include <set> #include <deque> #include <queue> #include <vector> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); #define PI acos(-1) #define fs first #define sc second using namespace std; typedef long long ll; typedef pair<int,int> pii; const ll maxn = 1e6+10; double eps = 1e-8; vector<bool> ans; int main(){ ios; int N;cin>>N; for(int j = 31;j>=0;j--){ if((N>>j)&1) ans.push_back(1); else ans.push_back(0); } for(int i = 0;i<32;i++) cout<<ans[i]; return 0; }
H - 矩阵加法
#include<bits/stdc++.h> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); using namespace std; typedef long long ll; typedef pair<int,int> pii; const int maxn = 1e6+10; using namespace std; int N,M; int ans[111][111]; int main(){ ios; cin>>N>>M; for(int k:{1,2}){ for(int i = 1;i<=N;i++){ for(int j = 1;j<=M;j++){ int cur;cin>>cur; ans[i][j] += cur; } } } for(int i = 1;i<=N;i++){ for(int j = 1;j<=M;j++){ cout<<ans[i][j]; if(j<M) cout<<" "; } cout<<endl; } return 0; }
Ryuichi的算法分享 文章被收录于专栏
分享我的一些算法题解,致力于把题解做好,部分题解可能会采用视频的形式来讲解。