LG R7

来源:互联网 发布:玩具车淘宝网 编辑:程序博客网 时间:2024/04/21 00:29

T1 BFS暴力模拟

#include <cstdio>#include <iostream>#include <queue>#include <cstring>#include <ctime>using namespace std;const int maxm=5100;int head[maxm],to[2*maxm],net[2*maxm];int cnt;struct node{    int d,step;};bool vis[maxm];queue <node> dl;void add(int x,int y){    cnt++;    to[cnt]=y;    net[cnt]=head[x];    head[x]=cnt;}int bfs(int k){    int ans=0;    while(!dl.empty())    {        node d=dl.front();        dl.pop();        if(d.step==k) continue;        for(int i=head[d.d];i;i=net[i])        if(!vis[to[i]])         vis[to[i]]=1,dl.push((node){to[i],d.step+1}),ans++;    }    return ans;}inline int read(){    int x = 0, f = 1;    char ch = getchar();    for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;    for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';    return x * f;}int main(){    freopen("a.in","r",stdin);    freopen("a.out","w",stdout);    int n,m,q;    scanf("%d%d%d",&n,&m,&q);    for(int i=1;i<=m;i++)    {        int x,y;        x=read();y=read();        add(x,y),add(y,x);    }    for(int i=1;i<=q;i++)    {        int a,k;        a=read(),k=read();        memset(vis,0,sizeof(vis));        while(!dl.empty()) dl.pop();        int ans=0;        for(int j=1,d;j<=a;j++)        {            d=read();            if(!vis[d])             vis[d]=1,dl.push((node){d,0}),ans++;        }        if(k==0)         printf("%d\n",ans);        else          printf("%d\n",ans+bfs(k));    }    //printf("\n%d",clock());} 

T2暴力N^2,优化记录前缀位置和。

#include <cstdio>#include <iostream>#include <queue>#include <cstring>#include <ctime>#include <algorithm>#define ll long longusing namespace std;const int maxm=1000100;ll a[maxm],b[maxm];ll tree[maxm],n;ll Ans=0;inline int lowbit(int x){    return x&-x;}void ins(ll ind){    for(ll i=ind;i<=maxm;i+=lowbit(i))     tree[i]++;}ll ask(ll ind){    ll ans=0;    for(ll i=ind;i;i-=lowbit(i))     ans+=tree[i];    return ans;}void fx(int l,int r){    memset(tree,0,sizeof(tree));    //int size=n-x+1;    ll ans=0;    for(int i=r;i>=l;i--)    {        ll d=ask(a[i]);        //d=i-d;        //printf("%d\n",d);        //ans+=(ans+d);        ans+=d;        Ans+=ans;         ins(a[i]+1);    }    //return ans;}int main(){    freopen("b.in","r",stdin);    freopen("b.out","w",stdout);    scanf("%lld",&n);    for(int i=1;i<=n;i++)     scanf("%lld",&a[i]),b[i]=a[i];    sort(b+1,b+n+1);    int t=unique(b+1,b+n+1)-b-1;    for(int i=1;i<=n;i++)     a[i]=lower_bound(b+1,b+t+1,a[i])-b;    //int ans=0;    for(int i=n;i>=1;i--)     //for(int j=i+1;j<=n;j++)     fx(1,i);    printf("%lld",Ans);}

T3 Tarjan缩点+拓扑排序。
二分答案。
check方法:跟父亲要,根节点给M要。
常数太大,T了一个点

#include <cstdio>#include <iostream>#include <queue>#define ll long long using namespace std;const int maxm=1e7+1;ll dfn[maxm],low[maxm],c[maxm],stk[maxm],top,num,col,size[maxm]; bool vis[maxm];ll head[maxm],to[2*maxm],net[2*maxm],cnt;ll a1[maxm],a2[maxm];ll r1[maxm],d1[maxm];ll dl[maxm],tail,hdd;ll root,n,m;void add(ll x,ll y){    cnt++;    to[cnt]=y;    net[cnt]=head[x];    head[x]=cnt;}ll now[maxm],fat[maxm];void tarjan(ll x){    vis[x]=1;    stk[++top]=x;    low[x]=++num;    dfn[x]=num;    for(ll i=head[x];i;i=net[i])    {        ll p=to[i];        if(!dfn[p])        {            tarjan(p);            low[x]=min(low[p],low[x]);        }        else         if(vis[p])           low[x]=min(dfn[p],low[x]);    }    if(low[x]==dfn[x])    {        vis[x]=0;        col++;        while(stk[top]!=x)        {            size[col]++;            vis[stk[top]]=0;            c[stk[top]]=col;            a2[col]+=a1[stk[top]];            top--;        }        size[col]++;        top--;        c[x]=col;        a2[col]+=a1[x];    }}bool check(ll mid){    ll t=m;    for(ll i=1;i<=col;i++)     now[i]=a2[i];    for(ll i=1;i<=tail;i++)    {        ll d=dl[i];        if(fat[d])         {          if(now[d]<1ll*size[d]*mid)           now[fat[d]]-=(size[d]*mid-now[d]);         }        else        {            ll need=size[d]*mid-now[d];            if(need<0) continue;            if(t>=need) t-=need;            else return 0;         }     }    return 1;}int main(){    ll l=0,r=1e10;    scanf("%lld%lld",&n,&m);    for(int i=1,x;i<=n;i++)    {        scanf("%lld",&x);        if(x!=-1) add(i,x);    }    for(int i=1;i<=n;i++)     scanf("%lld",&a1[i]);    for(ll i=1;i<=n;i++)     if(!dfn[i]) tarjan(i);    for(ll i=1;i<=n;i++)     for(ll j=head[i];j;j=net[j])     {        if(c[i]!=c[to[j]])        {            fat[c[i]]=c[to[j]];            r1[c[to[j]]]++;            d1[c[i]]++;        }     }    for(ll i=1;i<=col;i++)     if(!d1[i])      {        root=i;        break;     }    for(ll i=1;i<=col;i++)     if(r1[i]==0) dl[++tail]=i;    while(hdd<=tail)    {        hdd++;        ll d=dl[hdd];        r1[fat[d]]--;        if(r1[fat[d]]==0) dl[++tail]=fat[d],r1[fat[d]]=1e8;    }    ll ans=0;    while(l<=r)    {        ll mid=(l+r)/2;        if(check(mid)) ans=mid,l=mid+1;        else r=mid-1;    }    printf("%lld",ans);    return 0;}
原创粉丝点击