当前位置: 首页 > news >正文

[POJ3067]Japan

题目链接:http://poj.org/problem?id=3067

 线段树和树状数组都可以做。

 

线段树:

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <cmath>
 7 #include <queue>
 8 #include <map>
 9 #include <stack>
10 #include <list>
11 #include <vector>
12 
13 using namespace std;
14 
15 const int maxn = 3000010;
16 
17 typedef long long LL;
18 typedef struct Node {
19     int x;
20     int y;
21 };
22 
23 Node node[maxn];
24 int sum[maxn];
25 int num[maxn];
26 
27 inline bool cmp(Node a, Node b) {
28     if(a.y != b.y) {
29         return a.y > b.y;
30     }
31     return a.x < b.x;
32 }
33 
34 void update(int left, int right, int rt, int x) {
35     if(left == right) {
36         sum[rt]++;
37         num[left]++;
38         return ;
39     }
40     int mid = (left + right) >> 1;
41     if(x <= mid) {
42         update(left, mid, rt<<1, x);
43     }
44     else {
45         update(mid+1, right, rt<<1|1, x);
46     }
47     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
48 }
49 
50 int query(int left, int right, int L, int R, int rt) {
51     if(L <= left && R >= right) {
52         return sum[rt];
53     }
54     int mid = (left + right) >> 1;
55     int ans = 0;
56     if(L <= mid) {
57         ans += query(left, mid, L, R, rt<<1);
58     }
59     if(R > mid) {
60         ans += query(mid+1, right, L, R, rt<<1|1);
61     }
62     return ans;
63 }
64 
65 int n, m, k;
66 int res;
67 LL omega;
68 
69 int main() {
70     // freopen("in", "r", stdin);
71     int kase = 1;
72     int T;
73     scanf("%d", &T);
74     while(T--) {
75         memset(sum, 0, sizeof(sum));
76         memset(num, 0, sizeof(num));
77         res = 0;
78         omega = 0;
79         scanf("%d %d %d", &n, &m, &k);
80         for(int i = 1; i <= k; i++) {
81             scanf("%d %d", &node[i].x, &node[i].y); 
82         }
83         sort(node+1, node+k+1, cmp);
84         for(int i = 1; i <= k; i++) {
85             int tmp = node[i].y;
86             if(i > 1 && node[i].y == node[i-1].y) {
87                 res++;
88             }
89             else {
90                 res = 0;
91             }
92             omega += query(1, n, 1, node[i].x, 1) - num[node[i].x] - res;
93             update(1, n, 1, node[i].x);
94         }
95         printf("Test case %d: %I64d\n", kase++, omega);
96     }
97 }
View Code

 

树状数组:

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <cmath>
 7 #include <queue>
 8 #include <map>
 9 #include <stack>
10 #include <list>
11 #include <vector>
12 
13 using namespace std;
14 
15 const int maxn = 1000010;
16 typedef long long LL;
17 typedef struct Node {
18     LL x;
19     LL y;
20 };
21 
22 Node node[maxn];
23 LL d[maxn<<1];
24 LL n, m, k;
25 LL ans;
26 
27 inline bool cmp(Node a, Node b) {
28     if(a.x != b.x) {
29         return a.x > b.x;
30     }
31     return a.y > b.y;
32 }
33 
34 //求某点管辖范围
35 LL lowbit(LL x) { //求x末尾最低位1的位置(末尾0的个数+1)
36     // return x & (x ^ (x - 1));
37     return x & (-x);
38 }
39 
40 //区间更新树状数组(i到x)
41 void update(LL i, LL x, LL num) {
42     while(i <= x) {    
43         d[i] += num;
44         i += lowbit(i);
45     }
46 }
47 
48 //获取前x项和
49 LL getsum(LL x) {
50     LL sum = 0;
51     while(x > 0) {
52         sum += d[x];
53         x -= lowbit(x);
54     }
55     return sum;
56 }
57 
58 int main() {
59     // freopen("in", "r", stdin); 
60     LL kase = 1;
61     LL T;
62     scanf("%I64d", &T);
63     while(T--) {
64         memset(d, 0, sizeof(d));
65         scanf("%I64d %I64d %I64d", &n, &m, &k);
66         for(LL i = 1; i <= k; i++) {
67             scanf("%I64d %I64d", &node[i].x, &node[i].y);
68         }
69         sort(node+1, node+k+1, cmp);
70         ans = 0;
71         for(int i = 1; i <= k; i++) {
72             ans += getsum(node[i].y-1);
73             update(node[i].y, m, 1);
74         }
75         printf("Test case %I64d: %I64d\n", kase++, ans);
76     }
77 }
View Code

 

转载于:https://www.cnblogs.com/kirai/p/4776715.html

相关文章:

  • 将数据集导出到Excel
  • 标准输出重定向覆盖与追加
  • [中国寒龙反网络病毒联盟001]谷歌应用引擎视频(Google.Datastore.And.RSS)
  • Arduino中hex文件的保存及应用(转)
  • java.io.IOException: Malformed \uxxxx encoding.
  • 【ASP.NET MVC】个人复习整理
  • 迷宫问题(bfs的应用)
  • Google浏览器设置搜索打开新的标签页
  • 记录自己的第一篇博客
  • ajax jsonp跨域
  • AJAX实例
  • linux命令中 rpm –qa|grep softname的含义
  • Android:设置背景图和标题
  • 浙江大学PAT考试1069~1072(2013-11-2)
  • Bootstrap轮播Carousel样式的应用
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Bytom交易说明(账户管理模式)
  • Less 日常用法
  • log4j2输出到kafka
  • SpringBoot 实战 (三) | 配置文件详解
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 从0到1:PostCSS 插件开发最佳实践
  • 关于List、List?、ListObject的区别
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端技术周刊 2019-02-11 Serverless
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 学习JavaScript数据结构与算法 — 树
  • 一起参Ember.js讨论、问答社区。
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 阿里云ACE认证学习知识点梳理
  • ​configparser --- 配置文件解析器​
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $GOPATH/go.mod exists but should not goland
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)scrum常见工具列表
  • ***测试-HTTP方法
  • .bat文件调用java类的main方法
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core 6 redis操作类
  • .NET Core 项目指定SDK版本
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net 无限分类
  • .net的socket示例
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .project文件
  • @Documented注解的作用