• poj 2481 Cows【线段树单点更新】


    Cows
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 19652   Accepted: 6690

    Description

    Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one-dimensional number line) in his field is particularly good. 

    Farmer John has N cows (we number the cows from 1 to N). Each of Farmer John's N cows has a range of clover that she particularly likes (these ranges might overlap). The ranges are defined by a closed interval [S,E]. 

    But some cows are strong and some are weak. Given two cows: cowi and cowj, their favourite clover range is [Si, Ei] and [Sj, Ej]. If Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj, we say that cowi is stronger than cowj

    For each cow, how many cows are stronger than her? Farmer John needs your help!

    Input

    The input contains multiple test cases. 
    For each test case, the first line is an integer N (1 <= N <= 105), which is the number of cows. Then come N lines, the i-th of which contains two integers: S and E(0 <= S < E <= 105) specifying the start end location respectively of a range preferred by some cow. Locations are given as distance from the start of the ridge. 

    The end of the input contains a single 0.

    Output

    For each test case, output one line containing n space-separated integers, the i-th of which specifying the number of cows that are stronger than cowi

    Sample Input

    3
    1 2
    0 3
    3 4
    0
    

    Sample Output

    1 0 0
    

    Hint

    Huge input and output,scanf and printf is recommended.

    Source

    POJ Contest,Author:Mathematica@ZSU

    题意:FJ有n头牛(编号为1~n),每一头牛都有一个测验值(S,E),对于牛i和牛j来说,如果它们的测验值满足下面的条件则表示牛i比牛j强壮:Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj。现在已知每一头牛的测验值,要求输出每头牛有几头牛比其强壮。

    思路:首先将S[i]降序排序,如果相等则按E[i]的升序,根据排序后的顺序往每头牛的S位置加1。如果遇到完全重合的数据,则不需要重新进行求和计算,只需把前面的值赋值给它,否则需要计算获取到牛的S位置的元素的和。


    注意区间的开闭端点,由于是可以有右端点重叠,所以 用总区间相减的时候不要把自己的右端点也给减了,要用r-1避免


    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<queue>
    #include<map>
    #include<set>
    #include<stack>
    #include<bitset>
    #include<numeric>
    #include<vector>
    #include<string>
    #include<iterator>
    #include<cstring>
    #include<ctime>
    #include<functional>
    #define INF 0x3f3f3f3f
    #define ms(a,b) memset(a,b,sizeof(a))
    #define pi 3.14159265358979
    #define MOD 1000000007
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    using namespace std;
    
    typedef pair<int, int> P;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn = 100010;
    
    struct node {
    	int l, r, id;
    }a[maxn]; 
    
    int sum[maxn], ans[maxn];
    
    void update(int x, int k)
    {
    	while (k <= maxn)
    	{
    		sum[k] += x;
    		k += k&-k;
    	}
    }
    
    int query(int k)
    {
    	int ans = 0;
    	while (k)
    	{
    		ans += sum[k];
    		k -= k&-k;
    	}
    	return ans;
    }
    
    bool cmp(node a, node b)
    {
    	if (a.l != b.l) return a.l < b.l;
    	return a.r > b.r;
    }
    
    int main()
    {
    	int n;
    	while (~scanf("%d", &n) && n)
    	{
    		for (int i = 1; i <= n; i++)
    		{
    			scanf("%d%d", &a[i].l, &a[i].r);
    			a[i].id = i;
    		}
    		ms(sum, 0);
    		sort(a + 1, a + n + 1, cmp);
    		for (int i = 1; i <= n; i++)
    		{
    			int m = 1, t = i;
    			while (t < n&&a[t + 1].l == a[t].l&&a[t + 1].r == a[t].r) t++, m++;
    			ans[a[t].id] = query(maxn) - query(a[t].r-1);
    			update(m, a[t].r);
    			for (; i < t; i++)
    			{
    				ans[a[i].id] = ans[a[t].id];
    			}
    		}
    		for (int i = 1; i <= n; i++)
    		{
    			printf("%d ", ans[i]);
    		}
    		puts("");
    	}
    	return 0;
    }


    Fighting~
  • 相关阅读:
    软件工程概论课后作业2
    第三周进度表
    软件工程概论课后作业1
    第二周进度表
    9.异常处理
    《构建之法》阅读笔记二
    《构建之法》阅读笔记一
    第五周进度表
    软件工程个人作业03
    第四周进度表
  • 原文地址:https://www.cnblogs.com/Archger/p/12774728.html
Copyright © 2020-2023  润新知