2014 8.8 第9場個人 排位

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   os   io   for   


UVA 12657 Boxes in a Line

類比


FZU 1876 JinYueTuan 不說話

view code#include <iostream>using namespace std;int main(){    long long n,m,p,ans=1;    while(cin>>n>>m>>p){        ans=1;        for(int i=n;i<n+m;i++){            ans=ans*i%p;            if(ans==0)break;        }        cout<<ans<<endl;    }    return 0;}


ZOJ 3684 Destroy

view code#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int N = 10010;int _, cas=1, n, m,pre[N], ans=0;int in[N],dp[N<<1];bool vis[N<<1];struct edge{    int u, v, w, p, next;    edge() {}    edge(int u, int v, int w, int p, int next):u(u),v(v),w(w),p(p),next(next) {}}e[N<<1];int ecnt;int dfs(int u, int h, int p){    int ans = 0;    for(int i=pre[u]; ~i; i=e[i].next)    {        int v = e[i].v;        if(v==p) continue;        if(!vis[i]) dp[i] = dfs(v, e[i].w, u),vis[i] = 1;        ans = max(dp[i], ans);    }    return h+ans;}void addedge(int u, int v, int w, int p){    e[ecnt] = edge(u, v, w, p, pre[u]);    pre[u] = ecnt++;    e[ecnt] = edge(v, u, w, p, pre[v]);    pre[v] = ecnt++;}//bool dfs2(int u, int lim, int p)//{//    if(in[u]==1) return 0;//    for(int i=pre[u]; ~i; i=e[i].next)//    {//        int v = e[i].v;//        if(v==p || e[i].p<=lim) continue;//        if(!dfs2(v, lim, u)) return 0;//    }//    return 1;//}void dfs3(int u, int h, int p){    if(in[u]==1)    {        ans = max(ans, h);        return ;    }    for(int i=pre[u]; ~i; i=e[i].next)    {        int v = e[i].v;        if(v==p) continue;        dfs3(v, min(h,e[i].p), u);    }}void solve(){    memset(pre, -1, sizeof(pre));    memset(in, 0, sizeof(in));    ecnt = 0;    int u, v, w, p, l = 0, r = 0;    for(int i=1; i<n; i++)    {        scanf("%d%d%d%d", &u, &v, &w, &p);        addedge(u, v, w, p);        in[u]++;        in[v]++;//        r = max(p, r);    }    int s=0, Min=INF, tmp;    memset(vis, 0, sizeof(vis));    for(int i=1; i<=n; i++)    {        tmp = dfs(i, 0, 0);        if(tmp<Min) s = i, Min=tmp;    }    ans = 0;    dfs3(s, INF, 0);//    while(l<=r)//    {//        int mid = (l+r)>>1;//        if(dfs2(s, mid, 0)) ans =mid, r=mid-1;//        else l = mid+1;//    }    printf("%d\n", ans);}int main(){//    freopen("in.txt", "r", stdin);    while(scanf("%d", &n)>0)  solve();    return 0;}


ZOJ 3676 Edward‘s Cola Plan (總是看英文看很久,囧)

view code#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int N = 100010;int _, cas=1, n, m;int suma[N], sumb[N], ans[10010];struct edge{    int a, b, c;    edge() {}    edge(int a, int b, int c):a(a),b(b),c(c) {}    bool operator < (const edge &o) const{        return c>o.c;    }}e[N];struct node{    int v, id;    bool operator < (const node &o) const{        return v>o.v;    }}p[10010];void solve(){    int a, b;    for(int i=1; i<=n; i++){        scanf("%d%d",&a, &b);        e[i] = edge(a,b, b-a);    }    sort(e+1, e+1+n);    for(int i=1; i<=n; i++)    {        suma[i] = suma[i-1] + e[i].a;        sumb[i] = sumb[i-1] + e[i].b;    }    for(int i=0; i<m; i++)    {        scanf("%d", &p[i].v);        p[i].id = i;    }    sort(p, p+m);    int j = 1, M;    for(int i=0; i<m; i++)    {        M = p[i].v;        while(j<=n && e[j].c>M) j++;        ans[p[i].id] = sumb[j-1]-M*(j-1)+suma[n]-suma[j-1];    }    for(int i=0; i<m; i++)    {        printf("%d\n", ans[i]);    }}int main(){//    freopen("in", "r", stdin);    while(scanf("%d%d", &n,&m)>0) solve();    return 0;}


ZOJ 2899 Hangzhou Tour

 


ZOJ 3724 Icecream 線段樹,離線,挺經典的

sum[n]表示距離的首碼和

情況1:

