Codeforces 369 E 离线、思维

E. Valera and Queries

题意:横坐标轴上,给出 n 段区间(可交叉)。 有 m 个询问,每次询问给出多个点,求这 n 段区间有多少段至少包含了一个点。

tags:离线+树状数组

1】数据量太大,所以肯定离线处理。

2】给出的是区间,而询问给出的是点,我们必须想办法把询问的点转化为区间。所以对于每次给出的 k 个点,我们取出它们分割出的区间。

3】要求多少个区间包含了点,我们反过来求有多少个区间没有包含任何点。如果给出的区间在分割出来的区间内部,那么这个区间肯定就没有包含这次询问的点。

4】我们只要把所有的区间按左端点从大到小排序,再右端点从小到大排序。用树状数组维护给出区间的右端点即可。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a; i<=b; ++i)
#define per(i,b,a) for (int i=b; i>=a; --i)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi  first
#define se  second
typedef long long ll;
const int N = 1000005;

int n, m, bit[N], cnt, ans[N];
struct Node {
    int l, r, id;
    bool friend operator< (Node a, Node b) {
        if(a.l==b.l && a.r==b.r) return a.id<b.id;
        if(a.l==b.l) return a.r<b.r;
        return a.l > b.l;
    }
} p[N<<2];
void Add(int x, int y)
{
    for(int i=x; i<N; i+=i&-i)
        bit[i] += y;
}
int Sum(int x)
{
    int sum = 0;
    for(int i=x; i; i-=i&-i)
        sum += bit[i];
    return sum;
}
int main()
{
    scanf("%d%d", &n, &m);
    rep(i,1,n)
        ++cnt, scanf("%d%d", &p[cnt].l, &p[cnt].r), p[cnt].id=0;
    int ti, pos, l;
    rep(i,1,m)
    {
        scanf("%d", &ti);
        l = 0;
        rep(j,1,ti)
        {
            scanf("%d", &pos);
            p[++cnt] = (Node){ l+1, pos-1, i };
            l = pos;
        }
        p[++cnt] = (Node){ l+1, N-1, i };
    }
    sort(p+1, p+1+cnt);
    rep(i,1,cnt)
    {
        if(p[i].id==0) Add(p[i].r, 1);
        else ans[p[i].id] += Sum(p[i].r);
    }
    rep(i,1,m) printf("%d\n", n-ans[i]);

    return 0;
}

原文地址:https://www.cnblogs.com/sbfhy/p/8337595.html

时间: 2024-10-25 05:36:17

Codeforces 369 E 离线、思维的相关文章

CodeForces 1102C-简单的思维题

题目链接:http://codeforces.com/problemset/problem/1102/C C. Doors Breaking and Repairing time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are policeman and you are playing a game with Slavik

CodeForces 789D 欧拉路径计数,思维

CodeForces 789D 题意:n个点m条边的无向图,求经过其中m-2条边两次,剩下2条边一次的方案数有几种,如果剩下两条边的集合一样算同一种. tags: 选出两条边,其它m-2条边假想复制成两条,这样就是要求欧拉路径是否存在,即奇点个数是否为0或2. 所以该怎么选这两条边呢? 先把边分为自环边和普通边. 1.选取两条不相邻普通边,图中存在4个奇点,不满足欧拉路径条件: 2.选取两条相邻普通边,图中存在2个奇点,满足欧拉路径条件: 3.选取一条普通边一条自环,图中存在2个奇点,满足欧拉路

CodeForces 789E bfs建模,思维

CodeForces 789E 题意:有k种可乐,每种的测试为ai/1000. 要你合成一种浓度为n/1000的可乐,问最小要杯可乐,每种可乐可重复取. tags:  要注意到浓度绝不会超过1000/1000. 假设选取m杯可乐,则 (a1+a2+......+am) / m = n,变换一下为(a1-n)+(a2-n)+......+(am-n) = 0.即要选 m杯可乐,其浓度减 n之和为0.而浓度不超过1000,故(a1-n)+(a2-n)+....+(as-n)的和肯定在 -1000~1

2017-03-16 Codeforces 453A 概率期望,思维 UOJ 228(待补)

Codeforces 453A   A. Little Pony and Expected Maximum 题意:一个m面质地均匀的骰子,每面出现的概率都是独立的1/m, 你需要投掷n次,其结果是这n次出现的最大点数.问投掷n次骰子的结果的期望值是多少,要求相对误差或绝对误差不超过1e-4. tags:枚举骰子出现最大值i,计算出最大值为i时的概率,就得到了答案. 最大值为i的概率=(i/m)^n-((i-1)/m)^n. #include<bits/stdc++.h> using names

Codeforces Round #399 B 思维 C 模拟 D 概率dp E SG博弈

Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined)B. Code For 1 题意:数n,不断拆分为 n/2, n&1, n/2,直到都为0或1.求区间[l, r]有多少个1. tags:画一画很容易看出来,类似dfs中序遍历. //#399 B #include<bits/stdc++.h> using namespace std; #pragma comment(linker, &quo

Codeforces 864 C Bus 思维

题目链接: http://codeforces.com/problemset/problem/864/C 题目描述: 输入a, b, f, k , 一段长度为a的路来回走, 中间f的地方有一个加油站, 油罐的容量为b, 问想要走b次这条路至少需要加多少次油 解题思路: 由于K <= 1e4, 所以将每次需要走路的连续序列构造出来再去遍历一遍这个序列看啥时候需要加油就可以了 代码: #include <iostream> #include <cstdio> #include &

codeforces 497B Tennis Game 思维+二分~

链接:http://codeforces.com/problemset/problem/497/B 这种题考察的是基本功..像我这种基本功为0的喳喳只能卡在这里了... 思路:n范围为10^5, 必须找出nlogn的算法才行.枚举t,然后用二分找出解..巧妙~~ 好题赞一个,虽然不会做~~~ 代码: /* *********************************************** Author :ltwy Created Time :2014年12月18日 星期四 16时28

Maximal GCD CodeForces - 803C (数论+思维优化)

C. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given positive integer number n. You should create such strictly increasing sequence of k positive numbers a1,?a2,?...

Codeforces 983E NN country 思维 (看题解)

NN country 是1175E的加强树上版本, 大致思路是一样的.. 难点在于判断两个点是否被同一条线覆盖.. 居然没想出来. 我们先把所有点对都离线,对于点对(u, v) 我们dfs到 u 的时候 记录一下v子树的和为 t1, 然后把所有在 u 的线段的另一端 + 1, 向子树递归, 回溯的时候再求一下 v 子树的和为 t2 只要判断t1 是否等于 t2, 就知道有没有一条线段同时覆盖u,v. #include<bits/stdc++.h> #define LL long long #d