• 【AtCoder】 ARC 099


    C-Minimization

    枚举覆盖(1)的区间,两边的次数直接算

    #include<bits/stdc++.h>
    #define ll long long
    #define dbg1(x) cerr<<#x<<"="<<(x)<<" "
    #define dbg2(x) cerr<<#x<<"="<<(x)<<"
    "
    #define dbg3(x) cerr<<#x<<"
    "
    using namespace std;
    #define reg register
    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    	return x*f;
    }
    const int MN=1e5+5;
    int N,K,P;
    int main()
    {
    	N=read(),K=read();
    	reg int i,ans=N;
    	for(i=1;i<=N;++i) read()==1?P=i:0;
    	for(i=1;i<=K;++i)if(P>=i&&P+K-i<=N)
    		ans=min(ans,1+(P-i+K-2)/(K-1)+(N-P-K+i+K-2)/(K-1));
    	printf("%d
    ",ans);
    }
    



    D-Snuke Numbers

    答案的序列是(1,2,3,4,5,6,7,8,9,19,29,39,..,99,199,299,399...)

    发现每次的增量都是(10^{i}),所以每次比较一下(frac{now+10^i}{S(now+10^i)})(frac{now+10^{i+1}}{S(now+10^{i+1})})

    看下一个是加(10^i)还是(10^{i+1})

    #include<bits/stdc++.h>
    #define ll long long
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    	return x*f;
    }
    ll D[18],d,now=1;
    ll get_now(ll p){ll r=0;for(;p;r+=p%10,p/=10);return r;}
    int main()
    {
    	D[0]=1;
    	for(int i=1;i<=17;++i) D[i]=D[i-1]*10ll;
    	int n=read();
    	while(n--)
    	{
    		printf("%lld
    ",now);
    		if((now+D[d])*get_now(now+2*D[d])>(now+D[d]*2)*get_now(now+D[d])) d++;
    		now+=D[d];
    	}
    	return 0;
    }
    



    E-Independence

    考虑原图的返图,答案存在当且仅当它是一个二分图

    将二分图的每个联通块黑色和白色的数量求出来,(dp)算出最后一个块的大小是否可以是(i)

    对所有可行方案求出一个最小值即可

    #include<bits/stdc++.h>
    #define ll long long
    #define dbg1(x) cerr<<#x<<"="<<(x)<<" "
    #define dbg2(x) cerr<<#x<<"="<<(x)<<"
    "
    #define dbg3(x) cerr<<#x<<"
    "
    using namespace std;
    #define reg register
    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    	return x*f;
    }
    const int MN=705;
    int N,M;
    bool G[MN][MN],vis[MN],col[MN],f[MN][MN];
    int num[2][MN],T;
    void dfs(int x)
    {
    	++num[col[x]][T];vis[x]=true;reg int i;
    	for(i=1;i<=N;++i)if(i!=x&&!G[x][i])
    	{
    		if(!vis[i])col[i]=col[x]^1,dfs(i);
    		else if(col[i]==col[x]) {puts("-1");exit(0);}
    	}
    }
    int cal(int x,int y){return (x*(x-1)+y*(y-1))/2;}
    int main()
    {
    	N=read();M=read();
    	reg int i,j,x,y;
    	for(i=1;i<=M;++i) x=read(),y=read(),G[x][y]=G[y][x]=1;
    	for(i=1;i<=N;++i)if(!vis[i])++T,dfs(i);
    	f[0][0]=1;
    	for(i=0;i<T;++i)for(j=0;j<=N;++j)
    		f[i+1][j+num[0][i+1]]|=f[i][j],
    		f[i+1][j+num[1][i+1]]|=f[i][j];
    	int ans=MN*MN;
    	for(i=0;i<=N;++i)if(f[T][i])ans=min(ans,cal(i,N-i));
    	return 0*printf("%d
    ",ans);
    }
    



    F-Eating Symbols Hard

    字符串(Hash),求出全部操作后的字符串的哈希值,把它插入(map)

    [hash=sum_{i=-1e9}^{1e9} A_i x^i ]

    求出当前前缀操作后字符串的哈希值(num)(ans+=map[num])

    求出一段当前前缀操作后再执行总操作的哈希值,把它插入(map)

    可以定义(num)是有(6)个元素的结构体,包含分别用(6)个底数求出的哈希值

    #include<bits/stdc++.h>
    #define ll long long
    #define dbg1(x) cerr<<#x<<"="<<(x)<<" "
    #define dbg2(x) cerr<<#x<<"="<<(x)<<"
    "
    #define dbg3(x) cerr<<#x<<"
    "
    using namespace std;
    #define reg register
    const int MN=250005;
    int N;
    char s[MN];
    const int P=998244353;
    int Add(int x,int y){return (x+y)%P;}
    int Mul(int x,int y){return (1ll*x*y)%P;}
    const int B[]={691,769,823,877,911,967},
    inv[]={37560569,983965175,992179685,349442436,115055606,356147158};
    struct node
    {
    	int v[6];
    	int& operator [](int x){return v[x];}
    	bool operator <(const node o)const
    	{
    		for(int i=0;i<6;++i)if(v[i]!=o.v[i])return v[i]<o.v[i];
    		return false;
    	}
    	bool operator ==(const node o)const
    	{
    		for(int i=0;i<6;++i)if(v[i]!=o.v[i])return false;
    		return true;
    	}
    }pre[MN],all;
    std::map<node,int> Mp;
    int pos[MN],nm[6][MN<<1],cal[MN];
    node get(node x,node y,int p)
    {
    	for(int j=0;j<6;++j)
    		x[j]=Add(x[j],Mul(y[j],nm[j][p]));
    	return x;
    }
    int main()
    {
    	scanf("%d%s",&N,s+1);
    	reg int i,j,k;
    	for(j=0;j<6;++j)for(nm[j][MN]=i=1;i<=N;++i)
    		nm[j][i+MN]=Mul(nm[j][i-1+MN],B[j]),
    		nm[j][-i+MN]=Mul(nm[j][-i+1+MN],inv[j]);
    	for(k=j=0;j<6;++j,k=0)for(i=1;i<=N;++i)
    	{
    		switch(s[i])
    		{
    			case '<':--k;break;
    			case '>':++k;break;
    			case '+':all[j]=Add(all[j],nm[j][k+MN]);break;
    			case '-':all[j]=Add(all[j],P-nm[j][k+MN]);break;
    		}
    		pos[i]=k;pre[i][j]=all[j];
    	}
    	++Mp[all];
    	for(i=1;i<=N;++i)
    		cal[i]=Mp[pre[i]],
    		++Mp[get(pre[i],all,pos[i]+MN)];
    	ll ans=0;
    	for(i=1;i<=N;++i) ans+=cal[i];
    	return 0*printf("%lld
    ",ans);
    }
    


    Blog来自PaperCloud,未经允许,请勿转载,TKS!

  • 相关阅读:
    勿忘心安
    设△ABC的内角A,B,C,所对的边分别为a,b,c,且acosB-bcosA=3/5c,则tan(A-B)的最大值为
    P1011 车站
    第一天
    P1134 阶乘问题
    P3152 正整数序列
    某数论
    DO YOU WANNA BUILD A SNOW MAN ?
    luogu P1579 哥德巴赫猜想(升级版)
    紫书 习题 10-25 UVa 1575 (有重复元素的全排列+暴搜)
  • 原文地址:https://www.cnblogs.com/PaperCloud/p/11394089.html
Copyright © 2020-2023  润新知