又是一次不愿透露分数的模拟赛
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;
}