如果是詢問從u到v的最短距離,(a到b是一條捷徑,長度為len)

如果不走捷徑dis1 = sumv – sumu;

如果走捷徑 dis2 = sumv – sumu +len - (sumb-suma)。

走不走捷徑就看len-(sumb-suma)是否小於0,(等於0,走不走無所謂)

對於多個捷徑,且走捷徑的情況,走len-(sumb-suma)最小的那個捷徑

情況2:

如果是詢問從u到v的最短距離,(a到b是一條捷徑,長度為len)

假設不走捷徑為繞一圈, 即dis1 = sumn – sumu+sumv;

走捷徑dis2 = suma – sumu + sumv – sumb + len;

要不要走捷徑就看 (suma-sumb +len)-sumn是否大於0,

當然這種情況肯定是要走捷徑的的,這隻是在有多個捷徑的時候判斷走那個捷徑最短的一個方法。

走 (suma-sumb +len)-sumn最小的捷徑。

至於那些最小值就是用線段樹去維護。



view code#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;typedef long long ll;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const ll INF = 1LL<<60;const int N = 100010;int n, m, T;ll Min[N<<2], sum[N], ans[N<<1];struct seg{    int l, r; ll w;    seg() {}    seg(int l, int r, ll w):l(l),r(r),w(w) {}    bool operator < (const seg &o) const{        return r<o.r;    }}e1[N<<1], e2[N<<2], ask1[N<<2], ask2[N<<2];int ecnt1, ecnt2, acnt1, acnt2;bool cmp(const seg a, const seg b){    return a.l<b.l;}void Up(int rt){    Min[rt] = min(Min[rt<<1], Min[rt<<1|1]);}void build(int l, int r, int rt){    Min[rt] = INF;    if(l==r) return ;    int m = (l+r)>>1;    build(lson);    build(rson);}void update(int p, ll c, int l, int r, int rt){    if(l==r)    {        Min[rt] = min(Min[rt], c);        return ;    }    int m = (l+r)>>1;    if(p<=m) update(p, c, lson);    else update(p, c, rson);    Up(rt);}ll query(int L, int R, int l, int r, int rt){    if(L<=l && R>=r) return Min[rt];    int m = (l+r)>>1;    ll ans = INF;    if(L<=m) ans = min(ans, query(L, R, lson));    if(R>m)  ans = min(ans, query(L, R, rson));    return ans;}void solve(){    int a, b, c;    for(int i=2; i<=n; i++)    {        scanf("%d", &a);        sum[i] = sum[i-1] + a;    }    ecnt1 = ecnt2 = acnt1 = acnt2 = 0;    while(m--)    {        scanf("%d%d%d", &a, &b, &c);        if(a<b)        {            if(sum[a] - sum[b] + c>0) continue;            e1[ecnt1++] = seg(a, b, c-(sum[b]-sum[a]));        }        else e2[ecnt2++] = seg(b, a, (sum[a]-sum[b]+c)-sum[n]);    }    scanf("%d", &T);    for(int i=0; i<T; i++)    {        scanf("%d%d", &a, &b);        if(a<b) ask1[acnt1++] = seg(a, b, i);        else if(a>b)ask2[acnt2++] = seg(b, a, i);        else ans[i] = 0;    }    sort(ask1, ask1+acnt1);    sort(e1, e1+ecnt1);    int i=0, j=0;    build(1, n, 1);    for(; i<acnt1; i++)    {        while(j<ecnt1 && e1[j].r<=ask1[i].r)        {            update(e1[j].l, e1[j].w, 1, n, 1);            j++;        }        ll t = min((ll)0,query(ask1[i].l, ask1[i].r, 1, n, 1));        ans[ask1[i].w] = sum[ask1[i].r] - sum[ask1[i].l] + t;    }    sort(ask2, ask2+acnt2, cmp);    sort(e2, e2+ecnt2, cmp);    build(1, n, 1);    for(i = 0, j = 0; i<acnt2; i++)    {        while(j<ecnt2 && e2[j].l<=ask2[i].l)        {            update(e2[j].r, e2[j].w, 1, n, 1);            j++;        }        ans[ask2[i].w] = sum[n]+sum[ask2[i].l]-sum[ask2[i].r]+query( ask2[i].r, n, 1, n, 1);//        printf("(%d, %d)first : %I64d\n",ask2[i].l,ask2[i].r,ans[ask2[i].w]);    }    for(int i=0; i<T; i++)    {        printf("%lld\n", ans[i]);    }}int main(){//    freopen("in.txt", "r", stdin);    while(scanf("%d%d", &n, &m)>0) solve();    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.