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} \not=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\n",ans);
	return 0;
}

其他

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

回来再补上

\[The \quad End \]

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

posted @ 2019-10-21 09:18  云山乱  阅读(242)  评论(0编辑  收藏  举报