ACM-ICPC 2018 沈阳赛区网络预赛

36 篇文章 0 订阅
10 篇文章 0 订阅

 D. Made In Heaven

A*算法,第k短路,套模板即可

#include<bits/stdc++.h>
using namespace std;
#define INF 0xffffff
#define MAXN 100010
namespace fastIO {
	#define BUF_SIZE 100000
	//fread -> read
	bool IOerror = 0;
	inline char nc() {
		static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;
		if(p1 == pend) {
			p1 = buf;
			pend = buf + fread(buf, 1, BUF_SIZE, stdin);
			if(pend == p1) {
				IOerror = 1;
				return -1;
			}
		}
		return *p1++;
	}
	inline bool blank(char ch) {
		return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
	}
	inline void read(int &x) {
		char ch;
		while(blank(ch = nc()));
		if(IOerror) return;
		for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0');
	}
	#undef BUF_SIZE
};
using namespace fastIO;
struct AA
{
    int to;
    int val;
    int next;
};
struct BB
{
    int to;
    int g,f;
    bool operator<(const BB &aa ) const
    {
        if(f==aa.f)
            return aa.g<g;
        return aa.f<f;
    }
};
AA edge[MAXN],edge2[MAXN];
int N,M,S,E,K,T,cnt,cnt2,ans;
int dis[1010],visit[1010],head[1010],head2[1010];
void addedge(int from,int to,int val)
{
    edge[cnt].to=to;
    edge[cnt].val=val;
    edge[cnt].next=head[from];
    head[from]=cnt++;
}
void addedge2(int from,int to,int val)
{
    edge2[cnt2].to=to;
    edge2[cnt2].val=val;
    edge2[cnt2].next=head2[from];
    head2[from]=cnt2++;
}
bool spfa(int s,int n,int head[],AA edge[],int dist[])
{
    queue<int>Q1;
    int inq[1010];
    for(int i=0;i<=n;i++)
    {
        dis[i]=INF;
        inq[i]=0;
    }
    dis[s]=0;
    Q1.push(s);
    inq[s]++;
    while(!Q1.empty())
    {
        int q=Q1.front();
        Q1.pop();
        inq[q]--;
        if(inq[q]>n)
            return false;
        int k=head[q];
        while(k>=0)
        {
            if(dist[edge[k].to]>dist[q]+edge[k].val)
            {
                dist[edge[k].to]=edge[k].val+dist[q];
                if(!inq[edge[k].to])
                {
                    inq[edge[k].to]++;
                    Q1.push(edge[k].to);
                }
            }
            k=edge[k].next;
        }
    }
    return true;
}
int A_star(int s,int t,int n,int k,int head[],AA edge[],int dist[])
{
    BB e,ne;
    int cnt=0;
    priority_queue<BB>Q;
    while(!Q.empty()) Q.pop();
    if(dis[s]==INF)
        return -1;
    e.to=s;
    e.g=0;
    e.f=e.g+dis[e.to];
    Q.push(e);

    while(!Q.empty())
    {
        e=Q.top();
        Q.pop();
        if(e.g>T) return -1;
        if(e.to==t)//找到一条最短路径
        {
            cnt++;
        }
        if(cnt==k)//找到k短路
        {
            return e.g;
        }

        for(int i=head[e.to]; i!=-1; i=edge[i].next)
        {
            ne.to=edge[i].to;
            ne.g=e.g+edge[i].val;
            ne.f=ne.g+dis[ne.to];
            Q.push(ne);
        }
    }
    return -1;
}
int main()
{
    int a,b,c;
    while(~scanf("%d%d",&N,&M))
    {
        //read(S);read(E);read(K);read(T);
        scanf("%d%d%d%d",&S,&E,&K,&T);
        memset(head,-1,sizeof(head));
        memset(head2,-1,sizeof(head2));
        cnt=1;
        cnt2=1;
        for(int i=1;i<=M;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
           // read(a);read(b);read(c);
            addedge(a,b,c);
            addedge2(b,a,c);
        }
        spfa(E,N,head2,edge2,dis);
        ans=A_star(S,E,N,K,head,edge,dis);
        if(ans!=-1&&ans<=T)
        printf("yareyaredawa\n");
        else printf("Whitesnake!\n");
    }
    return 0;
}
/*
2 2
1 2 2 1000000000
1 2 5
2 1 4
*/

 F. Fantastic Graph

