点头(1163)

题目链接:here~~~

本题巧妙运用并查集记录每个点的前驱,更快查找出来目标状态(而且排序更加巧妙)代码某位大牛所写ORZ

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
pair<int,int> p[50005];
int father[50005];
int find(int x){
    if(x <= 0) return -1;
    return father[x] = (x == father[x])? x - 1 : find(father[x]);
}
int main()
{
    int n;
    cin >> n;
    for(int i = 0;i < n; i++){
        cin>>p[i].second>>p[i].first;
        p[i].first = - p[i].first;
        if(p[i].second > n) p[i].second = n;
    }
    for(int i = 0;i <= n;i++) father[i] = i;
    sort(p,p+n);
    long long ans = 0;
    for(int i = 0;i < n;i ++)
    {
        int t = find(p[i].second);
        if(t >= 0) ans -= p[i].first;
    }
    cout<<ans<<endl;
}

时间: 2024-10-11 22:56:53

点头(1163)的相关文章

HDU 1163 Eddy&#39;s digital Roots

Eddy's digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5783    Accepted Submission(s): 3180 Problem Description The digital root of a positive integer is found by summing the digit

POJ 1163 The Triangle

题目链接:http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39022   Accepted: 23430 Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calculat

1163 最高的奖励 贪心 + 并查集

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1163 首先如果时间大于n,也就是相当于不限时了,因为完成前n - 1项任务需要时间n - 1,不影响我的第n项. 首先按价值排序,然后这个价值安排在它准备过期的那一天,如果被占据了,就找下一天,就能优先吃到了最大值.而且你吃其他也是耗费一个空间,所以吃个更大的是最优的. 然后可以用并查集来维护,记录topre[i]表示第i个位置的上一个空位是谁. 就能加速找到了. 不然

51nod 1163 最高的奖励(贪心+优先队列)

题目链接:51nod 1163 最高的奖励 看着这题我立马就想到昨天也做了一道贪心加优先队列的题了奥. 按任务最晚结束时间从小到大排序,依次选择任务,如果该任务最晚结束时间比当前时间点晚,则将该任务的奖励值压入队列,否则将队列中最小的任务的奖励值替换,优先队列按奖励值小的优先. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 using name

1339 / 1163: [Baltic2008]Mafia

1163: [Baltic2008]Mafia Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 96  Solved: 60[Submit][Status][Discuss] Description 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的初始点到达目标点 Input 第一行输入N,M代表车站的总个数,及有多少条双向

题目1163:素数

题目描述: 输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1. 输入: 输入有多组数据. 每组一行,输入n. 输出: 输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1. 样例输入: 100 样例输出: 11 31 41 61 71 C++代码: #include<iostream> using namespace std;

访问艺术馆 (Codevs No.1163)

2016-05-31 20:48:47 题目链接: 访问艺术馆 (Codevs No.1163) 题目大意: 一个贼要在一个二叉树结构的艺术馆中偷画,画都处于叶子节点处,偷画和经过走廊都需要时间,求在限定时间内可以偷到最大数量 解法: 树状DP (记忆化搜索实现) DP[i][j]表示到达i节点时还有j的时间来移动可以偷到的最大数量 状态转移: 对于叶子节点,直接按时间剩余返回最大偷画数量 对于非叶子节点,最大值可能来自Lson一边,也可能只来自Rson一边,还有可能是Lson,Rson按某种方

HDOJ 1163 Eddy&#39;s digital Roots(简单数论)

[思路]:http://blog.csdn.net/iamskying/article/details/4738838 求解思路: 现在分析一个问题,假设将十位数为a,个位数为b的一个整数表示为ab,则推导得 ab*ab = (a*10+b)*(a*10+b) = 100*a*a+10*2*a*b+b*b 根据上式可得:root(ab*ab) = a*a+2*a*b+b*b = (a+b)*(a+b);[公式一] 同理也可证得:root(ab*ab*ab) = (a+b)*(a+b)*(a+b)

ZZNU 1163: 在线判题(指针专题)

题目描述 Ignatius is building an Online Judge, now he has worked out all the problems except the Judge System. The system has to read data from correct output file and user's result file, then the system compare the two files. If the two files are absolu