1. 程式人生 > 實用技巧 >2015浙江省賽題解

2015浙江省賽題解

A 對映一下

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=4e5+10;
const int inf=1e9;
int a[N];
map<int,int> m1;
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        int n;
        cin
>>n; int i; m1.clear(); int last=0; int maxn=0; int x=-1; int f=0; for(i=1;i<=n;i++){ cin>>a[i]; m1[a[i]]++; if(m1[a[i]]>maxn){ maxn=m1[a[i]];x=a[i]; f=1; }
else if(m1[a[i]]==maxn){ f=0; } } if(!f)puts("Nobody"); else printf("%d\n",x); } return 0; }
View Code

B 預處理+思維

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
int a[32];
int s[N];
int dis[N];
int
main(){ int t; scanf("%d",&t); while(t--){ memset(a,0,sizeof a); int n; scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&s[i]); for(int i=1;i<=n;i++){ for(int j=30;j>=0;j--){ if((1<<j)<=s[i]){ a[j]++; dis[i]=j; break; } } } ll sum=0; for(int i=1;i<=n;i++){ for(int j=dis[i]-1;j>=0;j--){ if(((1<<j)^s[i])>s[i]){ sum+=a[j]; } } } printf("%lld\n",sum); } }
View Code

C 凸包

D 按位置算貢獻,組合數

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=4e6+10;
const int inf=1e9;
int a[N];
map<int,int> m1;

int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
            memset(a,0,sizeof a);
        ll n;
        cin>>n;
        ll sum=0;
        for(ll i=1;i<=n;i++){
            ll x;
            cin>>x;
            if(a[x]){
                sum+=x*(i-a[x])*(n-i+1);
                a[x]=i;
            }
            else{
                sum+=x*((n-i+1)*(i));
                a[x]=i;
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}
View Code

G 排序模擬

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=4e6+10;
const int inf=1e9;
struct node{
    string s;
    int x;
    bool operator <(const node &t) const{
        return x<t.x;
    }
}s[155];
string tmp[5];
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        int ans=0;
        int S,M,D;
        cin>>S>>M>>D;
        int i;
        int cnt=0;
        for(i=1;i<=S;i++){
            string x;
            cin>>x;
            int num;
            cin>>num;
            s[++cnt]={x,num};
        }
        sort(s+1,s+1+cnt);
        if(cnt%2){
            tmp[1]=s[(cnt+1)/2].s;
            ans+=s[cnt/2+1].x;
        }
        else{
            tmp[1]=s[cnt/2+1].s;
            ans+=s[cnt/2+1].x;
        }
        cnt=0;
        for(i=1;i<=M;i++){
            string x;
            cin>>x;
            int num;
            cin>>num;
            s[++cnt]={x,num};
        }
        sort(s+1,s+1+cnt);
        if(cnt%2){
            tmp[2]=s[(cnt+1)/2].s;
            ans+=s[cnt/2+1].x;
        }
        else{
            tmp[2]=s[cnt/2+1].s;
            ans+=s[cnt/2+1].x;
        }
        cnt=0;
        for(i=1;i<=D;i++){
            string x;
            cin>>x;
            int num;
            cin>>num;
            s[++cnt]={x,num};
        }
        sort(s+1,s+1+cnt);
        if(cnt%2){
            tmp[3]=s[(cnt+1)/2].s;
            ans+=s[cnt/2+1].x;
        }
        else{
            tmp[3]=s[cnt/2+1].s;
            ans+=s[cnt/2+1].x;
        }
        cout<<ans<<" "<<tmp[1]<<" "<<tmp[2]<<" "<<tmp[3]<<endl;
    }
    return 0;
}
View Code

H 模擬

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=4e6+10;
const int inf=1e9;
int a[7]={6,9,6,5,5,5,5};

bool check(int n)
{
    if(n%400==0||(n%100!=0&&n%4==0))
        return true;
    return false;
}

int main(){
    //ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        int y;
        scanf("%d",&y);
        int s=y-1928,k=0;
        for(int i=1929;i<=y;i++)
        {
            if(check(i))
                k++;
        }
        printf("%d\n",a[(2+k+s)%7]);
    }
    return 0;
}
View Code

