暑训记录7.19

早上

终于把前天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哭了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值