您的位置:首页 > 其它

HDU 2852 KiKi's K-Number(离线+树状数组)

2013-08-12 20:17 141 查看
题目链接

省赛训练赛上一题,貌似不难啊。当初,没做出。离线+树状数组+二分。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define N 100000
int p[100100];
int qur[300001][3];
int lowbit(int t)
{
return t&(-t);
}
void insert(int t,int d)
{
while(t <= N)
{
p[t] += d;
t += lowbit(t);
}
}
int getsum(int t)
{
int sum = 0;
while(t)
{
sum += p[t];
t -= lowbit(t);
}
return sum;
}
int bin(int x)
{
int str,end,mid;
if(x > getsum(N))
return -1;
str = 1;
end = N;
while(str < end)
{
mid = (str + end)/2;
if(getsum(mid) < x)
str = mid + 1;
else
end = mid;
}
return str;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
memset(p,0,sizeof(p));
for(i = 0;i < n;i ++)
{
scanf("%d",&qur[i][0]);
if(qur[i][0] == 0||qur[i][0] == 1)
scanf("%d",&qur[i][1]);
else
scanf("%d%d",&qur[i][1],&qur[i][2]);
}
for(i = 0;i < n;i ++)
{
if(qur[i][0] == 0)
insert(qur[i][1],1);
else if(qur[i][0] == 1)
{
if(getsum(qur[i][1])-getsum(qur[i][1]-1) > 0)
insert(qur[i][1],-1);
else
printf("No Elment!\n");
}
else
{
int flag;
flag = bin(getsum(qur[i][1])+qur[i][2]);
if(flag == -1)
printf("Not Find!\n");
else
printf("%d\n",flag);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: