• Codeforces Round #541 (Div. 2) (A~F)



    Codeforces 1131

    比赛链接

    hack一个暴力失败了两次最后还是没成功身败名裂= = CF跑的也太快了吧...
    不过倒也涨了不少。

    A.Sea Battle

    //想麻烦了,但是无所谓...
    #include <set>
    #include <map>
    #include <cstdio>
    #include <cctype>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    #define mp std::make_pair
    #define pr std::pair<int,int>
    #define pc putchar
    #define gc() getchar()
    typedef long long LL;
    
    inline int read()
    {
    	int now=0,f=1;register char c=gc();
    	for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
    	for(;isdigit(c);now=now*10+c-48,c=gc());
    	return now*f;
    }
    LL c(LL a,LL b)
    {
    	return ((a+4+b)<<1)-4;
    }
    
    int main()
    {
    	LL w1=read(),h1=read(),w2=read(),h2=read();
    	LL ans=c(w1,h1)+c(w2,h2)-((std::min(w1,w2)+2)<<1);
    	printf("%d
    ",ans);
    
    	return 0;
    }
    

    B.Draw!

    //有点不知道说什么...看代码吧...
    #include <set>
    #include <map>
    #include <cstdio>
    #include <cctype>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    #define mp std::make_pair
    #define pr std::pair<int,int>
    #define pc putchar
    #define gc() getchar()
    typedef long long LL;
    const int N=1e5+5;
    
    int A[N],B[N];
    
    inline int read()
    {
    	int now=0,f=1;register char c=gc();
    	for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
    	for(;isdigit(c);now=now*10+c-48,c=gc());
    	return now*f;
    }
    
    int main()
    {
    	int n=read();
    	for(int i=1; i<=n; ++i) A[i]=read(),B[i]=read();
    	LL ans=0;
    	for(int i=1,las=0; i<=n; ++i)
    	{
    		int x=std::max(A[i-1],B[i-1]),y=std::min(A[i],B[i]);
    		x=std::max(x,las), las=y+1;
    		ans+=std::max(y-x+1,0);
    	}
    	printf("%I64d
    ",ans);
    
    	return 0;
    }
    

    C.Birthday

    sort一下从中间往左右依次分配。没证,但感觉就是对的。

    //31ms	0KB
    #include <set>
    #include <map>
    #include <cstdio>
    #include <cctype>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    #define mp std::make_pair
    #define pr std::pair<int,int>
    #define pc putchar
    #define gc() getchar()
    typedef long long LL;
    const int N=1e3+5;
    
    int A[N],B[N];
    
    inline int read()
    {
    	int now=0,f=1;register char c=gc();
    	for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
    	for(;isdigit(c);now=now*10+c-48,c=gc());
    	return now*f;
    }
    
    int main()
    {
    	int n=read();
    	for(int i=1; i<=n; ++i) A[i]=read();
    	std::sort(A+1,A+1+n);
    	int mid=n+1>>1; B[mid]=A[1];
    	for(int i=3,t=mid-1; i<=n; i+=2) B[t--]=A[i];
    	for(int i=2,t=mid+1; i<=n; i+=2) B[t++]=A[i];
    	for(int i=1; i<=n; ++i) printf("%d ",B[i]);
    
    	return 0;
    }
    

    D.Gourmet choice(拓扑排序)

    容易想到拓扑一下分配数字。对于等号,就先把它们合并成一个连通块,再拓扑。
    不合法情况就是同一连通块中出现了><

    //61ms	43900KB
    #include <set>
    #include <map>
    #include <cstdio>
    #include <cctype>
    #include <vector>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #define mp std::make_pair
    #define pr std::pair<int,int>
    #define pc putchar
    #define gc() getchar()
    typedef long long LL;
    const int N=1e6+5,M=1e3+5;
    
    int dgr[N],bel[N],fa[N],Ans[N];
    char s[M][M];
    struct Graph
    {
    	int Enum,H[N],nxt[N],to[N];
    	inline void AE(int u,int v,int f)
    	{
    		dgr[v]+=f, to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
    	}
    }G,T;
    
    inline int read()
    {
    	int now=0,f=1;register char c=gc();
    	for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
    	for(;isdigit(c);now=now*10+c-48,c=gc());
    	return now*f;
    }
    int Find(int x)
    {
    	return x==fa[x]?x:fa[x]=Find(fa[x]);
    }
    bool Check(int n,int m,int cnt)
    {
    	static int q[N];
    	int tot=n+m,h=0,t=0;
    	for(int i=1; i<=n; ++i)
    		for(int j=1; j<=m; ++j)
    			if(bel[i]==bel[j+n]&&s[i][j]!='=') return 0;
    	for(int i=1; i<=cnt; ++i) if(!dgr[i]) q[t++]=i, Ans[i]=1;
    	while(h<t)
    	{
    		int x=q[h++];
    		for(int i=T.H[x],v; i; i=T.nxt[i])
    		{
    			v=T.to[i], Ans[v]=std::max(Ans[v],Ans[x]+1);
    			if(!--dgr[v]) q[t++]=v;
    		}
    	}
    	if(t<cnt) return 0;
    	puts("Yes");
    	for(int i=1; i<=n; ++i) printf("%d ",Ans[bel[i]]);
    	puts("");
    	for(int i=n+1; i<=tot; ++i) printf("%d ",Ans[bel[i]]);
    	return t==cnt;
    }
    
    int main()
    {
    	int n=read(),m=read(),tot=n+m;
    	for(int i=1; i<=tot; ++i) fa[i]=i;
    	for(int i=1; i<=n; ++i)
    	{
    		scanf("%s",s[i]+1);
    		for(int j=1; j<=m; ++j)
    			if(s[i][j]=='>') G.AE(j+n,i,0);
    			else if(s[i][j]=='<') G.AE(i,j+n,0);
    			else fa[Find(i)]=Find(j+n);
    	}
    	int cnt=0;
    	for(int i=1; i<=tot; ++i) if(fa[i]==i) bel[i]=++cnt;
    	for(int i=1; i<=tot; ++i) if(fa[i]!=i) bel[i]=bel[Find(i)];
    	for(int x=1; x<=tot; ++x)
    		for(int i=G.H[x],v; i; i=G.nxt[i])
    			if(bel[x]!=bel[v=G.to[i]]) T.AE(bel[x],bel[v],1);
    	if(!Check(n,m,cnt)) puts("No");
    
    	return 0;
    }
    

    E.String Multiplication(思路)

    从后往前对最后一个字符串(p_n)的前后缀是否相同讨论一下。具体看这里吧不想写了= =
    可以像上面那样递归去做,也可以从(p_1)往后递推。因为用到的是某个字符的最长连续子串,所以令(f[i][j])表示(p_1cdot p_2cdot...cdot p_i)(j)字符的最长连续长度,转移时判一下(p_{i+1})是否都是由(j)字符构成的,是就用(len imes(f[i][j]+1)+f[i][j])更新,否则用(1+j字符的最长前后缀)更新((p_{i-1})中含(j)字符才能转移)。
    复杂度(O(sum|p_i|))(递归)或(O(26sum|p_i|))(递推)(然而前者常数比较大)。

    //46ms	10100KB
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define S 26
    typedef long long LL;
    const int N=1e5+5;
    
    int f[N][S],pre[S],suf[S];
    char s[N];
    
    void Solve(int *f)
    {
    	scanf("%s",s+1);
    	int l=strlen(s+1);
    	for(int j=0; j<S; ++j)
    	{
    		int mx=0;
    		for(int i=1,cnt=0; i<=l; ++i)
    			if(s[i]==j+'a') mx=std::max(mx,++cnt);
    			else cnt=0;
    		f[j]=mx, pre[j]=suf[j]=0;
    		for(int i=1; i<=l; ++i)
    			if(s[i]==j+'a') ++pre[j];
    			else break;
    		for(int i=l; i; --i)
    			if(s[i]==j+'a') ++suf[j];
    			else break;
    	}
    }
    
    int main()
    {
    	int n; scanf("%d",&n);
    	Solve(f[1]);
    	for(int i=2; i<=n; ++i)
    	{
    		Solve(f[i]);
    		int l=strlen(s+1);
    		for(int j=0; j<S; ++j)
    			if(f[i-1][j])
    				if(pre[j]!=l) f[i][j]=std::max(f[i][j],pre[j]+suf[j]+1);
    				else f[i][j]=std::max(f[i][j],l*(f[i-1][j]+1)+f[i-1][j]);
    	}
    	int ans=0;
    	for(int i=0; i<S; ++i) ans=std::max(ans,f[n][i]);
    	printf("%d
    ",ans);
    
    	return 0;
    }
    

    F.Asya And Kittens(链表)

    容易发现只要模拟一下按顺序合并连通块即可。可以用vector+启发式合并,也可以链表。用链表复杂度(O(nalpha(n)))

    //78ms	1600KB
    #include <set>
    #include <map>
    #include <cstdio>
    #include <cctype>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    #define mp std::make_pair
    #define pr std::pair<int,int>
    #define pc putchar
    #define gc() getchar()
    typedef long long LL;
    const int N=150005;
    
    int fa[N],R[N],ed[N];
    
    inline int read()
    {
    	int now=0,f=1;register char c=gc();
    	for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
    	for(;isdigit(c);now=now*10+c-48,c=gc());
    	return now*f;
    }
    int Find(int x)
    {
    	return x==fa[x]?x:fa[x]=Find(fa[x]);
    }
    
    int main()
    {
    	int n=read();
    	for(int i=1; i<=n; ++i) fa[i]=ed[i]=i;
    	for(int i=1; i<n; ++i)
    	{
    		int x=read(),y=read();
    		int r1=Find(x),r2=Find(y);
    		fa[r2]=r1, R[ed[r1]]=r2, ed[r1]=ed[r2];
    	}
    	for(int i=1; i<=n; ++i)
    		if(fa[i]==i)
    		{
    			for(int x=i; x; x=R[x]) printf("%d ",x);
    			break;
    		}
    
    	return 0;
    }
    

    G.Most Dangerous Shark

    待填坑(怕是永远也填不上了)

    
    
  • 相关阅读:
    Oracle 10g 体系结构及安全管理
    Oracle 10g数据库概述
    jQuery Ajax应用
    ASP.NET Ajax核心对象
    ASP.NET XML
    jQuery插件的使用和编写
    jQuery中的Ajax应用
    弹窗下面的页面滚动问题
    报文过长,华为手机自动拦截报文
    手机抓包 配置步骤
  • 原文地址:https://www.cnblogs.com/SovietPower/p/10425364.html
Copyright © 2020-2023  润新知