1. 程式人生 > >hdu 5096 ACM Rank(treap) (未敲。)

hdu 5096 ACM Rank(treap) (未敲。)

模擬一個acm比賽的排名, 並且支援詢問排在第k個的是哪個隊和第i個隊排第幾

首先對於每個提交, 先判斷是不是有效的,如果是有效的話就看是不是ac, 如果不是ac的話對應隊伍的對應題目要加罰時, 如果ac了的話對應隊伍的總時間要加上用時t和對應題目的罰時, 然後做的題目要加1, 這裡為了方便就不是題目加1, 而是把總用時減去一個很大的數(1e7),然後在treap裡面排的時候就是按照總時間來排, 然後ac了的話要更新最後提交時間和最後ac時間, 沒有ac的話就要更新最後提交時間, 比較蛋疼的就是罰時相等的時候, 要按照它說的規則, 於是就在treap的節點裡面加個set, 然後搞一下仿函式。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#include <string>
#include <set>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define mnx 20002
#define N 3020
#define E 1000200
#define inf 0x3f3f3f3f
#define ls (p[i].ch[0]) #define rs (p[i].ch[1]) #define md ((ll + rr) >> 1) const int M = 10000000; bool acc[mnx][11]; int pen[mnx][11]; // 未提交時候的罰時 int lst[mnx]; int cnt[mnx]; // 總罰時 int lstacc[mnx]; int n, k; struct ff { bool operator()(const int &a, const int &b) const{ if(lstacc[a] == -1
&& lstacc[b] == -1) return a < b; if(lstacc[a] == -1 || lstacc[b] == -1) return lstacc[b] == -1; return lstacc[a] < lstacc[b]; } }; struct node { int ch[2], r, s, v, cnt; set<int, ff> vv; node() {} void setIt(int v, int id) { this -> v = v; vv.clear(); vv.insert(id); ch[0] = ch[1] = 0, r = rand(), s = 1; cnt = 1; } }p[mnx * 22]; int sz; int creat(int v, int id) { ++ sz; p[sz].setIt(v, id); return sz; } int cmp(int i, int v) { if(p[i].v == v) return -1; return v < p[i].v? 0: 1; } void mt(int i) { p[i].s = p[i].cnt; if(ls) p[i].s += p[ls].s; if(rs) p[i].s += p[rs].s; } void rt(int &i, int d) { int k = p[i].ch[d^1]; p[i].ch[d^1] = p[k].ch[d]; p[k].ch[d] = i; mt(i), mt(k); i = k; } void ins(int &i, int id, int v) { if(!i) { i = creat(v, id); return; } int d = cmp(i, v); if(d == -1) { p[i].cnt ++, p[i].s++; p[i].vv.insert(id); return; } ins(p[i].ch[d], id, v); if(p[p[i].ch[d]].r > p[i].r) rt(i, d ^ 1); mt(i); } set<int, ff>::iterator it; void Remove(int &i, int id, int v) { int d = cmp(i, v); if(d == -1) { if(p[i].cnt > 1) { p[i].cnt--, p[i].s--; p[i].vv.erase(id); return; } if(!ls) i = rs; else if(!rs) i = ls; else { int d2 = p[ls].r > p[rs].r? 1: 0; rt(i, d2); Remove(p[i].ch[d2], id, v); } } else Remove(p[i].ch[d], id, v); if(i) mt(i); } int kth(int i, int k) { if(!i) return -1; int d = k - p[ls].s; if(d <= 0) return kth(ls, k); if(d <= p[i].cnt) { if(d != 1) return -1; return *(p[i].vv.begin()); } return kth(rs, d - p[i].cnt); } int ran(int i, int id, int v) { int d = cmp(i, v); int c = 0; if(ls) c += p[ls].s; if(d == -1) return c + 1; if(d == 0) return ran(ls, id, v); return c + p[i].cnt + ran(rs, id, v); } int readint() { char c; while((c = getchar()) && !(c >= '0' && c <= '9')); int ret = c - '0'; while((c = getchar()) && c >= '0' && c <= '9') ret = ret * 10 + c - '0'; return ret; } char readc() { char c; while((c = getchar()) && !isalpha(c)); return c; } int main() { while(scanf("%d%d", &n, &k) != EOF) { int kk = 0; memset(pen, 0, sizeof pen); memset(lst, -1, sizeof lst); memset(cnt, 0, sizeof cnt); memset(acc, 0, sizeof acc); memset(lstacc, -1, sizeof lstacc); int root = 0; char op[20]; sz = 0; for(int i = 0; i < n; ++i) { ins(root, i, 0); } while(scanf("%s", op) && op[0] != 'C') { ++kk; if(op[0] == 'S') { int t, team, res; int id; t = readint(); team = readint(); id = readc() - 'A'; res = readint(); if(lst[team] != -1 && t - lst[team] < 5) continue; if(acc[team][id]) continue; if(res == 0) { pen[team][id] += 20; lst[team] = t; continue; } printf("[%d][%c]\n", team, (char)id + 'A'); Remove(root, team, cnt[team]); cnt[team] += pen[team][id]; cnt[team] += t; acc[team][id] = 1; cnt[team] -= M; lst[team] = t; lstacc[team] = kk; ins(root, team, cnt[team]); continue; } int team; if(op[0] == 'R') { scanf("%d", &team); printf("%d\n", ran(root, team, cnt[team])); continue; } int k; scanf("%d", &k); printf("%d\n", kth(root, k)); } scanf("%s", op); puts(""); } return 0; }

相關推薦

hdu 5096 ACM Rank(treap)

