TLE代码存档

#include <ctype.h>
#include <cstdio>
#define N 200010

void read(int &x)
{
    x=0;
    char ch=getchar();
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
}
int M;

struct Tree
{
    int Fre,size,dis,fa;
    int child[2];
}tr[N];
int cnt,root;
int get_son(int x) {return tr[tr[x].fa].child[1]==x;}
void update(int x)
{
    tr[x].size=tr[x].Fre;
    if(tr[x].child[0])
        tr[x].size+=tr[tr[x].child[0]].size;
    if(tr[x].child[1])
        tr[x].size+=tr[tr[x].child[1]].size;
}
void rotate(int x)
{
    int fa=tr[x].fa;
    int grand=tr[fa].fa;
    int pos=get_son(x);
    tr[fa].child[pos]=tr[x].child[pos^1];
    tr[tr[fa].child [pos]].fa=fa;
    tr[x].child [pos^1]=fa;
    tr[fa].fa=x;
    tr[x].fa=grand;
    if(grand)
        tr[grand].child[tr[grand].child[1]==fa]=x;
    update(fa);
    update(x);
}
void splay(int x)
{
    for(int fa;fa=tr[x].fa;rotate(x))
        if(tr[fa].fa)
            rotate(get_son(x)==get_son(fa)?fa:x);
    root=x;
}
void insert(int x)
{
    if(!root)
    {
        cnt++;
        tr[cnt].dis=x;
        tr[cnt].size=1;
        tr[cnt].Fre=1;
        root=cnt;
        return;
    }
    int fa=0,now=root;
    while(true)
    {
        if(tr[now].dis==x)
        {
            tr[now].dis++;
            tr[now].Fre++;
            splay(now);
            return;
        }
        fa=now;
        now=tr[now].child[x>tr[fa].dis];
        if(!now)
        {
            cnt++;
            tr[fa].child[x>tr[fa].dis]=cnt;
            tr[cnt].fa=fa;
            tr[cnt].dis=x;
            tr[cnt].size=1;
            tr[cnt].Fre=1;
            splay(cnt);
            return;
        }
    }
}
int get_xth(int x)
{
    int now=root;
    while(true)
    {
        if(tr[now].child[0]&&x<=tr[tr[now].child[0]].size)
        {
            now=tr[now].child[0];
            continue;
        }
        int tmp=(tr[now].child[0]?tr[tr[now].child[0]].size:0)+tr[now].Fre;
        if(x<=tmp) return tr[now].dis;
        x-=tmp;
        now=tr[now].child[1];
    }
}
int get_rank(int x)
{
    int now=root;
    int ans=0;
    while(true)
    {
        if(x<tr[now].dis)
        {
            now=tr[now].child[0];
            continue;
        }
        ans+=tr[now].child[0]?tr[tr[now].child[0]].size:0;
        if(tr[now].dis==x)
        {
            splay(now);
            return ans+1;
        }
        ans+=tr[now].Fre;
        now=tr[now].child[1];
    }
}
int find_suffix()
{
    int now=tr[root].child[1];
    while(tr[now].child[0])
        now=tr[now].child[0];
    return now;
}
void clear(int x)
{
    tr[x].child[1]=0;
    tr[x].child[1]=1;
    tr[x].size=0;
    tr[x].Fre=0;
    tr[x].dis=0;
    tr[x].fa=0;
}
int get_value(int x)
{
    return tr[x].dis;
}
int find_prefix()
{
    int now=tr[root].child[0];
    while(tr[now].child[1])
        now=tr[now].child[1];
    return now;
}
void Delete(int x)
{
    get_rank(x);
    if(tr[root].Fre>1)
    {
        tr[root].Fre--;
        tr[root].size--;
        return;
    }
    if(!tr[root].child[0]&&!tr[root].child[1])
    {
        clear(root);
        root=0;
        return;
    }
    if(!tr[root].child[0])
    {
        int tmp=root;
        root=tr[root].child[1];
        tr[root].fa=0;
        clear(tmp);
        return;
    }
    if(!tr[root].child[1])
    {
        int tmp=root;
        root=tr[root].child[0];
        tr[root].fa=0;
        clear(tmp);
        return;
    }
    int prefix=find_prefix();
    int tmp=root;
    splay(prefix);
    tr[root].child[1]=tr[tmp].child[1];
    tr[tr[tmp].child[1]].fa=root;
    clear(tmp);
    update(root);
}
int main(int argc,char *argv[])
{
    read(M);
    int opt,x;
    for(;M--;)
    {
        read(opt);
        read(x);
        if(opt==1)
            insert(x);
        else if(opt==2)
            Delete(x);
        else if(opt==3)
            printf("%d\n",get_rank(x));
        else if(opt==4)
            printf("%d\n",get_xth(x));
        else if(opt==5)
        {
            insert(x);
            printf("%d\n",get_value(find_prefix()));
            Delete(x);
        }
        else
        {
            insert(x);
            printf("%d\n",get_value(find_suffix()));
            Delete(x);
        }
    }
    return 0;
}
时间: 2024-10-12 11:55:17

