zoukankan      html  css  js  c++  java
  • 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
    ",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

    咕咕咕

  • 相关阅读:
    2019年技能学习计划
    EVM项目管理
    常用LINQ关键字用法汇总
    如何让Enum枚举实现异或操作
    使用COM打开Excel文档注意事项
    C#使用NPOI读写Excel的注意事项
    应用国际化多语言化实现方法
    DLL简单分析与调用方法
    C#读写Excel实践笔记
    Vue基础开发笔记
  • 原文地址:https://www.cnblogs.com/juruo-zzt/p/15142083.html
Copyright © 2011-2022 走看看