Jeanny
寂兮,寥兮,独立不改,周行而不殆

P5661 公交换乘

#include<cstdio>
using namespace std;
int n,x,ans,h,r,z;
struct p{
    int p,t;bool b;
}q[100005],a;
int main(){
    scanf("%d",&n);
    while(n--){
        scanf("%d%d%d",&x,&a.p,&a.t);
        if(x){
            while(q[r].t + 45<a.t && r<=h) ++r;
            z=r;
            while((q[z].p < a.p||q[z].b) && z<=h) ++z;
            z>h ? ans += a.p : q[z].b=1;
        }
        else{
            ans+=a.p;
            q[++h]=a;
        }
    }
    printf("%d",ans);
    return 0;
}

 

 
P5662 纪念品
 
//某一个点,不止有一个最段路,所以需要分奇偶性。
//如果询问的是偶数阶段y,该点偶数性质的最段路<=y,则可以
//如果询问的是奇数阶段y,。。。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
int n,m,Q,hd[100005],dis[100005][3],cnt,x,y,vis[100005][3];
struct Edge{ int to,nxt; } edge[200005];
void add(int u,int v){
  cnt++;
  edge[cnt].to = v;
  edge[cnt].nxt = hd[u];
  hd[u] = cnt;
}
struct Node{
  int id,dis;
  Node(){}
  Node(int x,int y):id(x),dis(y){}
  bool operator <(const Node& p) const{
    return dis > p.dis;
  }
};
priority_queue<Node> q;
void dij(){
  memset(dis, 0x3f, sizeof dis);
  dis[1][0] = 0; q.push(Node(1,0));
  while(!q.empty()){//
    Node tmp = q.top(); q.pop();
    int u = tmp.id;
    if(tmp.dis % 2 == 1){
      if(!vis[u][1])
        vis[u][1] = 1;
    }else{
      if(!vis[u][0])
        vis[u][1] = 1;
    }
    for(int i = hd[u]; i; i = edge[i].nxt){
      int v = edge[i].to;
      if(dis[u][1] + 1 < dis[v][0]){
        dis[v][0] = dis[u][1] + 1;
        q.push(Node(v,dis[v][0]));
      }
      if(dis[u][0] + 1 < dis[v][1]){
        dis[v][1] = dis[u][0] + 1;
        q.push(Node(v,dis[v][1]));//用来排序
      }
    }
  }
}
int main(){
  scanf("%d%d%d",&n,&m,&Q);
  for(int i = 1; i <= m; i++){
    scanf("%d%d",&x,&y);
    add(x,y), add(y,x);
  }
  dij();
  for(int i = 1; i <= Q; i++){
    scanf("%d%d",&x,&y);
    if(y % 2 == 0 && dis[x][0] <= y) printf("Yes\n");
    else if(y % 2 == 1 && dis[x][1] <= y) printf("Yes\n");
    else printf("No\n");
  }
  return 0;
}
/*
vis[1][0] = 1 , vis[1][1]
vis[2][1] = 1,
vis[3][0] = 1;
1,0
2,1
1,2
3,2

*/
//大于最短距离
/*
5 5 5
1 2
2 3
3 4
4 5
1 5
1 5
*/

 

posted on 2020-07-17 16:58  Jeanny  阅读(144)  评论(0)    收藏  举报