贪心,挨着判断即可

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=4010;
const int INF=1e9;
int X,Y;
struct node
{
    int id,sum;
}d[maxn];
int du[maxn];
bool cmp(node a,node b)
{
    if(a.sum>b.sum)return 1;
    else
    {
        return 0;
    }
}
vector<int>G[maxn];
int main()
{
    int n,m,k;
    int ans=1;
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        memset(d,0,sizeof(d));
        scanf("%d%d",&X,&Y);
        int u,v;
        for(int i=1;i<=k;i++)
        {
            scanf("%d%d",&u,&v);
            v=v+n;
            G[u].push_back(v);
            G[v].push_back(u);
            d[u].id=u;d[u].sum++;
            du[u]++;
            du[v]++;
            d[v].id=v;d[v].sum++;
        }
        sort(d+1,d+1+n+m,cmp);
        int flag=0;
        for(int i=1;i<=n+m;i++)
        {
            if(d[i].sum>=X)continue;
            if(d[i].sum<X)
            {
                flag=1;
                break;
            }
            int u=d[i].id;
            for(int j=0;j<G[u].size();j++)
            {
                int v=G[u][j];
                if(du[v]-1>=X)
                {
                    du[v]--;

                }
                else
                {
                    flag=1;
                    break;
                }
            }
        }
        printf("Case %d: ",ans++);
        if(!flag)
        {
            printf("Yes\n");
        }
        else
        {
            printf("No\n");
        }
    }

    return 0;
}

 G. Spare Tire

#include <set>
#include <map>
#include <deque>
#include <stack>
#include <queue>
#include <time.h>
#include <vector>
#include <string>
#include <math.h>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define PI acos(-1)
#define ll long long
#define inf 0x3f3f3f3f
#define ull unsigned long long
using namespace std;

const ll mod=1e9+7;
const int MAXN = 10005;
bool flag[MAXN];
ll primes[MAXN/3],pi;

ll t[40],cnt,ans,n,m;
ll inv2,inv3,inv6;

