codeforces #149 div 2

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 long
using 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 long
using 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;
}


你可能感兴趣的:(codeforces #149 div 2)