TLE代码存档的相关文章

HDU 1001(TLE代码)★留着待修改★

1 #include <stdio.h> 2 #include <math.h> 3 struct node{ 4 double x,y; 5 }point[100000]; 6 struct node nod; 7 int n=0,i=0; 8 int sort(void){ //选择排序:从小到大 9 int j,k; 10 for(i=0;i<n;i++){ 11 nod.x=point[i].x; 12 nod.y=point[i].y; 13 k=i; 14 for

codegame AI坦克大战第一届杯赛 AI代码存档

共享一下自己的AI代码(其实是有BUG的... var lastPosition = null var fmap = null var result = null var flag = 1 var fgo = 0 var forest0 = [12,3] var forest1 = [12,3] var head = { pre : null, dir : null, x : 0, y : 0, next : null } var handle = head; var last = head;

未完成代码存档

#include <cstdio> #define Max 100000 typedef long long LL; struct node { LL l,r,dis,flag,Min_value,Max_value,set,time_set,time_add; }tr[Max<<2]; int max(LL a,LL b){return a>b?a:b;} int min(LL a,LL b){return a>b?b:a;} LL n,m,Time; void up

未完成代码存档 codevs 2905

#include <algorithm> #include <cstring> #include <cstdio> #include <map> #define Mod 13831 using namespace std; map<int,int>q; int n; struct Node { int point; char Name[101]; int Hash; }Team[7]; bool cmp(Node a,Node b) { retu

2015年4月15日未完成代码存档

1 #include<stdio.h> 2 int fib(int n) 3 { 4 int a=1,b=1,c; 5 if(n==1||n==2) return 1; 6 n-=2; 7 while(n--) 8 { 9 c=a+b; 10 a=b; 11 b=c; 12 } 13 return c; 14 } 15 16 int main() 17 { 18 int a,m,n,x,p; //a是第一站上车人数 p是第二站上车人数 m是最后一站下车人数 n是车站数 x是目标车站 19 in

Codevs 2956 排队问题

2956 排队问题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 有N个学生去食堂,可教官规定:必须2人或3人组成一组,求有多少种不同分组的方法. 输入描述 Input Description 一个数,N 输出描述 Output Description 一个数,即答案. 样例输入 Sample Input 6 样例输出 Sample Output 2 数据范围及提示 Data Size & Hint N<=150 50分TL

TLE状态-UVA, 967 Circular

题意:给你一个区间,问其中是否存在素数变化位数后仍为素数 例:19937, 99371, 93719, 37199, 71993 问区间中有几个 PS:Time_Limit_Exceeded中!可能是Circle函数超时 目前还不知道哪的问题 思路:打印素数表,循环判断即可…… ( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)(你自己都还是错的发上来搞毛 ( ̄ε(# ̄)(我也想对啊,求一条明路QAQ TLE代码: 1 #include <iostream> 2 #include <cstdio>

重构遗留代码(1):金牌大师

旧代码,丑陋的代码,复杂的代码,意大利面条似的代码,鬼话废话……就是四个字:遗留代码.这是一个系列文章,将有助于你处理并解决它. 在理想的世界中,你只会写新代码.你会把代码写得既漂亮又完美.你将永不会再看你的代码,并且你将永远不会维护一个有十年之久的项目.在理想的世界中… 不幸的是,我们生活在现实的而非理想的世界.我们必须理解修改和增强年代久远的代码这件事.我们必须处理遗留代码.那么你还在等什么?让我们一头扎进第一篇教程,拿着代码,读懂一点点,并为了我们日后的修改编织一张安全网. 遗留代码的定义

http://www.codeforces.com/contest/703/problem/D D. Mishka and Interesting sum (莫队的TLE)

/*莫队算法的常数优化 实战演练 虽然是TLE代码*/ #include<bits/stdc++.h> using namespace std; const int maxn = 1000000 + 100; int block; struct query{ int l, r, id; bool operator < (const query &rhs)const{ return (l/block == rhs.l /block) ? r < rhs.r : l/block