cf1027
Codeforces Round 1027 (Div. 3)
A.
先处理前导零,再检查是否是平方数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
const int N = 1e5 + 10;
const int mod = 1e7 + 9;
#define rep(i, a, b) for (int i = a; i < b; i++)
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
ll t;
cin >> t;
while (t--)
{
ll n, k;
cin >> n >> k;
string s;
cin>>s;
ll x=0,y=0;
for(auto t:s)
{
if(t=='0')
{
x++;
}
else{
y++;
}
}
ll res=abs(x-y)/2;
if(res>k)
{
cout<<"NO"<<endl;
}
else{
if((k-res)%2==1)
{
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
}
return 0;
}
B.
先将一定会配对的数目算出来,即(cnt1-cnt0)/2,剩下的均可以实现不配对,如果需要配对,需要特判k的个数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
const int N = 1e5 + 10;
const int mod = 1e7 + 9;
#define rep(i, a, b) for (int i = a; i < b; i++)
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
ll t;
cin >> t;
while (t--)
{
ll n, k;
cin >> n >> k;
string s;
cin>>s;
ll x=0,y=0;
for(auto t:s)
{
if(t=='0')
{
x++;
}
else{
y++;
}
}
ll res=abs(x-y)/2;
if(res>k)
{
cout<<"NO"<<endl;
}
else{
if((k-res)%2==1)
{
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
}
return 0;
}
C.
序列已经排序好,从左往右模拟即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
const int N = 1e5 + 10;
const int mod = 1e7 + 9;
#define rep(i,a,b) for(int i=a;i<b;i++)
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
ll t;
cin>>t;
while (t--)
{
ll n;
cin>>n;
vector<ll>a(n+1);
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
ll pre=a[1],ans=1;
for(int i=2;i<=n;i++)
{
if(pre+1<a[i])
{
ans++;
pre=a[i];
}
}
cout<<ans<<endl;
}
return 0;
}
D.
使用multiset将元素升序排序,枚举每个点,判断删除该点后最小的面积
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
typedef long long i64;
const int N = 1e5 + 10;
const int mod = 1e7 + 9;
const int maxn = 0x3f3f3f3f;
const int minn = 0xc0c0c0c0;
const int inf = 99999999;
void solve() {
int n;
std::cin >> n;
std::vector<i64> x(n), y(n);
std::multiset<i64> X, Y;
for (int i = 0; i < n; ++ i) {
std::cin >> x[i] >> y[i];
X.insert(x[i]);
Y.insert(y[i]);
}
if (n == 1) {
std::cout << 1 << "\n";
return;
}
i64 ans = (*X.rbegin() - *X.begin() + 1) * (*Y.rbegin() - *Y.begin() + 1);
for (int i = 0; i < n; ++ i) {
X.extract(x[i]);
Y.extract(y[i]);
i64 a = *X.rbegin() - *X.begin() + 1, b = *Y.rbegin() - *Y.begin() + 1;
i64 sum = a * b;
if (sum < n) {
ans = std::min({ans, sum + a, sum + b});
} else {
ans = std::min(ans, sum);
}
X.insert(x[i]);
Y.insert(y[i]);
}
std::cout << ans << "\n";
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
i64 t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
E.
树的dp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
const int N = 1e5 + 10;
const int mod = 1e7 + 9;
#define rep(i, a, b) for (int i = a; i < b; i++)
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
ll t;
cin >> t;
while (t--)
{
ll n;
cin >> n;
vector<ll> a(n + 1);
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
vector<vector<ll>> adj(n + 1);
for (int i = 1; i <= n - 1; i++)
{
ll u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<bool> vis(n + 1, false);
vector<ll> dp(n + 1, 0);
dp[1] = a[1];
vector<ll> fat(n + 1, 0);
auto dfs = [&](auto &self, ll u, ll fa) -> void
{
vis[u] = true;
fat[u] = fa;
for (auto v : adj[u])
{
if (vis[v])
{
continue;
}
if (u == 1)
{
dp[v] = a[v];
}
else
{
dp[v] = max(a[v], a[v] - a[u] + dp[fat[u]]);
}
self(self, v, u);
}
};
dfs(dfs, 1, 0);
for (int i = 1; i <= n; ++i)
{
cout << dp[i] << " ";
}
cout << endl;
}
return 0;
}
F.
x转化为y,双方同时除去公约数,在判断xx,yy是否由大于k的因数组成,如果有输出-1,否则通过递归,找到分解所需的最小次数
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
//#define int unsigned long long
typedef pair<int,int> PII;
const int N=1e6+5,mod=1e9+7,inf=0x3f3f3f3f;
int st[N],f[N];
int _=1;
int k;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int sol(int x){
if (x==1) return 0;
if (x<=k) return 1;
if (st[x]==_) return f[x];
int ans=inf;
for (int i=2;i<=x/i;i++){
if (x%i==0){
ans=min(ans,sol(x/i)+sol(i));
}
}
st[x]=_;
f[x]=ans;
return ans;
}
void solve(){
int x,y;
cin>>x>>y>>k;
int z=gcd(x,y);
x/=z,y/=z;
int xx=x,yy=y;
for (int i=2;i<=x/i;i++){
if (x%i==0){
if (i>k){
cout<<-1<<endl;
return;
}
while (x%i==0) x/=i;
}
}
if (x>k){
cout<<-1<<endl;
return;
}
for (int i=2;i<=y/i;i++){
if (y%i==0){
if (i>k){
cout<<-1<<endl;
return;
}
while (y%i==0) y/=i;
}
}
if (y>k){
cout<<-1<<endl;
return;
}
cout<<sol(xx)+sol(yy)<<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
memset(st,-1,sizeof st);
cin>>_;
while (_--)
solve();
return 0;
}

浙公网安备 33010602011771号