• XR-4 div2 总结


    写在前面

    又是什么都不会系列(QAQ),lb.png

    T1模拟赛

    链接

    Idea

    这就是一道模拟题。题目背景如题面所述。

    开始的时候脑子木掉了,想了十几分钟

    然后发现十分简单。我的思路如下

    (a[i][j])表示第(i)个人第(j)天做的第(k)套题

    (b[i][j])表示第(i)天的第(j)套题是否有人做,有就是1,没有就是0

    (ans[i])表示第(i)天要做几套题。复杂度(O(nm+nk))

    (ans[i]+=b[i][j])即可

    Code

    //比赛时 时空 19ms,4.87MB
    int n,m,k;
    int a[maxn][maxn],ans[maxn];
    bool b[maxn][maxn];
    int main(){
    	n=read(); m=read(); k=read();
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			int x=read();
    			a[i][x]=j;
    		}	
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=k;j++){
    			b[j][a[i][j]]=1; 
    		}
    	}
    	for(int i=1;i<=k;i++)
    	for(int j=1;j<=m;j++){
    		ans[i]+=b[i][j];
    	}
    	for(int i=1;i<=k;i++) printf("%d ",ans[i]);
    	return 0;
    } 
    

    T2歌唱比赛

    链接

    Idea

    构造题。

    思路很简单:

    (s[i]=K)时,(x[i]=y[i]=0),

    (s[i]=X)时,(x[i]=1,y[i]=0)

    (s[i]=Y)时,(x[i]=0,y[i]=1)

    如何判断无解?

    很简单,比如对于XYXZZZZ,有解;对于ZYXZ,无解

    因为ZXYZ的话,根据我的构造方法,x=0100;y=0010,

    但是与ZXYZ相矛盾;所以无解。

    那就是说如果当前位为Z,那么这一位往后的字符都得是Z

    (我讲的不是很清楚,不懂的同学请自己手写cy.png

    于是,就有了一种判断方法

    //倒序枚举,第i位是Z时
    for(int j=1;j<i;j++)
        if(s[i]!='Z') return puts("-1"),0;
    

    显然超时。

    于是我们可以开一个flag,记录当前位是否是Z,是则为1,不是则为0;

    每次扫到Z时判断下即可,具体见代码cy.png

    Code

    char s[maxn],x[maxn],y[maxn];
    bool flag=1;
    int main(){
    	scanf("%s",s+1);
    	int len=strlen(s+1);
    	for(int i=len;i;i--){
    		if(s[i]=='Z'){
    			if(!flag) return printf("-1"),0;
    			x[i]=y[i]='0'; 
    		}		
    		if(s[i]=='X'){
    			flag=0;
    			x[i]='1'; y[i]='0';
    		}
    		if(s[i]=='Y'){
    			flag=0;
    			x[i]='0'; y[i]='1';
    		}
    	}
    	printf("%s",x+1);
    	puts("");
    	printf("%s",y+1);
    	return 0;
    }
    

    T3题

    链接

    Idea

    考场上只会(inf)的做法,,于是只有(3 pts);

    结束的时候想出了正解(雾?解题过程如下

    解法一

    观察式子:(y^2-x^2=ax+b)

    于是我想出消掉(y)。设(y=x+k,k ge 0),显然有(y ge x)

    代入,化简得:(2kx+k^2=ax+b)

    变为关于(x)的式子,为((2k-a)x=b-k^2)

    • (2k-a=0 And And b-k^2=0)时,(0=0).所以(forall x in mathbb N),方程恒成立,即 (displaystyle frac{a}{2}=sqrt b)时,方程有无数组解

    • (displaystyle frac{a}{2} ot=b)时,(x=displaystyle frac{b-k^2}{2k-a},x ge 0)。将(k)看作主元,可得

      • (displaystyle frac{a}{2} lt sqrt{b})时,(displaystyle k in (frac{a}{2},sqrt{b} ])

      • (displaystyle frac{a}{2} gt sqrt{b})时,(displaystyle k in [sqrt{b},frac{a}{2}))

    然后可以根据范围枚举(k),因为(y=x+k),所以每得到一个(x),就会得到一组解。然后,注意精度造成的影响,就没了。看戏1.jpg

    解法二

    同学想到的。

    就是先把已知式子配方,即(displaystyle y^2-(x+frac{a}{2})^2=frac{4b-a^2}{4})

    化简得(displaystyle (2y+2x+a)(2y-2x-a)=4b-a^2)

    然后判断(4b-a^2)的正负,若(4b-a^2=0),则输出(inf)

    枚举(4b-a^2)的因子,再求解相应的(x,y),符合要求则(ans++)

    然后,又没了看戏1.jpg

    复杂度大概都在(O(displaystyle min(frac{a}{2},sqrt{b})))。。。。吧。。

    Code

    (Code1)

    int ans;
    signed main(){
    	int a=read(),b=read();
    	int sq=sqrt(b),q=a/2;
        if(sq*sq==b&&sq*2==a) printf("inf");
        else if(a==1&&b==0) printf("1");
        else if(sq>=q){
            for(int i=q+1;i<=sq;i++)
                if((abs(b-i*i))%(abs(2*i-a))==0) ans++;
            printf("%lld",ans);
        }
        else{
            int ed=(q*2==a)?(q-1):(q);
            for(int i=sq;i<=ed;i++)
                if((abs(b-i*i))%(abs(2*i-a))==0) ans++;
            printf("%lld",ans);
        }
    	return 0;
    }
    

    (Code2)

    //同学的代码,压了压行,请见谅
    const int sea=1e5+7;
    int a,b,ans=0;
    bool check(int A,int B){
    	if((A+B)%2!=0||(B-A)%2!=0) return 0;
    	int x,y;y=(A+B)/2;x=(B-A)/2;
    	if(x<0||y<0) return 0; else return 1;
    }
    bool check1(int A,int B){
    	if((A+B)%2!=0||(B-A)%2!=0) return 0;
    	int x,y;x=(A+B)/2;y=(B-A)/2;
    	if(x<0||y<0) return 0;else return 1;
    }
    signed main(){
    	a=read(); b=read();  int xx=4*b-a*a; if(!xx) {puts("inf");return 0;}
    	if(xx>=0){ 
    		for(int i=1;i<=sqrt(xx);i++){
    			if(xx%i==0){
    				if((i+a)%2!=0||(xx/i-a)%2!=0) continue;
    				int A=(i+a)/2,B=(xx/i-a)/2;
    				if(check(A,B)) ans++;
    			}
    		}
    	}
    	else{
    		xx=-xx;
    		for(int i=1;i<=sqrt(xx);i++){
    			if(xx%i==0){
    				if((i-a)%2!=0||(xx/i-a)%2!=0) continue;
    				int A=(i-a)/2,B=(xx/i-a)/2;
    				if(check1(A,B)) ans++; 
    			}
    		}
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    

    其他

    余下两题不会/写lb.png,还是我太菜kk.png

    回来再补上

    [The quad End ]

    [ ext{只要有心就能看见.从白云看到,不变蓝天;从风雨寻回,梦的起点.-《梦想天空分外蓝》陈奕迅} ]

  • 相关阅读:
    P5283 [十二省联考2019]异或粽子 可持久化字典树
    P3293 [SCOI2016]美味 最大异或值 主席树
    P4735 最大异或和 可持久化trie树
    P4551 最长异或路径 trie树
    html/css静态网页制作
    在一个div里,列表样式图片进行float,实现水平排序
    css的网页布局用position
    您右下角有份、、、
    登录注册页面和页面跳转
    相对路径 绝对路径
  • 原文地址:https://www.cnblogs.com/cbyyc/p/11711341.html
Copyright © 2020-2023  润新知