【做题记录】USACO gold * 50(第一篇)

 

 orz xhk

5/50

1597: [Usaco2008 Mar]土地购买

  $ f[i]=min(f[j]+x[i]*y[j+1]) $ 然后斜率优化

 

1699: [Usaco2007 Jan]Balanced Lineup排队

  silver里好像做过?

  静态RMQ直接上st表

 

1578: [Usaco2009 Feb]Stock Market 股票市场

  看成完全背包。对于每天都搞一下完全背包

 

1574: [Usaco2009 Jan]地震损坏Damage

  语文题QwQ。大力搜索,代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=30500, INF=1e9;
int  n, vis[maxn];
vector<int> G[maxn];
void Addedge(int u,int v ){
    G[u].push_back(v); G[v].push_back(u);
}
int ans;
int dfs(int x){ 
    vis[x]=1; ans--;
    for(int i=0;i<G[x].size();i++){
        int v=G[x][i];
        if(!vis[v]){
            vis[v]=1; dfs(v);
        }
    }
}
int main(){
    int a,b,p,c;
    scanf("%d%d%d",&n,&c,&p); ans=n;
    while(c--){
        scanf("%d%d",&a,&b); Addedge(a,b);
    }
//    vis[1]=1;
    while(p--){
        scanf("%d",&a); // vis[a]=1;
        for(int i=0;i<G[a].size();i++) vis[G[a][i]]=1;
    }
    dfs(1);
    printf("%d\n",ans);
    return 0;
}
/*
4 5 1
1 2 
2 3 
3 4 
2 4
1 3
3 


*/
View Code

 

1577: [Usaco2009 Feb]庙会捷运Fair Shuttle

  数据范围看出来肯定是带个log的。。。。

  按照右端点从小到大排序,然后从前往后选取,要用线段树维护一下区间最大值。

#include <bits/stdc++.h>
#define ls o<<1,l,mid
#define rs o<<1|1,mid+1,r
using namespace std;
const int maxn=5e5, INF=1e9;
struct Node{
    int l,r,num;
}a[maxn];
bool cmp(Node a,Node b){
    return (a.r<b.r || (a.r==b.r && a.l>b.l));
}
int v[maxn],lazy[maxn];
void pushdown(int o,int l,int r){
    v[o<<1]+=lazy[o]; v[o<<1|1]+=lazy[o];
    lazy[o<<1]+=lazy[o]; lazy[o<<1|1]+=lazy[o];
    lazy[o]=0;
}
int query(int o,int l,int r,int L,int R){
    if(l>R || r<L) return -1;
    if(l>=L && r<=R) return v[o];
    pushdown(o,l,r);
    int mid=l+r>>1;
    return max(query(ls,L,R),query(rs,L,R));
}
void add(int o,int l,int r,int val,int L,int R){
    if(l>R || r<L) return;
    if(l>=L && r<=R){v[o]+=val,lazy[o]+=val;return;}
    int mid=l+r>>1;
    add(ls,val,L,R); add(rs,val,L,R);
    v[o]=max(v[o<<1],v[o<<1|1]); 
}

int main(){
    int k,n,c; scanf("%d%d%d",&k,&n,&c);
    for(int i=0;i<k;i++){
        scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].num); a[i].r--;
    }
    sort(a,a+k,cmp); 
    int Ans=0;
    for(int i=0;i<k;i++){
        int ans=min(c-query(1,1,n,a[i].l,a[i].r),a[i].num);
    //    printf("----- %d  %d\n",query(1,1,n,a[i].l,a[i].r),ans);
        Ans+=ans;
        add(1,1,n,ans,a[i].l,a[i].r);
    }
    printf("%d\n",Ans);
    return 0;
}
View Code

 

posted @ 2018-03-06 21:14  noble_(noblex)  阅读(246)  评论(0编辑  收藏  举报
/* */