2019SWERC题解

A题 带限制的最短路

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=2e5+10;
int h[N],ne[N],e[N],d[N],w[N],idx;
void add(int a,int b,int c,int dd){
    e[idx]=b,ne[idx]=h[a],d[idx]=c,w[idx]=dd,h[a]=idx++;
}
int sx,sy,ex,ey;
int B,n;
int f[N];
int x[N],y[N];
vector<pll> num[N];
int st[N][110];
struct node{
    int id,dis,cost;
    bool operator <(const node &t) const{
        return cost>t.cost;
    }
};
map<int,pll> m1;
int cnt;
int dist[N][110];
int cal(pll a,pll b){
    int d1=a.first-b.first;
    int d2=a.second-b.second;
    return ceil(sqrt(d1*d1+d2*d2));
}
int dij(){
    int ans=0x3f3f3f3f;
    memset(dist,0x3f,sizeof dist);
    priority_queue<node> q;
    q.push({1,0,0});
    dist[1][0]=0;
    while(q.size()){
        auto t=q.top();
        q.pop();
        if(t.dis>B)
            continue;
        if(st[t.id][t.dis])
            continue;
        st[t.id][t.dis]=1;
        if(t.id==n+2){
            ans=min(ans,t.cost);
            continue;
        }
        for(int i=h[t.id];i!=-1;i=ne[i]){
            int j=e[i];
            if(t.dis+d[i]>B)
                continue;
            if(dist[j][t.dis+d[i]]>dist[t.id][t.dis]+w[i]){
                dist[j][t.dis+d[i]]=dist[t.id][t.dis]+w[i];
                q.push({j,t.dis+d[i],dist[j][t.dis+d[i]]});
            }
        }
    }
    if(ans==0x3f3f3f3f){
        return -1;
    }
    return ans;
}
int main(){
    ios::sync_with_stdio(false);
    memset(h,-1,sizeof h);
    cin>>sx>>sy>>ex>>ey;
    cin>>B;
    cin>>f[0];
    int t;
    cin>>t;
    int i;
    for(int i=1;i<=t;i++){
        cin>>f[i];
    }
    cin>>n;
    for(i=1;i<=n;i++){
        int l;
        cin>>x[i]>>y[i];
        cin>>l;
        for(int j=1;j<=l;j++){
            int a,b;
            cin>>a>>b;
            a++;
            num[i].push_back({a,b});
        }
    }
    add(1,n+2,cal({sx,sy},{ex,ey}),f[0]*cal({sx,sy},{ex,ey}));
    add(n+2,1,cal({sx,sy},{ex,ey}),f[0]*cal({sx,sy},{ex,ey}));
    for(i=1;i<=n;i++){
        add(1,i+1,cal({x[i],y[i]},{sx,sy}),f[0]*cal({x[i],y[i]},{sx,sy}));
        add(i+1,1,cal({x[i],y[i]},{sx,sy}),f[0]*cal({x[i],y[i]},{sx,sy}));
        add(n+2,i+1,cal({x[i],y[i]},{ex,ey}),f[0]*cal({x[i],y[i]},{ex,ey}));
        add(i+1,n+2,cal({x[i],y[i]},{ex,ey}),f[0]*cal({x[i],y[i]},{ex,ey}));
        for(auto tmp:num[i]){
            int pos=tmp.first+1,id=tmp.second;
            add(i+1,tmp.first+1,cal({x[i],y[i]},{x[pos-1],y[pos-1]}),f[id]*cal({x[i],y[i]},{x[pos-1],y[pos-1]}));
            add(tmp.first+1,i+1,cal({x[i],y[i]},{x[pos-1],y[pos-1]}),f[id]*cal({x[i],y[i]},{x[pos-1],y[pos-1]}));
        }
    }
    cout<<dij()<<endl;
}
View Code

