Codeforces Round #635 (Div. 2)

Solutions


A. Ichihime and Triangle

直接让三边是\(a,c,c\)即可

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
typedef vector<int> VI;
typedef pair<int,int> PII;
const int N=100010;
const int inf=0X3f3f3f3f;
const long long INF=0x3f3f3f3f3f3f3f3f;
const double eps=1e-6;
const double pi=acos(-1.0);
const int mod=1000000007;
typedef long long ll;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head
int _;
int main() {
	for (scanf("%d",&_);_;_--) {
		int a,b,c,d;
		scanf("%d%d%d%d",&a,&b,&c,&d);
		printf("%d %d %d\n",a,c,c);
	}	
}

B. Kana and Dragon Quest game

贪心,只要操作1不会反向增加就一直用,然后再判断操作2能不能把血扣完。

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
typedef vector<int> VI;
typedef pair<int,int> PII;
const int N=100010;
const int inf=0X3f3f3f3f;
const long long INF=0x3f3f3f3f3f3f3f3f;
const double eps=1e-6;
const double pi=acos(-1.0);
const int mod=1000000007;
typedef long long ll;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head
int _;
int main() {
	for (scanf("%d",&_);_;_--) {
		int x,n,m;
		scanf("%d%d%d",&x,&n,&m);
		if (x<=m*10) {
			puts("YES");
			continue;
		}
		while (n--) {
			x=x/2+10;
			if (x<=20) break;
		}
		if (x<=m*10) puts("YES");
		else puts("NO");
	}	
}

C. Linova and Kingdom

我一直想标记出工业节点,然后也是根据深度和以它为根的子树大小来写的,我认为肯定是叶节点为工业节点,然后就不太好操作了,后来又尝试了先把靠近王国的节点变为旅游节点,深度相同先变子树小的节点。。

后来看了正解,如果把一个节点\(u\)变为旅游节点,对应的贡献就是\(size_u-dep_u\),根据自己的\(size,dep\)含义灵活改变,减少的是节点\(u\)到1号节点经过的点,增加的是节点\(u\)子树的大小。然后排序,选前\(n-k\)大就可以了。

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
typedef vector<int> VI;
typedef pair<int,int> PII;
const int N=100010;
const int inf=0X3f3f3f3f;
const long long INF=0x3f3f3f3f3f3f3f3f;
const double eps=1e-6;
const double pi=acos(-1.0);
const int mod=1000000007;
typedef long long ll;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head
int dep[2*N];
vector<int> G[2*N];
int n,k;
int dd[2*N];
int dfs(int u,int fa) {
	dep[u]=dep[fa]+1;
	for (auto it:G[u]) {
		if (it!=fa) {
			dd[u]+=dfs(it,u);
		}
	}
	return dd[u]+1;
}
vector<int> t;
int main() {
	scanf("%d%d",&n,&k);
	for (int i=1;i<n;i++) {
		int u,v;
		scanf("%d%d",&u,&v);
		G[u].pb(v);
		G[v].pb(u);
	}
	dfs(1,0);
	for (int i=1;i<=n;i++) t.pb(dd[i]-(dep[i]-1));
	sort(all(t));
	ll sum=0;
	for (int i=sz(t)-(n-k);i<sz(t);i++) sum+=t[i];
	printf("%lld\n",sum);
}

D. Xenia and Colorful Gems

没有什么思路。

假如\(x\leq y\leq z\),那么\(x,z\)尽量靠近\(y\)比较好一点。然后就可以固定其中一个,在另外两个里面二分。由于是假设的,所以要考虑多种情况。

小于等于就是\(upper\_bound-1\),大于等于就直接\(lower\_bound\)
这里需要把长度也传进来,不然没发对应长度。如果使用vector注意开的大小。

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
typedef vector<int> VI;
typedef pair<int,int> PII;
const int N=100010;
const int inf=0X3f3f3f3f;
const long long INF=0x3f3f3f3f3f3f3f3f;
const double eps=1e-6;
const double pi=acos(-1.0);
const int mod=1000000007;
typedef long long ll;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head
int _;
ll ans;
ll r[N],g[N],b[N];
ll sq(ll x) {return x*x;}
void solve(ll r[],int nr,ll g[],int ng,ll b[],int nb) {
	for (int i=0;i<nr;i++) {
		ll x=r[i];
		int y=lower_bound(g,g+ng,x)-g;
		int z=upper_bound(b,b+nb,x)-b;
		if (z==0||y==ng) continue;
		z--; ans=min(ans,sq(x-g[y])+sq(x-b[z])+sq(g[y]-b[z]));
	}
}
int main() {
	for (scanf("%d",&_);_;_--) {
		int nr,ng,nb;
		scanf("%d%d%d",&nr,&ng,&nb);
		for (int i=0;i<nr;i++) scanf("%lld",&r[i]);
		for (int i=0;i<ng;i++) scanf("%lld",&g[i]);
		for (int i=0;i<nb;i++) scanf("%lld",&b[i]);
		sort(r,r+nr); sort(g,g+ng); sort(b,b+nb);
		ans=INF;
		solve(r,nr,g,ng,b,nb); solve(r,nr,b,nb,g,ng);
		solve(g,ng,b,nb,r,nr); solve(g,ng,r,nr,b,nb);
		solve(b,nb,r,nr,g,ng); solve(b,nb,g,ng,r,nr);
		printf("%lld\n",ans);
	}	
}
posted @ 2020-04-19 11:49  Frontierone  阅读(212)  评论(0编辑  收藏  举报