有题day4上

来源:互联网 发布:哈林导师知乎 编辑:程序博客网 时间:2024/06/08 07:04

t1集合
倒着弄

#include<cstdio>#include<cmath>#include<algorithm>using namespace std;int n,ans,a[1100000];int main(){    //freopen("multiset.in","r",stdin);//  freopen("multiset.out","w",stdout);    scanf("%d",&n);    for(int  i=1;i<=n;i++) scanf("%d",&a[i]);    sort(a+1,a+n+1);    int l=1,r=1,t=0;    //while(a[l]==t) r++;    while(l<n){        while(a[r]==t) r++;        l+=(r-l)/2;        ans++;        t++;        printf("%d %d\n",l,r);    }    printf("%d",ans); } 

t2
二分+bfs搞一波,,可以增量法

#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<queue>#include<algorithm>using namespace std;int vis[210000],ans,n,m,head[210000],nex[500000],to[599999],tot,x[510000],y[510000];void add(int x,int y){    nex[++tot]=head[x];    to[tot]=y;    head[x]=tot;}int check(int s,int t){    tot=0;queue<int> q;    memset(head,0,sizeof head);    memset(vis,0,sizeof vis);    for(int i=s;i<=t;i++) add(x[i],y[i]);    q.push(1);    vis[1]=1;    while(!q.empty()){        int x=q.front();q.pop();        for(int i=head[x];i<=tot&&i;i=nex[i]){            int tmp=to[i];            if(vis[tmp]) continue;            if(tmp==n) return 0;            vis[tmp]=1;            q.push(tmp);        }    }    return 1;}int main(){    freopen("road.in","r",stdin);    freopen("road.out","w",stdout);    scanf("%d%d",&n,&m);    for(int i=0;i<m;i++) scanf("%d%d",&x[i],&y[i]);    int now=0;    while(now<m){        int i=1;        /*while(i+now<=m)        if(check(now,i+now-1))            i<<=1;            else break;        i>>=1;        int nowtmp=i+now;        while(i) {if(nowtmp+i<=m&&check(now,nowtmp+i-1))nowtmp+=i;i>>=1;}        ans++;//for(int i=now;i<=nowtmp-1;i++) vis[y[i]]=0;        now=nowtmp;*/         int l=now,r=m;        while(l<=r){            int mid=(l+r)>>1;            int w=check(now,mid);            if(w) l=mid+1;            else r=mid-1;        }        now=l;        ans++;    }     printf("%d",ans);}