2020CCPC网络赛 HUD6888-6900部分

1003

签到题

#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri{int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=1e6+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;

int arr[N],n,m,k;
ll solve()
{
    cin>>n>>m>>k;
    for(int i=0;i<m;i++)
        cin>>arr[i];
    sort(arr,arr+m);
    ll ret=k-1;
    ret+=arr[0]-1+abs(k-arr[0]);
    for(int i=1;i<m;i++)
        ret+=abs(k-arr[i])*2;
    return ret;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
//    freopen("in.txt","r",stdin);
    int _;cin>>_;
    while(_--)
    {
        cout<<solve()<<endl;;
    }
    return 0;
}

1005

在此期间遇到的所有博弈论问题都是使劲推就可以推出来,这个比赛期间推了俩小时直接爆炸,对于单堆的很快就可以推出来关于奇偶性的规律,但是多堆真的推吐了,最后画到第五维表格的时候队友说ac了,队友期间一直在说什么子问题,我还以为是队友想歪了,赛后才知道有sg函数(nim函数)这种黑科技,很容易推出sg函数,这样问题就转换成了说在1e3的复杂度内分解一个1e9大小的数。

比赛期间想到的是miller-rabin算法加上n^(1/3)暴力,但是赛后听jls说在n较小时使用pollard_rho会复杂度很大,还是直接暴力对每个素数判断会好些,1e9大小的数,只用判断到4e4以下的素数,小于x的素数个数是x/ln(x),所以大概就是1e3级别的。

另外代码需要进行优化,一个是不可以用vector来存素数,一个是当a==1时要直接break

#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri {int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=4e4+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;

bool vis[N];
int prim[N],num;
bool solve()
{
    int n;
    cin>>n;
    int ret=0;
    while(n--)
    {
        int a,add=0;
        cin>>a;
        while(a%2==0)
        {
            add=1;
            a/=2;
        }
        for(int i=0;i<num;i++)
        {
            while(a%prim[i]==0)
            {
                a/=prim[i];
                add++;
            }
            if(a==1)break;
        }
        if(a!=1)
            add++;

        ret^=add;
    }

    return ret;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
//    freopen("in.txt","r",stdin);
    for(int i=2; i<N; i++)
        if(!vis[i])
            for(int j=i<<1; j<N; j+=i)
                vis[j]=1;
    for(int i=3; i<N; i++)
        if(!vis[i])prim[num++]=i;
    int _;
    cin>>_;
    while(_--)
    {
        if(solve())
            cout<<"W"<<endl;
        else
            cout<<"L"<<endl;
    }
}

1006

读题一小时,做题十分钟,阅读理解题实锤,感觉就是把题读懂,然后暴力把每个边界点都带进两边的两条路,走到终点n看输出的答案是否一样,一样的话说明节点处没断是连续的;代码就是纯模拟,最坏复杂度是O(t*n*k*log(n)),由于边数实际上很小根本跑不满再加上n也不大log(n)也小所以暴力复杂度没问题。

#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri{int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=500+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;
int n,k[N],d[N][N];
ll a[N][N],c[N][N],b[N][N];

ll dfs(int s,ll x)
{
    if(s==n)return x;
    int id=lower_bound(a[s],a[s]+k[s],x)-a[s];
    return dfs(d[s][id],x*c[s][id]+b[s][id]);
}
bool solve()
{
    cin>>n;
    if(n==1)return 1;
    for(int i=1;i<n;i++)
    {
        cin>>k[i];
        for(int j=0;j<k[i];j++)
        {
            cin>>c[i][j]>>b[i][j]>>d[i][j]>>a[i][j];
        }
        cin>>c[i][k[i]]>>b[i][k[i]]>>d[i][k[i]];
    }
    for(int i=n-1;i;i--)if(k[i])
    {
        for(int j=0;j<k[i];j++)
        {
            ll t=a[i][j];
            if(dfs(d[i][j],t*c[i][j]+b[i][j])!=dfs(d[i][j+1],t*c[i][j+1]+b[i][j+1]))
                return 0;
        }
    }
    return 1;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
//    freopen("in.txt","r",stdin);
    int _;cin>>_;
    for(int cas=1;cas<=_;cas++)
    {
        cout<<"Case #"<<cas<<": ";
        if(solve())cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

1007

比赛时发现了规律,看着过的挺多的就直接大胆交了,只需找到出现最多的字母

#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri{int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=500+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;

int solve()
{
    string s;cin>>s;
    int cnt[150]={},ma=0;
    for(auto i:s)
        cnt[i]++;
    for(int i='a';i<='z';i++)
        ma=max(ma,cnt[i]);
    return ma;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
//    freopen("in.txt","r",stdin);
    int _;cin>>_;
    for(int cas=1;cas<=_;cas++)
    {
        cout<<"Case #"<<cas<<": "<<solve()<<endl;
    }
    return 0;
}

1010

纯粹签到题

#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri{int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=500+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;

int arr[N];
bool solve()
{
    int n;cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
    for(int i=1;i<n;i++)
        if(arr[i]==arr[i-1])return 0;
    return 1;
}
int main()
{
//    ios::sync_with_stdio(false);
//    cin.tie(0);cout.tie(0);
//    freopen("in.txt","r",stdin);
    int _;cin>>_;
    while(_--)
    {
        if(solve())puts("YES");
        else puts("NO");
    }
    return 0;
}

1011

阅读理解拼胆量题,三次pe才过,有空格有回车,有空格无回车,无空格无回车/(ㄒoㄒ)/~~

#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri{int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=500+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;

int A[N][N],K[N][N];
void solve()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>A[i][j];
    int sum=0;
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
        {
            cin>>K[i][j];
            sum+=K[i][j];
        }
    }
    if(sum!=K[1][1])
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                A[i][j]=0
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cout<<A[i][j];
            if(j!=n)cout<<' ';
        }
        cout<<endl;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
//    freopen("in.txt","r",stdin);
    int _;cin>>_;
    while(_--)
    {
        solve();
    }
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值