AtCoder Beginner Contest 190

签到场……

ABC

签到

D

设等差数列位[s+1,...,s+t],则和为t(2s+t+1)/2=n,也就是t(2s+t+1)=2n,枚举2n的因子t,判断(2n)/t是否为奇数即可,记得每次+2(因为[-i,...,i]=0)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
int ans;
void solve(ll x)
{
    ll tmp=n/x;
    if(tmp%2)ans+=2;
}
int main()
{
    cin>>n;
    n*=2;
    for(ll i=1;i*i<=n;i++)
    if(n%i==0)
    {
        solve(i);
        if(i*i<n)solve(n/i);
    }
    cout<<ans;
}
View Code

E

将每条限制视为一条边即可,然后预处理k个点到其他点的最短距离,然后状压DP即可

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int n,m,k,c[20],mp[20][20],f[1<<17][17],d[N];
vector<int>G[N];
struct node{int u,d;};
bool operator<(node a,node b){return a.d>b.d;}
priority_queue<node>q;
void dijkstra(int s)
{
    for(int i=1;i<=n;i++)d[i]=1e9;
    d[s]=0,q.push((node){s,0});
    while(!q.empty())
    {
        node u=q.top();q.pop();
        if(d[u.u]!=u.d)continue;
        for(int i=0;i<G[u.u].size();i++)
        if(d[G[u.u][i]]>d[u.u]+1)
        d[G[u.u][i]]=d[u.u]+1,q.push((node){G[u.u][i],d[G[u.u][i]]});
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1,x,y;i<=m;i++)scanf("%d%d",&x,&y),G[x].push_back(y),G[y].push_back(x);
    scanf("%d",&k);
    for(int i=0;i<k;i++)scanf("%d",&c[i]);
    for(int i=0;i<k;i++)
    {
        dijkstra(c[i]);
        for(int j=0;j<k;j++)mp[i][j]=d[c[j]];
    }
    for(int i=0;i<k;i++)
    for(int j=0;j<k;j++)
    if(mp[i][j]==1e9){puts("-1");return 0;}
    for(int i=1;i<(1<<k);i++)for(int j=0;j<k;j++)f[i][j]=1e9;
    for(int i=0;i<k;i++)f[1<<i][i]=1;
    for(int S=0;S<(1<<k);S++)
    for(int i=0;i<k;i++)if((S>>i)&1)
    for(int j=0;j<k;j++)if(!((S>>j)&1))f[S|1<<j][j]=min(f[S|1<<j][j],f[S][i]+mp[i][j]);
    int ans=1e9;
    for(int i=0;i<k;i++)ans=min(ans,f[(1<<k)-1][i]);
    printf("%d",ans);
}
View Code

F

签到,树状数组裸题

小号打的,45min不到AK才rank105,好在performance=2400满了,rating+=234,now rating=1627

posted @ 2021-01-30 22:17  hfctf0210  阅读(101)  评论(0编辑  收藏  举报