Codeforces Round #216_div2_E.Valera and Queries

原创 2013年12月04日 00:12:04

转载注明出处  http://blog.csdn.net/moedane

 

 

传送门 http://codeforces.com/contest/369/problem/E

 

题意

给出n条线段,以及m个询问,每个询问包括cnt个点,问有多少条线段覆盖了至少一个点。

 

思路

我一开始是正着思考,想着怎样直接统计出覆盖的线段就好了。这样想的话要解决一个重复的问题,即一个线段覆盖了多个点。想直接用前缀和后缀和处理,但是样例都没法过,发现有许多问题。最后去看了别人代码才知道解法。

 

对每个询问,找出一个点都不覆盖的线段的数目。

要找出一个点都不覆盖的线段,方法是,用结构体存储询问的当前点和它左边的点,把落在该区域内的线段数目统计出来即可。对于每个询问,最左端端点可设为0,最右端可设为10^6,即问题转化为求落在这些区间内的线段的数目。

至于求这些线段数目的方法,是限制右端点小于当前询问的右端点,左端点则更新到树状数组中,即可找到当前区间内的线段数目。

先将线段排好序,离线处理询问。

 

代码

 

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <cctype>
#define bug puts("here");

using namespace std;

typedef long long ll;

const int maxn = 3 * 100086;
const int mod = 1000000007;
const double PI = atan(1.0)*4.0;

int f[1000086];
int Ans[maxn];

struct Node
{
    int l,r,index;
}s[maxn],q[maxn*2];

bool cmp(Node a,Node b)
{
    return a.r < b.r;
}

int lowbit(int x)
{
    return x&(-x);
}

void update(int p,int v)
{
    while(p < 1000006)
    {
        f[p] += v;
        p += lowbit(p);
    }
    return;
}

int sum(int p)
{
    int ans = 0;
    while(p)
    {
        ans += f[p];
        p -= lowbit(p);
    }
    return ans;
}

int main()
{
    int m,n;
    scanf("%d%d",&n,&m);
    int i,j;
    for(i=0;i<n;i++)
        scanf("%d%d",&s[i].l,&s[i].r);
    int e = 0;
    for(i=0;i<m;i++)
    {
        int cnt;
        scanf("%d",&cnt);
        for(j=0;j<cnt;j++)
        {
            scanf("%d",&q[e].r);
            q[e].index = i;
            if(j == 0) q[e].l = 0;
            else q[e].l = q[e-1].r;
            e++;
        }
        q[e].index = i;
        q[e].l = q[e-1].r;
        q[e++].r = 1000006;
    }
    sort(s,s+n,cmp);
    sort(q,q+e,cmp);
    for(i=0;i<m;i++) Ans[i] = n;
    memset(f,0,sizeof(f));
    j = 0;
    for(i=0;i<e;i++)
    {
        while(j < n && s[j].r < q[i].r)
        {
            update(s[j].l,1);
            j++;
        }
        Ans[q[i].index] -= sum(q[i].r - 1) - sum(q[i].l);
    }
    for(i=0;i<m;i++) printf("%d\n",Ans[i]);
    return 0;
}


 

Codeforces 题目合集+分类+蒟蒻的代码 【Updating...】【232 in total】

Codeforces 题目合集+分类+蒟蒻的代码 【Updating...】
  • my_sunshine26
  • my_sunshine26
  • 2017年07月29日 23:42
  • 1397

BZOJ 3625 [Codeforces Round #250]小朋友和二叉树 多项式开根

BZOJ 3625 [Codeforces Round #250]小朋友和二叉树 多项式开根
  • wzq_QwQ
  • wzq_QwQ
  • 2015年09月12日 16:02
  • 2065

codeforces 158B Taxi(贪心小水题)

B. Taxi 点击打开题目 time limit per test 3 seconds memory limit per test 256 megabytes input...
  • u012860428
  • u012860428
  • 2014年05月26日 18:57
  • 1600

Codeforces Round #216 (Div. 2) E. Valera and Queries (树状数组)

题目地址:http://codeforces.com/contest/369/problem/E 看完题目,很明显是离散+树状数组的思路,然而并没有想到怎么离散。这题的解法实在巧妙。 这题要求的是...
  • u013013910
  • u013013910
  • 2015年10月21日 08:54
  • 538

Codeforces Round #216 (Div. 2) A. Valera and Plates

A. Valera and Plates time limit per test 1 second memory limit per test 256 megabytes ...
  • u011471397
  • u011471397
  • 2014年04月22日 20:10
  • 834

Codeforces Round #216 (Div. 2)---C. Valera and Elections

The city Valera lives in is going to hold elections to the city Parliament.The city has n districts ...
  • Guard_Mine
  • Guard_Mine
  • 2015年04月07日 12:11
  • 682

Codeforces Round #216_div2_D.Valera and Fools

近些日子以来总觉得编程水平没怎么提升,这学期开始虽然每周有四场的队内训练赛,但几个月下来感觉收获不大。想想,还是以刷题的方式来学习吧。每天刷个一两题,然后写写题解。一味的打比赛打比赛被逼的很紧但是却没...
  • u010781810
  • u010781810
  • 2013年12月03日 12:00
  • 685

Codeforces Round #216 (diy.2) C. Valera and Elections

题目链接:点击打开链接 题意:给一棵树,N-1条边的权值可以是1和2。要找包含权值为2的边的路径有几条,并            记录这条路径中距离点1最远的点。 分析: 就是树形dp,或者说是树上的...
  • u012841845
  • u012841845
  • 2013年11月30日 18:41
  • 834

Codeforces Round #252(Div. 2) 441A. Valera and Antique Items 水题

A. Valera and Antique Items time limit per test 1 second memory limit per test 256 megab...
  • u013068502
  • u013068502
  • 2016年04月05日 19:45
  • 216

Codeforces Round #252 (Div. 2) B. Valera and Fruits(模拟)

B. Valera and Fruits time limit per test 1 second memory limit per test 256 megabytes ...
  • CriminalCode
  • CriminalCode
  • 2015年06月05日 00:24
  • 476
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces Round #216_div2_E.Valera and Queries
举报原因:
原因补充:

(最多只允许输入30个字)