AtCoder Beginner Contest 369 题解

A - 369

#include 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
						For(j,m-1) cout<<a[i][j]<<' ';\
						cout<<a[i][m]<<endl; \
						} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
	return x*f;
} 
int main()
{
//	freopen("A.in","r",stdin);
//	freopen(".out","w",stdout);
	int a,b,c;
	cin>>a>>b;
	int an=0;
	if(a==b) an=1;
	else {
		if((a+b)%2==0) ++an;
		an+=2;
	}cout<<an;
	
	
	return 0;
}


B - Piano 3

#include 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
						For(j,m-1) cout<<a[i][j]<<' ';\
						cout<<a[i][m]<<endl; \
						} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
	return x*f;
} 
int a[101];
string s[101];
int f[101][101][101]={};
int main()
{
//	freopen("B.in","r",stdin);
//	freopen(".out","w",stdout);
	int n=read(),pl=-1,pr=-1,x=0;
	For(i,n) {
		cin>>a[i]>>s[i];
		if(s[i][0]=='L') {
			x+=(pl==-1)?0:abs(pl-a[i]);
			pl=a[i];
		}
		else {
			x+=(pr==-1)?0:abs(pr-a[i]);
			pr=a[i];
			
		}
	}
	cout<<x;	
	return 0;
}


C - Count Arithmetic Subarrays

#include 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
						For(j,m-1) cout<<a[i][j]<<' ';\
						cout<<a[i][m]<<endl; \
						} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
	return x*f;
} 
int a[200000+10];
int main()
{
//	freopen("C.in","r",stdin);
//	freopen(".out","w",stdout);
	int n=read();
	For(i,n) a[i]=read();
	For(i,n-1) a[i]=a[i+1]-a[i];
	ll ans=n;
	ll x=1;
	For(i,n-1) {
		if(i>1&&a[i]==a[i-1]) ++x,ans+=x;
		else x=1,ans++;
	}
	cout<<ans;
	return 0;
}


D - Bonus EXP

#include 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
						For(j,m-1) cout<<a[i][j]<<' ';\
						cout<<a[i][m]<<endl; \
						} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
	return x*f;
} 
int a[200000+10];
ll f[200000+10][2];
int main()
{
//	freopen(".out","w",stdout);
	int n=read();
	For(i,n) a[i]=read();
	f[0][0]=-1e18;f[0][1]=0;
	For(i,n) {
		f[i][0]=max(f[i-1][0],f[i-1][1]+a[i]);
		f[i][1]=max(f[i-1][1],f[i-1][0]+2ll*a[i]);
	}
	cout<<max(f[n][0],f[n][1]);
	
	
	
	return 0;
}


E - Sightseeing Tour

#include 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
						For(j,m-1) cout<<a[i][j]<<' ';\
						cout<<a[i][m]<<endl; \
						} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
	return x*f;
} 
int n;
#define MAXN (410)
#define MAXM (200000+10)
ll u[MAXM],v[MAXM],w[MAXM];
ll f[MAXN][MAXN]={};

int main()
{
//	freopen("E.in","r",stdin);
//	freopen(".out","w",stdout);
	int n=read(),m=read();
	For(i,n) For(j,n) f[i][j]=1e18;
	For(i,n) f[i][i]=0;
	For(i,m){
		cin>>u[i]>>v[i]>>w[i];
		gmin(f[u[i]][v[i]],w[i])
		gmin(f[v[i]][u[i]],w[i])
	}
	For(k,n) For(i,n) For(j,n) gmin(f[i][j],f[i][k]+f[k][j])
	int q=read();
	while(q--) {
		int k=read(),S=1<<k;
		vi ve;
		Rep(c,k) ve.pb(read());
		vi p;
		Rep(c,k) p.pb(c);
		ll ans=1e18;
		do{
			Rep(st,S){
				int now=1;ll tmp=0;
				Rep(c,k) {
					int id =ve[p[c]];
					if((st>>c)&1) {
						tmp+=f[now][u[id]];now=v[id];
					}
					else {
						tmp+=f[now][v[id]];now=u[id];
					}		
					tmp+=w[id];		
				}
				tmp+=f[now][n];
				gmin(ans,tmp)
			}
		}while(next_permutation(ALL(p)));
		cout<<ans<<endl;
	}
	
	return 0;
}


F - Gather Coins

H*W的棋盘上有n个硬币。从(1,1)开始每次只能向右或向下走走到(H,W),问最多经过几个硬币。
线段树板子题