I 最短路+思維

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=2e6+10;
const int mod=1e9+7;
int n,m;
char g[550][550];
int sx,sy,ex,ey;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
vector<pll> num;
int h[N],ne[N],e[N],idx;
int cost[N],w[N];
int st[N];
int dis[N][2];
struct node{
    int x,y;
    int id;
    bool operator <(const node &t) const{
        if(x==t.x)
            return y>t.y;
        return x>t.x;
    }
};
void add(int a,int b,int c,int d){
    e[idx]=b,ne[idx]=h[a],cost[idx]=c,w[idx]=d,h[a]=idx++;
}
bool check(int x,int y){
    if(x>=0&&x<n&&y>=0&&y<m){
        if(g[x][y]!='#')
            return true;
    }
    return false;
}
int solve(int x,int y){
    int res=0;
    if(g[x][y]>='a'&&g[x][y]<='z')
        res+=(g[x][y]-'a'+1);
    int i;
    for(i=0;i<4;i++){
        int a=x+dx[i];
        int b=y+dy[i];
        if(!check(a,b))
            continue;
        if(g[a][b]>='A'&&g[a][b]<='Z')
            res+=(g[a][b]-'A'+1);
    }
    return res;
}
int get(int a,int b,int c,int d){
    int res=solve(c,d);
    int i,j;
    for(i=0;i<4;i++){
        int x=dx[i]+a;
        int y=dy[i]+b;
        if(check(x,y)){
            if(g[x][y]>='A'&&g[x][y]<='Z'){
                for(int k=0;k<4;k++){
                    int tmp1=dx[k]+x;
                    int tmp2=dy[k]+y;
                    if(check(tmp1,tmp2)){
                        if(tmp1==c&&tmp2==d){
                            res-=(g[x][y]-'A'+1);
                        }
                    }
                }
            }
        }
    }
    return res;
}
void dij(){
    int ans1,ans2;
    priority_queue<node> q;
    q.push({0,0,sx*m+sy});
    int i;
    for(i=0;i<=n*m;i++){
        st[i]=0;
        dis[i][1]=0x3f3f3f3f;
        dis[i][0]=0x3f3f3f3f;
    }
    dis[sx*m+sy][0]=dis[sx*m+sy][1]=0;
    while(q.size()){
        auto t=q.top();
        q.pop();
        if(st[t.id])
            continue;
        st[t.id]=1;
        if(t.id==ex*m+ey){
            ans1=t.x;
            ans2=t.y;
            break;
        }
        for(i=h[t.id];i!=-1;i=ne[i]){
            int j=e[i];
            if(dis[j][0]>dis[t.id][0]+cost[i]){
                dis[j][0]=dis[t.id][0]+cost[i];
                dis[j][1]=dis[t.id][1]+w[i];
                q.push({dis[j][0],dis[j][1],j});
            }
            else if(dis[j][0]==dis[t.id][0]+cost[i]&&dis[j][1]>dis[t.id][1]+w[i]){
                dis[j][1]=dis[t.id][1]+w[i];
                q.push({dis[j][0],dis[j][1],j});
            }
        }
    }
    printf("%d %d\n",ans1,ans2);
}
int main(){
    //ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        scanf("%d%d",&n,&m);
        int i,j;
        idx=0;
        for(i=0;i<=n*m;i++){
            h[i]=-1;
        }
        scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
        sx--,sy--,ex--,ey--;
        for(i=0;i<n;i++)
            scanf("%s",g[i]);
        for(i=0;i<n;i++){
            for(j=0;j<m;j++){
                int k;
                if(g[i][j]=='#')
                    continue;
                if(g[i][j]>='A'&&g[i][j]<='Z'){
                    num.clear();
                    for(k=0;k<4;k++){
                        int x=i+dx[k];
                        int y=j+dy[k];
                        if(check(x,y)){
                            num.push_back({x,y});
                        }
                    }
                    for(k=0;k<(int)num.size();k++){
                        for(int l=0;l<(int)num.size();l++){
                            if(k==l)
                                continue;
                            int tmp1=num[k].first*m+num[k].second;
                            int tmp2=num[l].first*m+num[l].second;
                            add(tmp1,tmp2,get(num[k].first,num[k].second,num[l].first,num[l].second),2);//計算到下個點的代價
                        }
                    }
                }
                else{
                    for(int k=0;k<4;k++){
                        int x=i+dx[k];
                        int y=j+dy[k];
                        if(!check(x,y))
                            continue;
                        if(g[x][y]>='A'&&g[x][y]<='Z')
                            continue;
                        add(i*m+j,x*m+y,solve(x,y),1);
                    }
                }
            }
        }
        dij();
    }
    return 0;
}
View Code