void Prime()
{
    int i,j;
    pi=0;
    memset(flag,false,sizeof(flag));
    for(i=2;i<MAXN;i++)
    {
        if(!flag[i]) primes[++pi] = i;
        for(j=1;(j<=pi)&&(i*primes[j]<MAXN);j++)
        {
            flag[i*primes[j]]=true;
            if (i%primes[j]==0)//这句保证每个非素数只被筛去一次、、
                break;
        }
    }
}
void solve(ll k)
{
    cnt=0;
    for(int i=1;i<=pi&&primes[i]*primes[i]<=k;i++)
    {
        if(k%primes[i]==0)
        {
            t[++cnt]=primes[i];
            while(k%primes[i]==0) k=k/primes[i];
        }
    }
    if(k>1) t[++cnt]=k;
}
long long qpow(long long a,long long b)
{
    a=a%mod;
    long long ans=1;
    while(b)
    {
        if(b&1)
        {
            ans=(ans*a)%mod;
            b--;
        }
        b>>=1;
        a=a*a%mod;
    }
    return ans;
}
ll cal(ll e)
{
    ll s;
    s=e*(e+1)%mod;
    s=s*(e+2)%mod;
    s=s*inv3%mod;
    return s;
}
void dfs(ll i,ll val,ll k)
{
    ll d=n/val;
    if(k%2==1)
    {
        ll o=val*d*(d+1)*inv2+val*val*d*(d+1)*(2*d+1)*inv6;
        //ll o=(((((val*val%mod)*d%mod)*(d+1)%mod)*(2*d+1)%mod)+((3*d*(d+1)%mod)*k%mod)+mod)%mod;
        //o=o*inv6%mod;
        ll o=((((val*d%mod)*(d+1))%mod)*inv2%mod+((((val*val)%mod*d)%mod*(d+1))%mod*(2*d+1)%mod)*inv6%mod+mod)%mod;
        ans=(ans-o)%mod;
    }
    else
    {
        ll o=((((val*d%mod)*(d+1))%mod)*inv2%mod+((((val*val)%mod*d)%mod*(d+1))%mod*(2*d+1)%mod)*inv6%mod+mod)%mod;
        //ll o=(((((val*val%mod)*d%mod)*(d+1)%mod)*(2*d+1)%mod)+((3*d*(d+1)%mod)*k%mod)+mod)%mod;
        //o=o*inv6%mod;
        ans=(ans+o)%mod;
    }
    for(int j=i+1;j<=cnt;j++)
    {
        ll y=val*t[j];
        dfs(j,y,k+1);
    }
}
int main()
{
    Prime();
    inv3=qpow(3,mod-2);
    inv2=qpow(2,mod-2);
    inv6=qpow(6,mod-2);
    while(scanf("%lld%lld",&n,&m)!=EOF)
    {
        solve(m);
        ans=cal(n);
        //cout<<ans<<endl;
        for(int i=1;i<=cnt;i++)
        {
            dfs(i,t[i],1);
        }
        cout<<(ans+mod)%mod<<endl;
    }
}

 I. Lattice's basics in digital electronics

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string table_16[20]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
string change(string s_16)
{
    int s_n=s_16.length();
    int s_now;
    string s_res="";
    for(int i=0;i<s_n;i++)
    {
        if(s_16[i]>='a'&&s_16[i]<='f')
        {
            s_now=s_16[i]-'a'+10;
        }
        else if(s_16[i]>='A'&&s_16[i]<='F')
        {
            s_now=s_16[i]-'A'+10;
        }
        else
        {
            s_now=s_16[i]-'0';
        }
        s_res+=table_16[s_now];
    }
    return s_res;
}
char ss[1000010];
string s,h,ch,k;
map<string,int>mp;
int main()
{
    //ios::sync_with_stdio(false);
    int t,n,m,i,cnt,flag,len,x,j,l;
    char c;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&m,&n);
        mp.clear();
        for(i=1;i<=n;i++)
        {
            scanf("%d",&x);
            scanf("%s",ss);
            s=(string(ss));
            mp[s]=x;
        }
        scanf("%s",ss);
        s=(string(ss));
        h=change(s);
        //cout<<h<<"^^"<<endl;
        ch="";
        len=h.length()/9;
        len*=9;
        for(i=0;i<len;)
        {
            cnt=0;
            for(j=0;j<=7;j++)
            {
                if(h[i+j]=='1')
                {
                    cnt++;
                }
            }
            flag=i;
            i=i+9;
            if((cnt%2)!=0&&h[i-1]=='0')///奇数
            {
                //ch=ch+h.substr(flag,8);
                k="";
                for(l=flag;l<=flag+7;l++)
                {
                    k+=h[l];
                }
                ch+=k;
                //cout<<ch<<"!!!"<<endl;
            }
            else if(cnt%2==0&&h[i-1]=='1')
            {
                //ch=ch+h.substr(flag,8);
                k="";
                for(l=flag;l<=flag+7;l++)
                {
                    k+=h[l];
                }
                ch+=k;
                //cout<<ch<<"$$"<<endl;
            }
        }
        //cout<<ch<<endl;
        ch+='2';
        k="";
        cnt=0;
        len=ch.length();
        for(i=0;i<len;i++)
        {
            if(mp[k]!=0)
            {
                if(cnt>=m)
                    break;
                putchar(mp[k]);
                cnt++;
                k=ch[i];
            }
            else
            {
                //cout<<ch[i]<<endl;
               k+=ch[i];
            }
        }
        printf("\n");
    }
}

 K. Supreme Number

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
long long a[20]={1,2,3,5,7,11,13,17,23,31,37,53,71,73,113,131,137,173,311,317};
int main(){
    long long i,j;
    long long T,cas=0;
    scanf("%lld",&T);
    while(T--){
        string s;
        cin>>s;
        long long ans=1;
        if(s.length()>=4){
            ans=a[19];
        }
        else{
            long long x=0;
            for(i=0;i<s.length();i++){
                x*=10;
                x+=(s[i]-'0');
            }
            for(i=0;i<20;i++){
                if(x>=a[i]){
                    ans=a[i];
                }
                else {
                    break;
                }
            }
        }
        printf("Case #%lld: %lld\n",++cas,ans);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值