#include 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
						For(j,m-1) cout<<a[i][j]<<' ';\
						cout<<a[i][m]<<endl; \
						} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
	return x*f;
} 
int n;


const int maxn =300000+10;
pi v[maxn];
pair<int,int> g[maxn<<2];
void pushup(int o) {
	g[o]=max(g[Lson],g[Rson]);
}
void build(int l,int r,int o) {
	if (l==r) {
		g[o]={0,0};	return ;
	}
	int m=(l+r)>>1;
	build(l,m,Lson),build(m+1,r,Rson);
	pushup(o);
}
void update(int l,int r,int o,int p,pi v) {
	if (l==r) {
		g[o]=max(g[o],v);  return;
	}
	int m=(l+r)>>1;
	if (p<=m) update(l,m,Lson,p,v); 
	else update(m+1,r,Rson,p,v);
	pushup(o);
}
pi query(int l,int r,int o,int L,int R) {
	if(L<=l && r<=R ) return g[o];
	int m=(l+r)>>1;
	pi ret={0,0};
	if(L<=m) gmax(ret,query(l,m,Lson,L,R));
	if(m<R) gmax(ret,query(m+1,r,Rson,L,R)); 
	return ret;
}
pi an[maxn];
int main()
{
//	freopen("F.in","r",stdin);
//	freopen(".out","w",stdout);
	int h=read(),w=read(),n=read();
	For(i,n){
		v[i].fi=read();
		v[i].se=read();
	}
	sort(v+1,v+1+n);
	For(i,n) {
		int r=v[i].fi,c=v[i].se;
		an[i]=mp(1,0);
		auto p=query(1,200000,1,1,c);
		an[i]=max(an[i],mp(p.fi+1,p.se));
		update(1,200000,1,c,mp(an[i].fi,i));
	}
	int ans=-1,id=-1;
	For(i,n) if(an[i].fi>=ans) ans=an[i].fi,id=i;
	cout<<ans<<endl;
	vector<pi > st;
	st.pb(mp(h,w));
	while(id){
		st.pb(v[id]);
		id=an[id].se;
	}
	st.pb(mp(1,1));
	reverse(ALL(st));
	int x=1,y=1;
	for(auto p:st){
		int nx=p.fi,ny=p.se;
		For(i,nx-x) cout<<'D';
		For(i,ny-y) cout<<'R';
		x=nx,y=ny;
	}
	return 0;
}


G - As far as possible

给1个点数为 N N N的有边权的树,根为1,对于每个 K [ 1 , n ] K[1,n] K[1,n],选出 K K K个节点,计算一条从根开始计划经过所有给定节点至少一次后回到原点的最小路径长度 a n s K ans_K ansK。选点的策略为让最小路径长度尽量大。求每个 K K K对应的最小路径长度。
结论: a n s K − a n s K − 1 ≥ a n s K + 1 − a n s K ans_K-ans_{K-1} \ge ans_{K+1}-ans_K ansKansK1ansK+1ansK
因此,可以每次取走根节点向下的最长链。删除链,剩余的连通块继续做,直到取走所有边。
dp求出每个节点的向下到根的最长链。每次把除最大值外的所有相邻子节点的最优值加入dp数组。

#include 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i>0;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,cal) printf("Case #%d: %lld\n",kcase,cal);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
						For(j,m-1) cout<<a[i][j]<<' ';\
						cout<<a[i][m]<<endl; \
						} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define add(a,b) ((a+b)%F)
ll mul(ll a,ll b){return (a*b)%F;}
inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
	return x*f;
} 

#define MAXN (212345)
vector<pair<int,ll> > v[MAXN];
vector<ll> dp;
ll dfs(int x,int fa)  {
        ll mx=0;
        for (auto e : v[x]) if (e.fi^fa){
    		auto tmp = dfs(e.fi,x)+e.se;
           	dp.pb(min(mx,tmp));
			mx=max(mx,tmp);	
        }
        return mx;
    };
int main()
{
//	freopen("c.in","r",stdin);
//	freopen(".out",w",stdout);
	int n=read();
	For(i,n-1) {
		int x=read(),y=read(),w=read();
		v[x].pb(mp(y,w)); v[y].pb(mp(x,w));
	}
	dp.pb(dfs(1,-1));
	sort(ALL(dp));
	reverse(ALL(dp));
	ll x=0;
	Rep(i,n) {
		x+=dp[i]*2;
		cout<<x<<endl;
	}
	
	return 0;
}



你可能感兴趣的:(比赛题解,线段树,树形DP,算法,c++,数据结构,线段树,树dp)