B题 签到

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
map<string,int>mp;
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    string s;
    mp.clear();
    for(int i=1;i<=n;i++)
    {
        cin>>s;
        mp[s]++;
    }
    for(auto it=mp.begin();it!=mp.end();it++)
    {
        if(it->second>(n-(it->second)))
        {
            cout<<it->first<<endl;
            return 0;
        }
    }
    cout<<"NONE"<<endl;
    return 0;
}
View Code

C题 签到

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
string s;
set<int> m1;
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    int i;
    for(i=0;i<=n+1;i++){
        m1.insert(i);
    }
    for(i=1;i<=n;i++){
        cin>>s;
        if(s[0]=='-')
            continue;
        if((int)s.size()>=7)
            continue;
        int ans=0;
        for(int j=0;j<(int)s.size();j++){
            ans=ans*10+(s[j]-'0');
        }
        if(m1.count(ans))
            m1.erase(ans);
    }
    cout<<*m1.begin()<<endl;
    return 0;
}
View Code

F题 计算几何

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
struct point
{
    double x,y;
}p[55];
 
point operator - (point x,point y)
{
    point tmp;
    tmp.x=x.x-y.x;
    tmp.y=x.y-y.y;
    return tmp;
}
 
double cross(point a,point b)
{
    return a.x*b.y-a.y*b.x;
}
 
double area(point *p,int n)
{
    double res=0;
    p[n+1]=p[1];
    for(int i=1;i<=n;i++)
        res+=(cross(p[i],p[i+1]));
    return fabs(res/2.0);
}
 
int main(){
    int T;
    scanf("%d",&T);
    double ans=0;
    while(T--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        ans+=area(p,n);
    }
    printf("%lld\n",(ll)floor(ans));
    return 0;
}
View Code

G题 拓扑排序

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=1e5+10;
const int inf=0x3f3f3f3f;
const int M=2e7;
int in[N],h[M],ne[M],e[M],idx;
struct node{
    int id;
    int k;
    bool operator <(const node &t) const{
        return k>t.k;
    }
}g[N];
string s[N];
int st[300][300],n;
map<string,int> m1;
int last[N];
int ans[N];
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void topo(){
    int i;
    priority_queue<node> q;
    for(i=1;i<=n;i++){
        if(!in[i])
            q.push(g[i]);
    }
    int cnt=0;
    while(q.size()){
        auto t=q.top();
        q.pop();
        ans[++cnt]=t.k;
        for(int i=h[t.id];i!=-1;i=ne[i]){
            int j=e[i];
            in[j]--;
            if(!in[j]){
                q.push(g[j]);
            }
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    memset(h,-1,sizeof h);
    int i;
    int S,L;
    cin>>S>>L>>n;
    for(i=1;i<=S;i++)
        cin>>s[i];
    sort(s+1,s+1+S);
    for(i=1;i<=S;i++){
        m1[s[i]]=i;
    }
    memset(last,-1,sizeof last);
    for(i=1;i<=L;i++){
        string a,b;
        cin>>a>>b;
        st[m1[a]][m1[b]]=st[m1[b]][m1[a]]=1;
    }
    for(i=1;i<=n;i++){
        string a;
        cin>>a;
        g[i].id=i,g[i].k=m1[a];
        for(int j=1;j<=S;j++){
            if(last[j]==-1||st[g[i].k][j])
                continue;
            add(last[j],i);
            in[i]++;
        }
        last[g[i].k]=i;
    }
    topo();
    for(i=1;i<=n;i++){
        cout<<s[ans[i]]<<" ";
    }
    cout<<endl;
}
View Code

I 签到

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
int main(){
    ios::sync_with_stdio(false);
    ll a,b,c;
    cin>>a>>b>>c;
    cout<<(a+1)*(b+1)/(c+1)-1<<endl;
}
View Code

 

posted @ 2020-10-14 21:51  朝暮不思  阅读(274)  评论(0编辑  收藏  举报