9/8模拟赛

又是一次不愿透露分数的模拟赛

T1–Luogu P3045

数据巨水,以下是错误操作,同时也是90分操作

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
#define ll long long
int n,k;
ll m;
struct node{ll p,c;}cow[50005];
bool vis[50005];
bool cmp(node a,node b){
    return a.c<b.c;
}
bool cmpp(node a,node b){
    return a.p<b.p;
}

int main(){
    freopen("coupons.in","r",stdin);
    freopen("coupons.out","w",stdout);   
    scanf("%d%d%lld",&n,&k,&m);
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=n;i++){
        scanf("%d%d",&cow[i].p,&cow[i].c);
    }
    sort(cow+1,cow+1+n,cmp);
    int ans=k;
    ll sum=0;
    for(int i=1;i<=k;i++)sum+=cow[i].c,vis[i]=1;
    sort(cow+1,cow+1+n,cmpp);
    int o=1;
    while(sum<m){
        if(!vis[o]) sum+=cow[o].p,ans++;
        o++;
    }
    cout<<ans<<endl;

    return 0;
}

T2—Luogu P1849

啥?这是SPFA?图论不会……思路是bfs+dp,听老师讲才知道这竟然是spfa……

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
bool map[1005][1005],vis[1005][1005]; 
int ans[1005][1005],q1[1000005],q2[100005];
int qwq[4]={1,-1,0,0};
int qaq[4]={0,0,1,-1};
int main(){
    freopen("tractor.in","r",stdin);
    freopen("tractor.out","w",stdout);   
    int n,x,y,a,b;
    scanf("%d%d%d",&n,&x,&y);
    while(n--){
        scanf("%d%d",&a,&b);
        map[a][b]=1;
    }
    for(int i=0;i<=1001;i++)//从0开始啊啊啊,好久才找出错来qaq 
    for(int j=0;j<=1001;j++)  ans[i][j]=19260817;
    q1[0]=x,q2[0]=y;
    vis[x][y]=1;ans[x][y]=map[x][y];
    int head=0;int tail=1;
    while(head!=tail){
        int xx=q1[head];int yy=q2[head]; head=(head+1)%100000;
        for(int i=0;i<=3;i++){
            int xxx=xx+qwq[i];int yyy=yy+qaq[i];
            if(xxx>=0 && xxx<=1001 && yyy>=0 && yyy<=1001){
                if(ans[xxx][yyy]>ans[xx][yy]+map[xxx][yyy]){
                    ans[xxx][yyy]=ans[xx][yy]+map[xxx][yyy];
                    if(!vis[xxx][yyy]){
                        vis[xxx][yyy]=1;
                         tail=(1+tail)%100000;
                        q1[tail]=xxx;q2[tail]=yyy;
                    }
                }
            }
        }
        vis[xx][yy]=0;
    }
    cout<<ans[0][0]<<endl;
    return 0;
}

T3–Luogu P3054

第一反应就是【追及问题】,算出每头牛跑到了第几圈的哪个位置。
套圈有两种情况,不到一整圈时不能算。
所以想到求排名和余数位置的逆序对数量即可。

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
#define ll long long
int n,c,l;
ll temp,maxn,m;
ll v[100005],e[1000005];
struct node{
    ll s,t;
}a[100005];
bool cmp(node a,node b){
    if(a.s!=b.s)return a.s<b.s;
    return a.t<b.t;
}
void update(ll x){
    for(;x<=m;x+=(x&-x))e[x]++;
}
ll question(ll x){
    ll ret=0;
    for(;x>=1;x-=(x&-x))ret+=e[x];
    return ret;
}


int main(){
    freopen("running.in","r",stdin);
    freopen("running.out","w",stdout);   
    scanf("%d%d%d",&n,&l,&c);
    m=1e6;
    for(int i=0;i<n;i++){
        scanf("%lld",&v[i]);
        maxn=maxn>v[i]?maxn:v[i];
    }
    for(int i=0;i<n;i++){
        a[i].s=v[i]*l/maxn;
        a[i].t=v[i]*l%maxn;
    }
    sort(a,a+n,cmp);
    ll ans=0;
    for(int i=0;i<n;i++){
        ans+=i*a[i].s-temp-question(m)+question(a[i].t);
        temp+=a[i].s;
        if(a[i].t)update(a[i].t);
        }       
    cout<<ans<<endl;

    return 0;
} 
原文地址:https://www.cnblogs.com/erutsiom/p/9905153.html