写完这个就去搞有趣的实训了!
img
Codeforces Round 938 (Div. 3)
A
能买一个自然全部都买一个
如果可以买两个那就需要考虑取余
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include<bits/stdc++.h> using namespace std; using ll=long long; #define rep(i,a,n) for(int i=a;i<=n;i++) #define frep(i,a,n) for(int i=a;i>=n;i--) #define int long long const int N=1e5+100; #define PII pair<int,int> #define lowbit(x) (x&(-x)) const int mod=1e9+7; const double pai=acos(-1.0); #define ios ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); #define LF(x) fixed<<setprecision(x) int a[N]; #define CY cout<<"YES"<<'\n' #define CN cout<<"NO"<<'\n' void Totoro() { int n,x,y; cin>>n>>x>>y; if(x*2<=y) { cout<<n*x<<'\n'; } else { cout<<n/2*y+(n%2)*x<<'\n'; }
} signed main() { ios; int t; cin>>t; while(t--) { Totoro(); } return 0; }
|
B
B题实际上我们只需要两层循环弄个map,如果这个没有出现过,就出问题了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include<bits/stdc++.h> using namespace std; using ll=long long; #define rep(i,a,n) for(int i=a;i<=n;i++) #define frep(i,a,n) for(int i=a;i>=n;i--)
const int N=1e6+100; #define PII pair<int,int> #define lowbit(x) (x&(-x)) const int mod=1e9+7; const double pai=acos(-1.0); #define ios ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); #define LF(x) fixed<<setprecision(x) int a[N]; void Totoro() { map<ll,int>mp;
int n,c,d; cin>>n>>c>>d; rep(i,1,n*n) { cin>>a[i]; mp[a[i]]++; } sort(a+1,a+1+n*n); int x=a[1]; for(int i=0;i<=n-1;i++) { for(int j=0;j<=n-1;j++) { if(!mp[x+i*c+j*d]) { cout<<"NO"<<'\n'; return; } mp[x+i*c+j*d]--; } } cout<<"YES"<<'\n'; } signed main() { ios; int t; cin>>t; while(t--) { Totoro(); } return 0; }
|
C
C题如果我们一开始就判断能不能全部弄完,然后再两边找二分之一,那么只需要特判最后一个中间相遇能不能搞定就可以了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include<bits/stdc++.h> using namespace std; using ll=long long; #define rep(i,a,n) for(int i=a;i<=n;i++) #define frep(i,a,n) for(int i=a;i>=n;i--) #define int long long const int N=1e6+100; #define PII pair<int,int> #define lowbit(x) (x&(-x)) const int mod=1e9+7; const double pai=acos(-1.0); #define ios ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); #define LF(x) fixed<<setprecision(x) int a[N]; void Totoro() { int n; cin>>n; int m; cin>>m; int sum=0; rep(i,1,n) { cin>>a[i]; sum+=a[i]; } if(m>=sum) { cout<<n<<'\n'; return; } int suml=0; int sumr=0; int x=(m+1)/2; int cnt_i=0; rep(i,1,n) { suml+=a[i]; if(suml<=x) { cnt_i=i; } } int cnt_j=n+1; frep(j,n,1) { sumr+=a[j]; if(sumr<=m/2) { cnt_j=j; } } if(cnt_j-1==cnt_i+1) { if(m-sumr-suml==a[cnt_j-1]) { cout<<n<<'\n'; return ; } else { cout<<n-cnt_j+1+cnt_i<<'\n'; return ; } } cout<<n-cnt_j+cnt_i+1<<'\n'; } signed main() { ios; int t; cin>>t; while(t--) { Totoro(); } return 0; }
|
D
还是用map记录,然后只需要把0变成-1然后去讨论即可,思路很直接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| #include<bits/stdc++.h> using namespace std; using ll=long long; #define rep(i,a,n) for(int i=a;i<=n;i++) #define frep(i,a,n) for(int i=a;i>=n;i--) #define int long long const int N=1e6+100; #define PII pair<int,int> #define lowbit(x) (x&(-x)) const int mod=1e9+7; const double pai=acos(-1.0); #define ios ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); #define LF(x) fixed<<setprecision(x) int a[N]; int b[N]; void Totoro() { int n,m,k; cin>>n>>m>>k; rep(i,1,n) { cin>>a[i]; } int ans=0; map<int,int>mp; rep(j,1,m) { cin>>b[j]; mp[b[j]]++; } int sum=0; rep(i,1,m) { if(mp[a[i]]>0) { mp[a[i]]--; sum++; if(mp[a[i]]==0) { mp[a[i]]=-1; } } else if(mp[a[i]]<0) { mp[a[i]]--; } } if(sum>=k) { ans+=1; } rep(i,1,n-m) { if(mp[a[i]]<0) { if(mp[a[i]]==-1) { sum--; mp[a[i]]=1; } else { mp[a[i]]++; } } else if(mp[a[i]]>0) { mp[a[i]]++; sum--; }
if(mp[a[i+m]]<0) { mp[a[i+m]]--; } else if(mp[a[i+m]]==1) { mp[a[i+m]]=-1; sum++; } else if(mp[a[i+m]]>0) { mp[a[i+m]]--; sum++; } if(sum>=k) { ans++; } } cout<<ans<<'\n'; } signed main() { ios; int t; cin>>t; while(t--) { Totoro(); } return 0; }
|
E
取模异或看看和第一个相等吗
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include<bits/stdc++.h> using namespace std; using ll=long long; #define rep(i,a,n) for(int i=a;i<=n;i++) #define frep(i,a,n) for(int i=a;i>=n;i--) #define int long long const int N=1e5+100; #define PII pair<int,int> #define lowbit(x) (x&(-x)) const int mod=1e9+7; const double pai=acos(-1.0); #define ios ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); #define LF(x) fixed<<setprecision(x) void Totoro() { int n; cin >> n; string s; cin >> s; for (int k = n; ; k--) { std::vector<int> a(k); for (int i = 0; i < n; i++) { a[i % k] ^= '1' - s[i]; } if (a == vector(k, a[0])) { cout << k << "\n"; return; } } } signed main() { int t; cin>>t; while(t--) { Totoro(); } return 0; }
|
F
知道1,2,3异或是0即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include<bits/stdc++.h> using namespace std; using ll=long long; #define rep(i,a,n) for(int i=a;i<=n;i++) #define frep(i,a,n) for(int i=a;i>=n;i--) #define int long long const int N=1e5+100; #define PII pair<int,int> #define lowbit(x) (x&(-x)) const int mod=1e9+7; const double pai=acos(-1.0); #define ios ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); #define LF(x) fixed<<setprecision(x) int a; void Totoro() { int b,c,d; cin>>a>>b>>c>>d; cout<<a/2+b/2+c/2+d/2+(a%2&&b%2&&c%2)<<'\n'; } signed main() { ios; int t; cin>>t; while(t--) { Totoro(); } return 0; }
|
G
参考队友huangyu的写法的
只需要枚举一下a[1][1]
的因子即可,然后看看路线上的因子有没有这个,最后类似dp去递推即可
这个做法稳过的,不过是1014ms
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| #include<bits/stdc++.h> using namespace std; using ll=long long; #define rep(i,a,n) for(int i=a;i<=n;i++) #define frep(i,a,n) for(int i=a;i>=n;i--) #define int long long const int N=1e5+100; #define PII pair<int,int> #define lowbit(x) (x&(-x)) const int mod=1e9+7; const double pai=acos(-1.0); #define ios ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); #define LF(x) fixed<<setprecision(x) int b[110][110]; int a[110][110]; int n,m; int v[N]; int gcd(int x,int y) { if(!y) { return x; } return gcd(y,x%y); } bool check(int x) { rep(i,1,n) { rep(j,1,m) { if(a[i][j]%x==0) { b[i][j]=1; } else { b[i][j]=0; } } } b[0][1]=1;
rep(i,1,n) { rep(j,1,m) { if(b[i][j]&&(b[i-1][j]||b[i][j-1])) { b[i][j]=1; } else { b[i][j]=0; } } } if(b[n][m]) { return 1; } return 0; } void Totoro() { int cnt=0; cin>>n>>m; rep(i,1,n) { rep(j,1,m) { cin>>a[i][j]; } } int y=gcd(a[1][1],a[n][m]); rep(i,1,y/i) { if(y%i==0) { v[++cnt]=i; v[++cnt]=y/i; } } sort(v+1,v+1+cnt); frep(i,cnt,1) { if(check(v[i])) { cout<<v[i]<<'\n'; return ; } }
} signed main() { int t; cin>>t; while(t--) { Totoro(); } return (0-0); }
|
有一种TLE做法,但也没想到,就是用set去做
每次插这个位置能变成的数字,会多个log
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include<bits/stdc++.h> using namespace std; using ll=long long; #define rep(i,a,n) for(int i=a;i<=n;i++) #define frep(i,a,n) for(int i=a;i>=n;i--) #define int long long const int N=1e5+100; #define PII pair<int,int> #define lowbit(x) (x&(-x)) const int mod=1e9+7; const double pai=acos(-1.0); #define ios ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); #define LF(x) fixed<<setprecision(x) int b[110][110]; int gcd(int x,int y) { if(!y) { return x; } return gcd(y,x%y); } set<int>a[110][100]; void Totoro() { int n,m; cin>>n>>m; rep(i,1,n) { rep(j,1,m) { cin>>b[i][j]; a[i][j].clear(); } } a[1][1].insert(b[1][1]); rep(i,1,n) { rep(j,1,m) { for(auto k:a[i][j]) { if(i!=n) { a[i+1][j].insert(gcd(k,b[i+1][j])); } if(j!=m) { a[i][j+1].insert(gcd(k,b[i][j+1])); } } } } cout<<*(--a[n][m].end())<<'\n'; } signed main() { int t; cin>>t; while(t--) { Totoro(); } return 0; }
|