codeforces #149 div 2

来源:互联网 发布:淘宝欧米茄碟飞翻新表 编辑:程序博客网 时间:2024/05/16 15:56
A 题,巨水,题意读懂就能A。
int x,y,a,b;    while(cin>>x>>y>>a>>b)    {        bool flag=0;        int num=0;        for(int i=max(b+1,a); i<=x; i++)        {            flag=1;            for(int j=b; j<=y; j++)            {                if(i>j)                {                    ans[num].x=i;                    ans[num].y=j;                    num++;                }            }        }        if(flag)        {            cout<<num<<endl;            for(int i=0; i<num; i++)                cout<<ans[i].x<<" "<<ans[i].y<<endl;        }        else            cout<<0<<endl;

B题,同巨水

void solve(){    int n;    while(cin>>n)    {        int mi=2000000000;        int ma=-1;        // cout<<mi<<endl;        for(int i=0; i<n; i++)        {            scanf("%d%d",&ans[i].x,&ans[i].y);            if(mi>ans[i].x)                mi=ans[i].x;            if(ma<ans[i].y)                ma=ans[i].y;        }        //cout<<mi<<ma<<endl;        int aa=-1;        for(int i=0; i<n; i++)        {            if(ans[i].x<=mi&&ans[i].y>=ma)            {                                          aa=i+1;                break;            }        }        printf("%d\n",aa);    }}

C题,昨晚没做出来,因为数据范围是10^9*10^9,所以没往搜索方面想,然后比完看到别人的评论,发现漏看一个重要条件,就是It is guaranteed that the total length of all given segments doesn't exceed 105.

就是所有线段的总长度不超过10^5。

晕了,这就表示最多是100000个点,可以用BFS来做。。。

int main(){    int x1,x2,y1,y2;    int m,r,a,b;    cin>>x1>>y1>>x2>>y2;    cin>>m;    queue<pair<pair<int ,int >,int>  >qe;    set<pair<int ,int > >mm;    while(m--)    {        cin>>r>>a>>b;        for(int i=a;i<=b;i++)        mm.insert(make_pair(r,i));    }    qe.push(make_pair(make_pair(x1,y1),0));    mm.erase(make_pair(x1,y1));    bool flag=0;    while(!qe.empty())    {        int tempx=qe.front().first.first;        int tempy=qe.front().first.second;        int step=qe.front().second;        //cout<<tempx<<" "<<tempy<<" "<<step<<endl;        qe.pop();        if(tempx==x2&&tempy==y2)        {            cout<<step<<endl;            return 0;        }        for(int i=-1;i<=1;i++)        {            for(int j=-1;j<=1;j++)            {                if(!i&&!j)continue;                if(mm.count(make_pair(i+tempx,j+tempy)))                {                    mm.erase(make_pair(i+tempx,j+tempy));                    qe.push(make_pair(make_pair(i+tempx,j+tempy),step+1));                }            }        }    }    cout<<-1<<endl;    return 0;}

D,见代码

#include <iostream>#include <cstdio>#include <algorithm>#include <string>#include <cmath>#include <cstring>#include <queue>#include <set>#include <vector>#include <stack>#include <map>#include <iomanip>#define PI acos(-1.0)#define Max 2005#define inf INT_MAX#define LL(x) (x<<1)#define RR(x) (x<<1|1)#define FOR(i,s,t) for(int i=(s);i<=(t);++i)#define ll long longusing namespace std;int head[100000];struct kdq{    int u,v,next;} edge[1000000];int n,num,m;int aa[100000];int visit[100000];void init(){    num=1;    memset(head,-1,sizeof(head));    memset(visit,0,sizeof(visit));}void insert(int u,int v){    edge[num].u=u;    edge[num].v=v;    edge[num].next=head[u];    head[u]=num++;}void bfs(){    queue<int >q;    queue<int>ans;    memset(visit,0,sizeof(visit));    for(int i=1; i<=n; i++)        q.push(i);    while(!q.empty())    {        int u=q.front();        q.pop();        if(visit[u]==aa[u])//如果已经按到的次数等于需要的次数,那么按下这个键,        {            ans.push(u);            visit[u]++;            //cout<<u<<" :"<<visit[u]<<endl;            for(int i=head[u]; i!=-1; i=edge[i].next)//将与之相连的键都加1            {                int v=edge[i].v;                visit[v]++;                if(visit[v]==aa[v])//同理                    q.push(v);            }        }    }    cout<<ans.size()<<endl;    while(!ans.empty())    {        cout<<ans.front()<<" ";        ans.pop();    }}int main(){    cin>>n>>m;    int a,b;    init();    while(m--)    {        scanf("%d%d",&a,&b);        insert(a,b);        insert(b,a);    }    for(int i=1; i<=n; i++)        scanf("%d",&aa[i]);    bfs();    return 0;}


E,思路,按位建线段树,然后成段更新。

#include <iostream>#include <cstdio>#include <algorithm>#include <string>#include <cmath>#include <cstring>#include <queue>#include <set>#include <vector>#include <stack>#include <map>#include <iomanip>#define PI acos(-1.0)#define Max 100000#define inf INT_MAX#define LL(x) (x<<1)#define RR(x) (x<<1|1)#define FOR(i,s,t) for(int i=(s);i<=(t);++i)#define ll long longusing namespace std;struct Seg_Tree{    int l,r,flag;    ll len;    ll digt[22];}tree[Max*4];int a[Max];void PushUp(int u){    for(int i=0;i<22;i++)    tree[u].digt[i]=tree[LL(u)].digt[i]+tree[RR(u)].digt[i];}void build(int l,int r,int u){    tree[u].l=l;    tree[u].r=r;    tree[u].len=r-l+1;    tree[u].flag=0;    if(l==r)    {        for(int i=0;i<22;i++)        if(1&(a[l]>>i))        tree[u].digt[i]=1;        return ;    }    int mid=l+r>>1;    build(l,mid,LL(u));    build(mid+1,r,RR(u));    PushUp(u);}void PushDown(int u){    if(tree[u].flag)    {        tree[LL(u)].flag^=tree[u].flag;        tree[RR(u)].flag^=tree[u].flag;        for(int i=0;i<22;i++)        if(1&(tree[u].flag>>i))        {            tree[LL(u)].digt[i]=tree[LL(u)].len-tree[LL(u)].digt[i];            tree[RR(u)].digt[i]=tree[RR(u)].len-tree[RR(u)].digt[i];        }    }    tree[u].flag=0;}void update(int l,int r,int u,int x){    if(l==tree[u].l&&tree[u].r==r)    {        tree[u].flag^=x;        for(int i=0;i<22;i++)        if(1&(x>>i))        tree[u].digt[i]=tree[u].len-tree[u].digt[i];        return ;    }    PushDown(u);    int mid=tree[u].l+tree[u].r>>1;    if(l>mid)    update(l,r,RR(u),x);    else if(r<=mid)    update(l,r,LL(u),x);    else    {        update(l,mid,LL(u),x);        update(mid+1,r,RR(u),x);    }    PushUp(u);}ll ans;void query(int l,int r,int u){    if(l==tree[u].l&&r==tree[u].r)    {        for(int i=0;i<22;i++)        ans+=tree[u].digt[i]*(1ll<<i);        return ;    }    PushDown(u);    int mid=tree[u].l+tree[u].r>>1;    if(l>mid)    query(l,r,RR(u));    else if (r<=mid)    query(l,r,LL(u));    else    {        query(l,mid,LL(u));        query(mid+1,r,RR(u));    }   // PushUp(u);}int main(){    int n;    cin>>n;    for(int i=1;i<=n;i++)    scanf("%d",&a[i]);    int m;    cin>>m;    build(1,n,1);    while(m--)    {        int op;        scanf("%d",&op);        if(op==1)        {            int x,y;            scanf("%d%d",&x,&y);            ans=0;            query(x,y,1);            cout<<ans<<endl;        }        else        {            int x,y,z;            scanf("%d%d%d",&x,&y,&z);            update(x,y,1,z);        }    }    return 0;}