头像

于于

进击的蒻蒻




离线:4分钟前


最近来访(215)
用户头像
pacer
用户头像
yufei
用户头像
acmdyh
用户头像
Hxxj
用户头像
用户头像
nano
用户头像
EastofEden
用户头像
Alkali20001011
用户头像
aaacj
用户头像
西京医院神经科李主任
用户头像
自律
用户头像
溺水的鱼_6
用户头像
wyzde18
用户头像
......_519
用户头像
Douglas_4
用户头像
大锤_8
用户头像
不care
用户头像
野花
用户头像
i_33
用户头像
thejohn


于于
13小时前

感觉看起来是个大模拟
模拟每次操作,因为我们无法判断是d模式还是t模式
所以这里要将两次操作分开,然后在进行排序因为针对t或者d内部肯定越小越早变化
然而如何判断t与d就需要我们进行分别计算所需要的时间然后进行一一枚举
这里就像二路归并排序般一一进行选取


#include<iostream>
#include<algorithm>
using namespace std;
int a[10010],b[10010];
int n,res,q,p;
double l,t;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        char x;
        int y;
        cin>>x>>y;
        if(x=='T')a[q++]=y;
        else b[p++]=y;
    }
    sort(a,a+q);
    sort(b,b+p);
    int q1=0,p1=0,v=1;
    while(q1<q&&p1<p)
    {
        double t1=a[q1]-t;
        double t2=(b[p1]-l)*v;
        if(t1<t2)
        {
            l+=(a[q1]-t)/v;
            t=a[q1++];
            v++;
        }
        else if(t1>t2)
        {
            t+=t2;
            l=b[p1++];
            v++;
        }
        else
        {
            t=a[q1++];
            l=b[p1++];
            v+=2;
        }
    }
    //想想归并排序,若全从一路会导致另一路还有剩余
    while(q1<q)
    {
        l+=(a[q1]-t)/v;
        t=a[q1++];
        v++;
    }
    while(p1<p)
    {
        t+=(b[p1]-l)*v;
        l=b[p1++];
        v++;
    }
    printf("%0.lf",t+(1000-l)*v);
    return 0;
}



活动打卡代码 AcWing 1934. 贝茜放慢脚步

于于
13小时前
//看起来是个大模拟
#include<iostream>
#include<algorithm>
using namespace std;
int a[10010],b[10010];
int n,res,q,p;
double l,t;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        char x;
        int y;
        cin>>x>>y;
        if(x=='T')a[q++]=y;
        else b[p++]=y;
    }
    sort(a,a+q);
    sort(b,b+p);
    int q1=0,p1=0,v=1;
    while(q1<q&&p1<p)
    {
        double t1=a[q1]-t;
        double t2=(b[p1]-l)*v;
        if(t1<t2)
        {
            l+=(a[q1]-t)/v;
            t=a[q1++];
            v++;
        }
        else if(t1>t2)
        {
            t+=t2;
            l=b[p1++];
            v++;
        }
        else
        {
            t=a[q1++];
            l=b[p1++];
            v+=2;
        }
    }
    //想想归并排序,若全从一路会导致另一路还有剩余
    while(q1<q)
    {
        l+=(a[q1]-t)/v;
        t=a[q1++];
        v++;
    }
    while(p1<p)
    {
        t+=(b[p1]-l)*v;
        l=b[p1++];
        v++;
    }
    printf("%0.lf",t+(1000-l)*v);
    return 0;
}

//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~


活动打卡代码 AcWing 4211. 序列重排

于于
19小时前
#include<iostream>
#include<unordered_map>
using namespace std;
typedef long long ll;
unordered_map<ll,ll>mp;
int n;
bool falg;
ll a[110],b[110];
void dfs(ll s,int u)
{
    if(u==n)
    {
        for(int i=1;i<=n;i++)cout<<b[i]<<" ";
        falg=true;
        return;
    }
    ll x=s*2,y=s/3;
    if(mp[x]==1)
    {
        mp[x]=0;
        b[u+1]=x;
        dfs(x,u+1);
        mp[x]=1;
    }
    if(s%3==0&&mp[y]==1)
    {
        mp[y]=0;
        b[u+1]=y;
        dfs(y,u+1);
        mp[y]=1;
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        mp[a[i]]=1;
    }

    for(int i=1;i<=n;i++)
    {
        if(falg)break;
        mp[a[i]]=0;
        b[1]=a[i];
        dfs(a[i],1);
        mp[a[i]]=1;
    }
    return 0;
}
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~


活动打卡代码 AcWing 4210. 数字

于于
20小时前
#include<iostream>
using namespace std;
int n;
int res;
int gcd(int a,int b)
{
    if(a==0)return b;
    else return gcd(b%a,a);
}
int main()
{
    cin>>n;
    for(int i=n-1;i>=2;i--)
    {
        int x=n,j=i;
        while(x)
        {
            res+=(x%j);//先进行mod然后取得是最后一位
            x/=j;//然后进行整除
        }//将十进制转换为某个进制
    }
    int x=gcd(res,n-2);
    cout<<res/x<<"/"<<(n-2)/x;
}
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~