模擬一個acm比賽的排名, 並且支援詢問排在第k個的是哪個隊和第i個隊排第幾 首先對於每個提交, 先判斷是不是有效的,如果是有效的話就看是不是ac, 如果不是ac的話對應隊伍的對應題目要加罰時, 如果ac了的話對應隊伍的總時間要加上用時t和對應題目的罰時,

HDU 3280 Equal Sum Partitions二分查找

pan set article for each mem bottom cstring per emp Equal Sum Partitions Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768

hdu 4965 Fast Matrix Calculation矩陣快速冪

觀察 while code 開始 mat col power tmp style 題意: 給你一個N*K的矩陣A和一個K*N的矩陣B,設矩陣C=AB,M=C^(N*N),矩陣Mmod6後,所有數的和是多少 思路: 剛開始我是直接計算的

HDU 3340 Rain in ACStar線段樹+幾何

itl microsoft push php right not this string rain HDU 3340 Rain in ACStar pid=3340" target="_blank" style="">題目鏈接 題意:給定幾個多邊形(

HDU 3131 One…Two…Five! 暴力搜索

data- pre ack cal amp names php result one 題目鏈接:HDU 3131 One…Two…Five! (暴力搜索) 題意:給出一串數字,要求用加,減,乘,除(5/2=2)連接(計算無優先級:5+3*6=8*6=48),求全部結果中

web前端開發面試題完待續

tex ora 相對 設置 erl 思路 實現 多列 寬度 一、HTML與XHTML的不同:1)XHTML元素必須被正確地嵌套 2)元素必須被關閉 如:<h1>……&l

HDU 6041 I Curse Myself二分+搜索

class algo type ble const return highlight () != 【題目鏈接】 http://acm.hdu.edu.cn/showproblem.php?pid=6041 【題目大意】   給出一個仙人掌圖,求第k小生成樹

完待續機器學習教程視頻資料匯總

提升 isp pla blog sso 相關 學習機 you mage 在學習機器學習的過程中,我陸陸續續收集了些免費的教程資料,希望能和您共享。 如果您有好的網站希望分享就評論吧,我也會整理到文章中。 1 機器學習基礎篇 (1)課程資源 吳恩達《機器學習》cou

HTML基礎知識完待續

表示 部分 round sub 常用 內部 換行 jquery 頁面 一、HTML編輯工具:Sublime Text 二、HTML實體字符:1、( 空格):&nbsp; 2、(<) &lt; 3、(>)&gt; 4、(&)&

HDU 6073 Matching In Multiplication拓撲排序

str graph pop using bsp sum rod 沒有 script Matching In Multiplication Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/5242

復旦大學數學學院高等代數歷屆期中考試大題精選完待續

math 變換 $1 教材 com 考試 b- lambda rda 本文收集了從 2009 年至今復旦大學數學學院高等代數歷屆期中考試精選的大題, 其中有的大題由習題課老師或任課老師自編而來, 有的大題由其他大學的教材或學習指導書中的題目或考研試題改編而來, 也有相當部分

hdu 6161--Big binary tree思維--壓縮空間

style ons desc stream 我們 value chan 向上 while 題目鏈接 Problem Description You are given a complete binary tree with n nodes. The root no

關於數組的深度克隆完待續

地址 關於 們的 type ++ ole 進行 ray nbsp 我們知道,Array.prototype上有一個slice()方法,可以對數組進行克隆,但是這個方法並不完美。如果一個數組是一維數組,使用slice()方法沒有任何問題,但如果是一個多維數組,那麽這個方法就不

HDU 6149 Valley Numer II狀壓DP

狀壓dp pac aps 狀態 01背包 using 百度 c++ 由於 題目鏈接 HDU6149 百度之星復賽的題目……比賽的時候並沒有做出來。 由於低點只有15個,所以我們可以考慮狀壓DP。 利用01背包的思想,依次考慮每個低點,然後枚

Linux 開機自檢整理全

linux基礎1、開機自檢BIOS 檢查硬件有沒有問題 沒問題就根據啟動次序 交加硬盤2、MBR引導 交給硬盤哪裏? 硬盤0 柱面0 磁道1 扇區的前446byte 1扇區一共是512byte 剩下64byte(分區表 4個)+2(分區結束標誌)3、grep引導菜單 cat /etc/

輸入輸出框架完待續

+= windows ble 之前 返回值 nbsp 最小值 標準 logs 輸入一些整數,求出它們的最小值、最大值和平均值(保留3位小數)。 輸入保證這些數都是不超過1000的整數。 樣例輸入: 2 8 3 5 1 7 3 6 樣例輸出: 1 8 4.375 #incl

HDU 4320 Arcane Numbers 1質因子包含

sin puts src 無限 stream names 算術基本定理 ane 分析 http://acm.hdu.edu.cn/showproblem.php?pid=4320 題意: 給出A,B,判斷在A進制下的有限小數能否轉換成B進制下的有限小數。 思路:

讀caffe源碼完待續

樣本 源碼解析 單元 最小 size 傳遞 strong 統一 news caffe源碼閱讀雜記 準備 一些參考網頁 Neural Networks and Deep Learning TUTORIAL ON DEEP LEARNING FOR VISION Deep

ex36 自己編的一個冒險小遊戲完待續

may num eth front exit import dea org island 1 #-*- coding: UTF-8 -*- 2 from sys import exit 3 #作出判斷選擇進森林還是出海冒險 4 def start():

關於閉包完待續

onload light ++ com targe foo sharp () jquer <script src="~/js/jquery.min.js"></script> <script>