A题:
水题,特判是否为奇数,奇数则为0
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n;
int a,b;
while(scanf("%d",&n)==1)
{
if(n%2==1)printf("0\n");
else
{
a=n/2;
b=(a-1)/2;
printf("%d\n",b);
}
}
return 0;
}
B题:
水题,给出n种颜色的数量,选取一种颜色开始给方块涂色,并按顺序使用这些颜色,直到有颜色没有了,问可以涂多少矩阵。
涂色数量显然受限制最少的颜色数量,要更多涂色则要选择离最少颜色更靠左的颜色开始,记得开头和结尾是相连的。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long
const int maxn=200000+10;
ll a[maxn];
int main()
{
int n;
ll minv;
int cot;
while(scanf("%d",&n)==1)
{
minv=2000000000;
for(int i=0;i<n;i++)
{
scanf("%I64d",&a[i]);
minv=min(minv,a[i]);
}
cot=0;
bool flag=false;
int temp=0;
int ans=0;
for(int i=n-1;i>=0;i--)
{
if(a[i]==minv)
{
ans=max(ans,cot);
if(!flag)
{
temp=cot;
flag=true;
}
cot=0;
}
else cot++;
}
ans=max(ans,temp+cot);
printf("%I64d\n",n*minv+ans);
}
return 0;
}
C题:
给出k,构建2^k个相互正交的2^k维向量。(向量元素值只有1和-1)(有个叫Hadamard Matrix的矩阵)
在别人助攻下做出来的。
首先假设已经构造了矩阵A(k)
然后A(k+1)=易证明,这是成立的。
#include <iostream>
#include <cstdio>
using namespace std;
bool ans[10][522][522];
int main()
{
ans[0][0][0]=0;
for(int i=1;i<10;i++)
{
for(int j=0;j<1<<(i-1);j++)
{
for(int k=0;k<1<<(i-1);k++)
{
ans[i][j][k]=ans[i][j][k+(1<<(i-1))]=ans[i][j+(1<<(i-1))][k+(1<<(i-1))]=ans[i-1][j][k];
ans[i][j+(1<<(i-1))][k]=!ans[i-1][j][k];
}
}
}
int n;
bool flag=false;
while(scanf("%d",&n)==1)
{
flag=true;
for(int i=0;i<1<<n;i++)
{
for(int j=0;j<1<<n;j++)
putchar(ans[n][i][j]?'*':'+');
putchar('\n');
}
}
return 0;
}
D题:
线段树+扫描线模板题
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define lson(i) i<<1
#define rson(i) (i<<1)+1
const int maxn=10 + 2e5;
struct Node
{
int x1,x2,y;
int c;
Node(){}
Node(int x1,int x2,int y,int c):x1(x1),x2(x2),y(y),c(c){}
bool operator<(const Node& b)const
{
return y>b.y;
}
}line[maxn<<1];
int sum[maxn<<3];
int flag[maxn<<3];
int x[maxn<<1];
int ql,qr;
void push_up(int i,int l,int r)
{
if(flag[i])sum[i]=x[r]-x[l-1];
else if(l==r)sum[i]=0;
else sum[i]=sum[lson(i)]+sum[rson(i)];
}
void update(int i,int l,int r,int c)
{
if(ql<=l&&r<=qr)
{
flag[i]+=c;
push_up(i,l,r);
}
else
{
int m=l+(r-l)/2;
if(ql<=m)update(lson(i),l,m,c);
if(m<qr)update(rson(i),m+1,r,c);
push_up(i,l,r);
}
}
int bfind(int l,int r,int v)
{
int m;
while(l<r)
{
m=l+(r-l)/2;
if(x[m]<v)l=m+1;
else r=m;
}
return l;
}
int main()
{
//printf("%d\n",maxn);
int n;
int x1,y1,x2,y2;
int cot;
while(scanf("%d",&n)==1)
{
cot=0;
memset(flag,0,sizeof(flag));
memset(sum,0,sizeof(sum));
for(int i=0;i<n;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1>x2)swap(x1,x2);
if(y1<y2)swap(y1,y2);
line[cot]=Node(x1-1,x2,y1,1);
x[cot++]=x1-1;
line[cot]=Node(x1-1,x2,y2-1,-1);
x[cot++]=x2;
}
sort(x,x+cot);
sort(line,line+cot);
int k=0;
long long ans=0;
for(int i=1;i<cot;i++)
if(x[i]!=x[i-1])x[++k]=x[i];
for(int i=0;i<cot-1;i++)
{
ql=bfind(0,k,line[i].x1)+1;
qr=bfind(0,k,line[i].x2);
update(1,1,k,line[i].c);
ans+=(long long)sum[1]*(line[i].y-line[i+1].y);
}
printf("%I64d\n",ans);
}
return 0;
}