早上
终于把前天cf的d题补完了。
cf733 D.Secret Santa
题目思路
我们用b数组储存操作后的数组。我们用vector储存每个a[i]出现的位置,并且令b[i]=vector[a[i]][0]。然后我们用数组储存没有出现过的数。之后我们遍历b数组,如果b[i]==0,我们将队列头部赋值给b[i]。如果这是b[i]等于队列头部的值x,那么我们把b[i]=a[i],a[i]原本来的位置等于x,这样下来两个位置都不会存在相同的情况,并且不会减少b[i]==a[i]的情况数
ac代码
int n;
int a[maxn];
int b[maxn];
int vis[maxn];
int pos[maxn];
vector<int>vec[maxn];
queue<int>q,p;
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)vis[i]=0,b[i]=0;
for(int i=1;i<=n;i++)vec[i].clear(),vis[i]=0,pos[i]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
vec[a[i]].push_back(i);
vis[a[i]]=1;
}
for(int i=1;i<=n;i++)
{
int flag=0;
for(int j=0;j<vec[i].size();j++)
{
int x=vec[i][j];
b[x]=i;
pos[i]=x;
flag=1;
break;
}
}
//for(int i=1;i<=n;i++)printf("%d ",b[i]);
int cnt=0;
for(int i=1;i<=n;i++)
{
if(!vis[i])q.push(i);
}
for(int i=1;i<=n;i++)
{
if(b[i])continue;
int x=q.front();
q.pop();
b[i]=x;
if(i==x)
{
b[i]=a[i];
int y=pos[a[i]];
b[y]=x;
pos[a[i]]=i;
pos[x]=y;
}
}
int ans=0;
for(int i=1;i<=n;i++)
if(a[i]==b[i])ans++;
printf("%d\n",ans);
for(int i=1;i<=n;i++)printf("%d ",b[i]);
printf("\n");
while(!q.empty())
q.pop();
}
}
Edu104 D. Pythagorean Triples
题目思路
根据题目公式可知,需满足a2+b2=c2和a2=b+c
我们打表发现所有的a均为奇数并且c=b+1
所以我们枚举a当c>n时让答案减1并输出就好了
因为数据范围到1e9,所以我们从sqrt(n)开始枚举a
ac代码
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
ll n;
scanf("%lld",&n);
ll xx=sqrt(n);
if(xx%2==0)xx++;
ll ans=0;
while(1)
{
ll tem=xx*xx/2+1;
if(tem>n)
{
ans=xx/2-1;
break;
}
xx+=2;
}
printf("%lld\n",ans);
}
下午
每次多校都要带上痛苦面具
二十分钟过了两道签到题。
然后开始挂机。
qc开始摆烂。
偷听了下 其他队的想法,发现k题跟之前碰到过的一道线段树上二分很像,就跑去写了。
然后很自然的wa了。开始找特殊数据,很幸运地半个多小时就找到了。
但是不会改。又想思路,改代码花了一个多小时。耗时三个小时a了k题。。。
然后听说i题是模拟,就去写了下,一直到结束
晚上
听讲题的大佬说,有五道签到题。。
果然我还是太菜了。
然后i题写了三个小时,最后段错误,最后会长帮我找到了bug哭了