Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
离散化了还TLE,不理解,求救/* * Author: Aron@WHU * Created Time: 2014/3/22 20:50:36 * File Name: 2528.cpp */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <string> #include <vector> #include <stack> #include <queue> #include <set> #include <time.h> using namespace std; const int maxint = -1u>>1; int ans = 0; bool tag[10001]; int a[10001]; int b[10001]; struct line { int s; int id; }; line seg[80001]; typedef struct node { int left, right; int index; node(int _left, int _right) { left = _left; right = _right; } struct node *left_child; struct node *right_child; }TreeNode; bool cmp(line a, line b) { return a.s < b.s; } void build(TreeNode *node, int left ,int right) { node->left_child = (TreeNode*)malloc(sizeof(TreeNode)); node->right_child = (TreeNode*)malloc(sizeof(TreeNode)); node->left = left; node->index = 0; node->right = right; if(right - left == 0) return; int mid = (left + right) / 2; build(node->left_child, left, mid); build(node->right_child, mid + 1, right); } void insert(TreeNode *node, int left ,int right, int index) { if(node->left == left && node->right == right) { node->index = index; return; //insert(node->left_child, node->left_child->left, node->left_child->right, index); //insert(node->right_child, node->right_child->left, node->right_child->right, index); // return; } if(node->index != 0) { node->left_child->index = node->index; node->right_child->index = node->index; node->index = 0; } int mid = (node->right + node->left) / 2; if(right <= mid) { insert(node->left_child, left, right, index); } else if(left <= mid) { insert(node->left_child, left, mid, index); insert(node->right_child, mid + 1, right, index); } else { insert(node->right_child, left, right, index); } } void display(TreeNode *node) { if(node->right - node->left == 0) { if(node->index != 0) { tag[node->index] = true; } return; } display(node->left_child); display(node->right_child); } int main() { int c, n; scanf("%d", &c); for(int i = 0; i < c; i ++) { TreeNode *node; node = (TreeNode*)malloc(sizeof(TreeNode)); scanf("%d", &n); memset(tag ,false ,sizeof(tag)); ans = 0; for(int j = 0; j < n; j ++) { scanf("%d %d", &a[j], &b[j]); seg[j * 2].s = a[j]; seg[j * 2].id = -(j + 1); seg[j * 2 + 1].s = b[j]; seg[j * 2 + 1].id = j + 1; } sort(seg, seg + 2 * n, cmp); int tmp = seg[0].s, num = 1; for(int j = 0; j < 2 * n ; j++) { if(seg[j].s != tmp) { num += 1; tmp = seg[j].s; } if(seg[j].id < 0) a[-seg[j].id - 1] = num; else b[seg[j].id - 1] = num; } build(node, 1, num); for(int j = 0; j < n; j ++) { insert(node, a[j], b[j], j + 1); } display(node); for(int j = 1; j <= n; j ++) { if(tag[j]) ans ++; } delete node; printf("%d\n", ans); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator