AtCoder Beginner Contest 214

Link

A

直接做。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
#define mp make_pair
#define pb push_back
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
inline int read()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
int main()
{
	int n=read();
	if(n<=125)puts("4");
	else if(n<=211)puts("6");
	else puts("8");
}

B

直接做。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
#define mp make_pair
#define pb push_back
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
inline int read()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
int main()
{
	int s=read(),t=read(),ans=0;
	for(int i=0;i<=s;i++)
	{
		for(int j=0;j<=s-i;j++)
		{
			for(int k=0;k<=s-i-j;k++)
			{
				if(i*j*k<=t)ans++;
			}
		}
	}
	printf("%d",ans);
}

C

考虑从 \(T\) 最小的点转一圈,每个数的答案是前面的时间加上前面的 \(S\) 与 \(T\) 取 \(\min\)。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
#define int long long
#define mp make_pair
#define pb push_back
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
inline int read()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
const int N=2e5+10;
int s[N],t[N],ans[N];
signed main()
{
	int n=read();
	for(int i=1;i<=n;i++)s[i]=read();
	for(int i=1;i<=n;i++)t[i]=read();
	int x=-1,mn=0x7fffffff;
	for(int i=1;i<=n;i++)if(t[i]<mn)mn=t[i],x=i;
	ans[x]=mn;
	int sum=mn+s[x];
	for(int i=1;i<n;i++)
	{
		int y=x+i;if(y>n)y-=n;
		ans[y]=sum=min(sum,t[y]);
		sum+=s[y];
	}
	for(int i=1;i<=n;i++)printf("%lld\n",ans[i]);
	return 0;
}

D

考虑每条边的贡献,是去掉这条边之后的两个连通块大小的乘积,但仍然不好处理。考虑倒过来,那么就是加边操作,并查集维护 size 即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
#define mp make_pair
#define pb push_back
typedef pair<int,int> pii;
#define int long long
typedef long long ll;
typedef unsigned long long ull;
inline int read()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
const int N=1e5+10;
int sz[N],f[N];
void init(int n){for(int i=1;i<=n;i++)f[i]=i,sz[i]=1;}
int getf(int x){return f[x]==x?x:f[x]=getf(f[x]);}
void merge(int x,int y)
{
	int fx=getf(x),fy=getf(y);
	sz[fx]+=sz[fy];
	f[fy]=fx;
}
struct Edge{int u,v,w;}e[N];
bool cmp(Edge a,Edge b){return a.w<b.w;}
signed main()
{
	int n=read();
	for(int i=1;i<n;i++)e[i].u=read(),e[i].v=read(),e[i].w=read();
	sort(e+1,e+n,cmp);
	init(n);
	int ans=0;
	for(int i=1;i<n;i++)
	{
		int x=e[i].u,y=e[i].v,w=e[i].w;
		int fx=getf(x),fy=getf(y);
		ans+=sz[fx]*sz[fy]*w;
		merge(x,y);
	}
	printf("%lld",ans);
}

E

bool cmp(node x,node y)
{
	if(x.r!=y.r)return x.r<y.r;
	else return x.l>y.l;
}

这样 sort 之后每次取最左边的空闲点即可。

AC之后就跑路了所以并不会证明正确性

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
#define mp make_pair
#define pb push_back
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
inline int read()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
const int N=2e5+10;
struct node{int l,r;}a[N];
bool cmp(node x,node y)
{
//	if(x.l!=y.l)return x.l<y.l;
//	else return x.r<y.r;
	if(x.r!=y.r)return x.r<y.r;
	else return x.l>y.l;
}
int tot=0;
struct seg
{
	int ls,rs,sum;
	seg(){ls=rs=sum=0;}
}t[10000005];
void modify(int &p,int l,int r,int x)
{
	if(!p)p=++tot;
	if(l==r)
	{
		t[p].sum=1;
		return;
	}
	int mid=(l+r)/2;
	if(x<=mid)modify(t[p].ls,l,mid,x);
	else modify(t[p].rs,mid+1,r,x);
	t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum;
}
int query(int p,int l,int r,int ql,int qr)
{
	if(p==0)return 0;
	if(ql<=l&&r<=qr)return t[p].sum;
	int mid=(l+r)/2,sum=0;
	if(ql<=mid)sum+=query(t[p].ls,l,mid,ql,qr);
	if(qr>mid)sum+=query(t[p].rs,mid+1,r,ql,qr);
	return sum;
}
void sol()
{
	int n=read();
	for(int i=1;i<=n;i++)a[i].l=read(),a[i].r=read();
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=tot;i++)t[i].ls=t[i].rs=t[i].sum=0;
	tot=0;
	int rt=0;
	for(int i=1;i<=n;i++)
	{
		int l=a[i].l,r=a[i].r,pos=-1;
		while(l<=r)
		{
			int mid=(l+r)/2;
			if(query(rt,1,1000000000,l,mid)<mid-l+1)pos=mid,r=mid-1;
			else l=mid+1;
		}
		if(pos==-1)return puts("No"),void();
		modify(rt,1,1000000000,pos);
	}
	puts("Yes");
}
int main()
{
	int T=read();
	while(T--)sol();
	return 0;
}

F

咕咕咕

G

咕咕咕

H

咕咕咕

上一篇:Atcoder 212D Querying Multiset


下一篇:Atcoder 212G Power Pair