Codeforces 101B Buses 排序+树状数组

题目链接:点击打开链接

当转移[l,r] 区间时, 若[0, r-1] 这里的区间都已经转移完毕时是最优的,所以按右端点升序,同理右端点相同时左端点升序,然后树状数组维护一下前缀和。

#include <vector>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
using namespace std;
#define N 100005
#define mod 1000000007
#define ll long long
int n, m;
ll c[N<<2];
inline int lowbit(int x){return x&(-x);}
void updata(ll val, int pos){
	while(pos <= n){
		c[pos] = (c[pos] + val)%mod;
		pos += lowbit(pos);
	}
}
ll sum(int pos){
	ll ans = 0;
	while(pos){
		ans = (ans + c[pos])%mod;
		pos -= lowbit(pos);
	}
	return ans;
}
struct node{
	int l, r;
}a[N];
bool cmp1(node x, node y){if(x.r==y.r)return x.l<y.l; return x.r < y.r;}
vector<int>G;
void debug(){
    for(int i = 0; i < m; i++)printf("  %d %d\n", a[i].l, a[i].r);
    printf("***");
    for(int i = 0; i < G.size(); i++) printf("%d ", G[i]); puts("");
    printf("** n = %d\n", n);
}
void input(){
    n++;
	G.clear(); G.push_back(1); G.push_back(n);
	for(int i = 0; i < m; i++)scanf("%d %d", &a[i].l, &a[i].r),a[i].l++, a[i].r++, G.push_back(a[i].l), G.push_back(a[i].r);
	sort(G.begin(), G.end());
	G.erase(unique(G.begin(), G.end()), G.end());
//	debug();
	for(int i = 0; i < m; i++)
	{
		a[i].l = lower_bound(G.begin(), G.end(), a[i].l) - G.begin()+1;
		a[i].r = lower_bound(G.begin(), G.end(), a[i].r) - G.begin()+1;
	}
	n = lower_bound(G.begin(), G.end(), n) - G.begin()+1;
	sort(a, a+m, cmp1);
}
int main(){
	int i, j;
	while(~scanf("%d %d",&n,&m)){
   //     bool ok = n==42;
		input();
		if(m==0 || G.size()==1){puts("0");continue;}
	//	debug();
		memset(c, 0, sizeof c);
		updata(1, 1);
		for(i = 0; i < m; i++){
			ll ans = sum(a[i].r-1) - sum(a[i].l-1); if(ans < 0)	ans = (ans%mod + mod)%mod;
		//	printf("    %d %d %d\n", a[i].l, a[i].r, ans);
			updata(ans, a[i].r);
		//	printf("    %d %d %d\n", a[i].l, a[i].r, sum(a[i].r) - sum(a[i].l-1));
		}

		ll ans = sum(n) - sum(n-1);
	//	printf("%d\n", ans);
        if(ans < 0)	ans = (ans%mod + mod)%mod;
		cout<<ans<<endl;
	}
	return 0;
}
/*
4 4
0 2
1 3
1 4
2 4

4 2
0 2
1 3

ans:
4
4
0

*/
时间: 2024-10-09 02:54:36

Codeforces 101B Buses 排序+树状数组的相关文章

Hdu5032 极角排序+树状数组

题目链接 思路:参考了题解.对询问进行极角排序,然后用树状数组维护一下前缀和即可. /* ID: onlyazh1 LANG: C++ TASK: test */ #include<bits/stdc++.h> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long ll; const int maxn=1010; const int maxm=10

HDU Always Cook Mushroom (极角排序+树状数组)

Problem Description Matt has a company, Always Cook Mushroom (ACM), which produces high-quality mushrooms. ACM has a large field to grow their mushrooms. The field can be considered as a 1000 * 1000 grid where mushrooms are grown in grid points numbe

ACM--归并排序&amp;&amp;树状数组--nyoj 117--求逆序数

南阳oj题目地址:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=117 求逆序数 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 现在,给你一个N个元素的序列,请你判断出它的逆序数是多少. 比如 1 3 2 的逆序数就是1. 输入 第一行输入一个整数T表示测试数据的组

hdu--4911--归并排序||树状数组

发现一个小小的 逆序数里真的藏了好多东西啊=-= 解决这题 你需要知道一点... 对于一串给定的数字 我随便写一串吧.. index:   0 1 2 3 4 value: 4 8 7 5 6    这时候 总的逆序对数是  3+2=5   假如我们只能进行相邻元素的交换 这最好情况是什么呢? 那肯定就是假如本来 arr[x]>arr[x+1] 那这样是形成一个逆序数的吧 我们将它进行交换 这样就少了一个逆序数对是吧... 但是 对于其它位置的元素是没有影响的对吧 所以 我们需要的最小次数呢 就

Codeforces 1139F Dish Shopping 树状数组套平衡树 || 平衡树

Dish Shopping 将每个物品拆成p 和 s 再加上人排序. 然后问题就变成了, 对于一个线段(L - R), 问有多少个(li, ri)满足  L >= li && R >= ri, 这个东西可以直接树状数组套平衡树维护. 但是这个题目有个特殊性,因为排好序之后不会存在 li > L && ri > R的点, 所以可以直接 用平衡树, 或者线段树去维护这个东西. 平板电视 #include<bits/stdc++.h> #inc

CodeForces 570D DFS序 树状数组 Tree Requests

参考九野巨巨的博客. 查询一个子树内的信息,可以通过DFS序转成线形的,从而用数据结构来维护. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <map> 6 #define MP make_pair 7 #define FI first 8 #define SE second 9 using name

luogu P2345 奶牛集会 |排序+树状数组

题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时会聚在一起,第i 头奶牛的坐标为Xi,没有两头奶牛的坐标是相同的.奶牛们的叫声很大,第i 头和第j 头奶牛交流,会发出max{Vi; Vj}×|Xi ? Xj | 的音量,其中Vi 和Vj 分别是第i 头和第j 头奶牛的听力. 假设每对奶牛之间同时都在说话,请计算所有奶牛产生的音量之和是多少. 输入格式 ? 第一行:单个整数N,1 ≤ N ≤

Codeforces 12D Ball 树状数组模拟3个元素的排序

题目链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib.h> #include<a

Codeforces Beta Round #79 (Div. 1 Only) B. Buses 树状数组

http://codeforces.com/contest/101/problem/B 给定一个数n,起点是0  终点是n,有m两车,每辆车是从s开去t的,我们只能从[s,s+1,s+2....t-1]处上车,从t处下车., 问能否去到点n,求方案数 设L[x]表示有多少辆车能够到达x处. 只能从t处下车:说明只能单点更新,对于没辆车x,在区间[s,s+1,s+2....t-1]内上车是可以得,那么有多少辆车呢?明显就是∑区间里能到达的点.然后单点更新t即可 数据大,明显不能到达的点是没用的,离