活动打卡代码 AcWing 4209. 三元组

于于
20小时前
#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int x=0,y=0,z=0;
    for(int i=1;i<=n;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        x+=a,y+=b,z+=c;
    }
    if(x==0&&y==0&&z==0)cout<<"YES";
    else cout<<"NO";
}
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~



于于
2天前

可知n的范围比较小,所以我们可以直接进行枚举
有因为数字也比较小,也不用离散化,直接用数组存储即可
然后进行枚举,枚举中间的奶牛,一一进行枚举前面那头的
然后获得两个范围,再二分出中间的奶牛即可
但是这里有一个细节,我们需要两个二分
一个用来获取小于等于x的最大值
一个用来获取大于等于x的最小值


#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e3+10;
int a[N];
int n,res;
int ef(int x)
{
    int l=1,r=n;
    while(l<r)
    {
        int mid=l+r>>1;
        if(a[mid]>=x)r=mid;
        else l=mid+1;
    }
    return l;
}
int ed(int x)
{
    int l=1,r=n;
    while(l<r)
    {
        int mid=l+r+1>>1;
        if(a[mid]<=x)l=mid;
        else r=mid-1;
    }
    return l;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
    {
        if(i==n)continue;
        for(int j=i-1;j>=1;j--)
        {
            int x=a[i],y=a[j];
            if(2*x-y>a[n])continue;
            int a=ed(3*x-2*y),b=ef(2*x-y);
            if(b>a)continue;
            res+=(a-b+1);
        }
    }
    cout<<res;
}


活动打卡代码 AcWing 1945. 奶牛棒球

于于
2天前

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e3+10;
int a[N];
int n,res;
int ef(int x)
{
    int l=1,r=n;
    while(l<r)
    {
        int mid=l+r>>1;
        if(a[mid]>=x)r=mid;
        else l=mid+1;
    }
    return l;
}
int ed(int x)
{
    int l=1,r=n;
    while(l<r)
    {
        int mid=l+r+1>>1;
        if(a[mid]<=x)l=mid;
        else r=mid-1;
    }
    return l;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
    {
        if(i==n)continue;
        for(int j=i-1;j>=1;j--)
        {
            int x=a[i],y=a[j];
            if(2*x-y>a[n])continue;
            int a=ed(3*x-2*y),b=ef(2*x-y);
            if(b>a)continue;
            res+=(a-b+1);
        }
    }
    cout<<res;
}
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~



于于
2天前

我们发现这个是连续的三个区间
每只奶牛在不同的区间会贡献不同的牛奶
我们可以发现有点像我们写过的岛
通过进行每头奶牛在各区间的贡献量,然后进行前缀和即可计算出答案


#include<iostream>
#include<map>
using namespace std;
map<int ,int >mp;
int n,x,y,z;
int main()
{
    cin>>n>>x>>y>>z;
    for(int i=1;i<=n;i++)
    {
        int a,b;
        cin>>a>>b;
        mp[0]+=x;
        mp[a]=mp[a]+y-x;
        mp[b+1]=mp[b+1]+z-y;//注意这里要加一,因为b+1才会变成z
    }
    int res=0,ma=0;
    for(auto s:mp)
    {
        res+=s.second;
        ma=max(ma,res);
    }
    cout<<ma;
}



于于
2天前

#include<iostream>
#include<map>
using namespace std;
map<int ,int >mp;
int n,x,y,z;
int main()
{
    cin>>n>>x>>y>>z;
    for(int i=1;i<=n;i++)
    {
        int a,b;
        cin>>a>>b;
        mp[0]+=x;
        mp[a]=mp[a]+y-x;
        mp[b+1]=mp[b+1]+z-y;//注意这里要加一,因为b+1才会变成z
    }
    int res=0,ma=0;
    for(auto s:mp)
    {
        res+=s.second;
        ma=max(ma,res);
    }
    cout<<ma;
}
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~



于于
2天前

这里要注意一下虽然b的个数很多但实际的状态数目很少
所以一定会有重复的
然后就爆搜即可


#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll ;
ll n,m;
const int N=1<<16;
int f[N];
int upda(int res)
{
    int x=0;
    for(int i=0;i<n;i++)
    {
        int j=(i-1+n)%n;
        int a=res>>i&1,b=res>>j&1;
        x|=(a^b)<<i;
    }
    return x;
}
void print(int res)
{
    for(int i=0;i<n;i++)
    {
        cout<<(res>>i&1)<<endl;
    }
}
int main()
{
    cin>>n>>m;
    int res=0;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        res|=x<<i;
    }
    memset(f,-1,sizeof f);
    f[res]=0;
    for(int i=1;;i++)
    {
        res=upda(res);
        if(i==m)
        {
            print(res);
            break;
        }
        else if(f[res]==-1)f[res]=i;
        else
        {
            int len=i-f[res];
            int x=(m-i)%len;
            while(x--)res=upda(res);
            print(res);
            break;
        }
    }
    return 0;
}