J 噁心人的題

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
char change(char s){
    if(s=='-')return '[';
    if(s=='_')return '{';
    if(s=='+')return '}';
    if(s=='=')return ']';
    if(s=='Q')return '\"';
    if(s=='q')return '\'';
    if(s=='W')return '<';
    if(s=='w')return ',';
    if(s=='E')return '>';
    if(s=='e')return '.';
    if(s=='R')return 'P';
    if(s=='r')return 'p';
    if(s=='T')return 'Y';
    if(s=='t')return 'y';
    if(s=='Y')return 'F';
    if(s=='y')return 'f';
    if(s=='U')return 'G';
    if(s=='u')return 'g';
    if(s=='I')return 'C';
    if(s=='i')return 'c';
    if(s=='O')return 'R';
    if(s=='o')return 'r';
    if(s=='P')return 'L';
    if(s=='p')return 'l';
    if(s=='{')return '?';
    if(s=='[')return '/';
    if(s=='}')return '+';
    if(s==']')return '=';
    if(s=='A')return 'A';
    if(s=='a')return 'a';
    if(s=='S')return 'O';
    if(s=='s')return 'o';
    if(s=='D')return 'E';
    if(s=='d')return 'e';
    if(s=='F')return 'U';
    if(s=='f')return 'u';
    if(s=='G')return 'I';
    if(s=='g')return 'i';
    if(s=='H')return 'D';
    if(s=='h')return 'd';
    if(s=='J')return 'H';
    if(s=='j')return 'h';
    if(s=='K')return 'T';
    if(s=='k')return 't';
    if(s=='L')return 'N';
    if(s=='l')return 'n';
    if(s==':')return 'S';
    if(s==';')return 's';
    if(s=='"')return '_';
    if(s=='\'')return '-';
    if(s=='Z')return ':';
    if(s=='z')return ';';
    if(s=='X')return 'Q';
    if(s=='x')return 'q';
    if(s=='C')return 'J';
    if(s=='c')return 'j';
    if(s=='V')return 'K';
    if(s=='v')return 'k';
    if(s=='B')return 'X';
    if(s=='b')return 'x';
    if(s=='N')return 'B';
    if(s=='n')return 'b';
    if(s=='M')return 'M';
    if(s=='m')return 'm';
    if(s=='<')return 'W';
    if(s==',')return 'w';
    if(s=='>')return 'V';
    if(s=='.')return 'v';
    if(s=='?')return 'Z';
    if(s=='/')return 'z';
    return s;


}
string s;
int main(){
    while(getline(cin,s))
    {
        for(int i=0;i<(int)(s.length());i++)
        {
            printf("%c",change(s[i]));
        }
        printf("\n");
    }
    return 0;
}
View Code

K 按規則模擬

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
typedef pair<pll,int> plll;
const int N=1e5+10;
const double eps=1e-5;
int st[N];
map<plll,int> m1;
double f[200];
vector<int> def[200][11];
vector<int> pos[200][11];
struct node{
    double x;
    int id;
    bool operator<(const node &t) const{
        return x>t.x;
    }
}s[N];
map<int,pair<double,int> > m2;
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,q,d,c;
        scanf("%d%d%d%d",&n,&q,&d,&c);
        int a;
        int i;
        for(i=1;i<=n;i++){
            f[i]=d;
        }
        while(c--){
            scanf("%d",&a);
            int i,j;
            m1.clear();
            m2.clear();
            for(i=1;i<=n;i++)
                for(j=1;j<=q;j++)
                    def[i][j].clear();
            for(i=1;i<=a;i++){
                int x,y,z;
                scanf("%d%d%d",&x,&y,&z);
                if(m1[{{x,y},z}])
                    continue;
                m1[{{x,y},z}]=1;
                def[y][z].push_back(x);
            }
            for(i=1;i<=n;i++){
                for(j=1;j<=q;j++){
                    int num=(int)def[i][j].size();
                    if(num==0)
                        continue;
                    for(auto x:def[i][j]){
                        f[x]+=1.0*(n-1)/num;
                    }
                    f[i]-=(n-1);
                }
            }
            int cnt1=0,cnt2=0;
            for(i=1;i<=q;i++){
                cnt1=0,cnt2=0;
                for(j=1;j<=n;j++)
                    st[j]=0;
                for(j=1;j<=n;j++){
                    int x;
                    scanf("%d",&x);
                    if(x)
                        cnt1++;
                    else
                        cnt2++;
                    st[j]=x;
                }
                for(j=1;j<=n;j++){
                    if(!st[j]){
                        f[j]-=(n-1);
                    }
                    else{
                        f[j]+=1.0*cnt2*(n-1)/cnt1;
                    }
                }
            }
            for(i=1;i<=n;i++){
                s[i]={f[i],i};
            }
            sort(s+1,s+1+n);
            int pri=1;
            m2[s[1].id]={s[1].x,1};
            int cnt=1;
            for(i=2;i<=n;i++){
                if(abs(s[i].x-s[i-1].x)<eps){
                    m2[s[i].id]={s[i].x,pri};
                    cnt++;
                }
                else{
                    m2[s[i].id]={s[i].x,pri+cnt};
                    pri+=cnt;
                    cnt=1;
                }
            }
            int u;
            scanf("%d",&u);
            for(i=1;i<=u;i++){
                int que;
                scanf("%d",&que);
                auto x=m2[que];
                printf("%.8f %d\n",x.first,x.second);
            }
        }
    }
}
View Code

L 簽到

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
const int mod=1e7+7;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        int op=0;
        while(n--){
            int x;
            scanf("%d",&x);
            if(x>6000)op++;
        }
        printf("%d\n",op);
    }
}
View Code