纪中Day4比赛总结
今天比赛差了点,第三题可以拿点部分分的。
T1
刚开始看还以为是水题,结果发现如果真的完全按照题目所说的来做的话,会超时。
我们将A矩阵的每一行压缩的10进制数,但我们发现太大了会炸掉,所以我们18位18位的压缩。同理,我们将B矩阵的每一行压缩,最后A矩阵和B矩阵做与运算,在异或运算,得出结果后马上和C矩阵对比,只要有一个不相同,马上输出NO,退出。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<bitset>//不得不说bitset真的好用
#define maxn 1100
using namespace std;
int T,n,ans;
int a0[maxn],b0[maxn],a1[maxn],b1[maxn],a2[maxn][maxn],b2[maxn][maxn];
bitset<1000> a[maxn],b[maxn],c[maxn],d;
int scin()
{
char ch;
while((ch=getchar())>'1' or ch<'0');
return ch-'0';
}
int main()
{
scanf("%d",&T);
while(T--)
{
for(int i=0;i<1100;++i)
{
a[i].reset();
b[i].reset();
c[i].reset();
d.reset();
}
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
a[i][j]=scin();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
b[j][i]=scin();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
c[i][j]=scin();
bool f=1;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
d=a[i]&b[j];
ans=d.count()&1;
if(ans!=c[i][j])
{
printf("NO");
cout<<endl;
f=0;
break;
}
}
if(f==0) break;
}
if(f==1)
{
printf("YES");
cout<<endl;
}
}
}
T2
暂时没做出来,先跳过。
T3
这道题比赛时没有看到,直接白给。
首先,根据题意我们可以画出下图:
我们用一个结构体保存下每一个三角形的底。因为每个三角形都是等腰直角三角形所以它们的底就等于它们高的两倍:
然后我们以每个三角形的右端点从小到大排序,然后在每个三角形的ab段中查找有哪些三角形的左端点,就可以求出重叠三角形的面积了(注意!可能会有完全包容)。
但是我的代码实现可能有点问题,所以没有过。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<algorithm>
using namespace std;
long double s=0;
int x,y,n,m;
struct triangle
{
long long l,r,far,hight;
}t[100010];
bool cmp(triangle x,triangle y)
{
if(x.l==y.l) return x.r<y.r;
return x.l<y.l;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
s=0;
memset(t,0,sizeof(t));
cin>>m;
for(int j=1;j<=m;j++)
{
cin>>x>>y;
t[j].far=y*2;
t[j].r=x+y;
t[j].l=x-y;
s=s+(long double)(t[j].far*1.0*y)*0.5;
}
sort(t+1,t+m+1,cmp);
for(int j=1;j<m;j++)
{
if(t[j].r<=t[j+1].l) continue;
else
{
if(t[j].r>=t[j+1].r)t[j+1]=t[j];
if(t[j].r<t[j+1].r)
s-=(long double)((t[j].r-t[j+1].l)*1.0*(t[j].r-t[j+1].l)*0.5)*0.5;
}
}
printf("%.2Lf",s);
cout<<endl;
}
}
附样例
T4
又是一道水题,直接暴力模拟。但是注意,当要填充的是数字时,p1=1或p1=2都是一样的。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
using namespace std;
bool zm(string sum1,int k)
{
if(sum1[k]>='a'&&sum1[k]<='z') return 1;
else return 0;
}
bool sz(string sum2,int k1)
{
if(sum2[k1]>='0'&&sum2[k1]<='9') return 1;
else return 0;
}
int main()
{
// freopen("expand.in","r",stdin);
// freopen("expand.out","w",stdout);
int p1,p2,p3;
bool ok=0;
string sum;
cin>>p1>>p2>>p3;
cin>>sum;
for(int i=0;i<sum.size();i++)
{
ok=0;
if(sum[i]=='-')
{
if(int(sum[i+1])-int(sum[i-1])==1)
ok=1;
if(zm(sum,i-1)==1&&zm(sum,i+1)==1&&int(sum[i+1])-int(sum[i-1])>1)
{
if(p1==1)
{
if(p3==1)
{
for(int j=int(sum[i-1])+1;j<=int(sum[i+1])-1;j++)
{
for(int o=1;o<=p2;o++)
cout<<char(j);
}
}
if(p3==2)
{
for(int j=int(sum[i+1])-1;j>=int(sum[i-1])+1;j--)
for(int o=1;o<=p2;o++)
cout<<char(j);
}
}
if(p1==2)
{
if(p3==1)
{
for(int j=int(sum[i-1])+1;j<=int(sum[i+1])-1;j++)
{
for(int o=1;o<=p2;o++)
cout<<char(j-32);
}
}
if(p3==2)
{
for(int j=int(sum[i+1])-1;j>=int(sum[i-1])+1;j--)
for(int o=1;o<=p2;o++)
cout<<char(j-32);
}
}
if(p1==3)
for(int j=int(sum[i-1])+1;j<=int(sum[i+1])-1;j++)
for(int o=1;o<=p2;o++) cout<<"*";
}
else if(sz(sum,i-1)==1&&sz(sum,i+1)==1&&int(sum[i+1])-int(sum[i-1])>1)
{
if(p1==1||p1==2)
{
if(p3==1)
{
for(int j=int(sum[i-1])+1;j<=int(sum[i+1])-1;j++)
{
for(int o=1;o<=p2;o++)
cout<<char(j);
}
}
if(p3==2)
{
for(int j=int(sum[i+1])-1;j>=int(sum[i-1])+1;j--)
for(int o=1;o<=p2;o++)
cout<<char(j);
}
}
if(p1==3)
for(int j=int(sum[i-1])+1;j<=int(sum[i+1])-1;j++)
for(int o=1;o<=p2;o++) cout<<"*";
}
else if(ok==0)
cout<<sum[i];
}
else cout<<sum[i];
}
// fclose(stdin);
// fclose(stdout);
}
总结
今天感觉有点不行,主要是题意没有弄清楚。