poj 2481 - Cows(树状数组)
2024-10-11 12:04:24
看的人家的思路,没有理解清楚,,,
结果一直改一直交,,wa了4次才交上,,,
注意: 为了使用树状数组,我们要按照e从大到小排序。但s要从小到大。(我开始的时候错在这里了)
代码如下:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <set>
#include <map> #define M 100005
#define INF 0x7fffffff
#define eps 1e-8
#define LL long long
#define LLU unsigned long long
#define lowbit(x) (x&-x) using namespace std; int c[M], r[M], s[M], e[M], ans[M], n, maxx;
void add(int x)
{
for(int i = x; i <= maxx; i+=lowbit(i))
c[i] += 1;
}
int sum(int x)
{
int ret = 0;
for(int i = x; i > 0; i-=lowbit(i))
ret += c[i];
return ret;
}
int comp(const int a, const int b) { return e[a]==e[b]?s[a]<s[b]:e[a]>e[b]; }
int main ()
{
while(~scanf("%d", &n) && n)
{
memset(c,0,sizeof(c));
maxx = -INF;
for(int i = 1; i <= n; ++i)
{
scanf("%d%d", &s[i], &e[i]);
maxx = max(maxx, e[i]);
r[i] = i;
}
sort(r+1, r+1+n, comp);
for(int i = 1; i <= n; ++i)
{
int d = r[i];
if(i!=1&&s[d]==s[r[i-1]]&&e[d]==e[r[i-1]])
ans[d] = ans[r[i-1]];
else
ans[d] = sum(s[d]+1);
add(s[d]+1);
}
printf("%d", ans[1]);
for(int i = 2; i <= n; ++i)
printf(" %d", ans[i]);
printf("\n");
}
return 0;
}
最新文章
- C#解决界面不响应
- jQuery 学习笔记(函数调用机制)
- js搜索输入关键词
- SSH框架应用解析
- Android MonoGame坑记
- android 浏览器开发实例
- 菲涅尔反射(Fresnel Reflection)
- 《python核心编程》读书笔记--第16章 网络编程
- 如何查看hadoop与hbase的版本匹配关系
- Use a layout_width of 0dip instead of wrap_content for better performance.......【Written By KillerLegend】
- Swift: 基本操作符
- oracle 添加自增索引
- 《FPGA零基础入门到精通视频教程》-第002计数器(Modelsim前仿真)
- Qt Lite
- schedule()函数的调用时机(周期性调度)
- freemarker---详细使用教程
- Codeforces 149 E. Martian Strings
- MySQL相关命令与备份
- visual studio发布到远程服务器的IIS
- C++ Primer 笔记——标准库类型string