入门题目。。。
/*
* hdu-2688 rotate
* mike-w
* 2011-11-30
* ----------------------
* tag:
* 数状数组
* ps:
* 讲述一下我做这道题的悲惨遭遇:
* 1. 提交别人的代码,发现都是TLE...
* 2. 看别人风格糟糕的代码时被忽悠了: :??::?? <-为啥不if-then?!
* 3. 贡献WA+TLE 二十多个==||
* 4. 这道题竟然卡输入!!!
* tip:
* 做题时自己要想明白,然后再写代码。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<assert.h>
#define low(x) ((x)&(-(x)))
#define max_n (3003000)
#define max_f (11000)
#define buf_size (10)
int f[max_n];
int seq[max_f];
int n,m;
__int64 total;
int add(int x) /* x不能是0,否则死循环 */
{
while(x<=max_f)
{
seq[x]++;
x+=low(x);
}
return 0;
}
__int64 sum(int x)
{
__int64 cnt=0;
while(x>0)
{
cnt+=seq[x];
x-=low(x);
}
return cnt;
}
int scan_d(int *num)
{
char in;
int IsN=0; /* is negative number? */
int tmp=0;
in=getchar();
if(in==EOF) /* encounter EOF */
return 0;
while(in!='-' && (in<'0' || in>'9')) /* invalid character */
in=getchar();
if(in=='-')
IsN=1,tmp=0;
else
tmp=in-'0';
while(in=getchar(),in>='0' && in<='9')
tmp*=10,tmp+=in-'0';
if(IsN)
tmp=-tmp;
*num=tmp;
return 1;
}
int main(void)
{
int i,t1,t2,tmp;
char buf[buf_size];
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
while(scanf("%d",&n)!=EOF)
{
memset(seq,0,sizeof(seq));
total=0;
for(i=0;i<n;i++)
{
/* scanf("%d",f+i); */
scan_d(f+i);
total+=sum(f[i]-1);
add(f[i]);
}
scanf("%d",&m);
while(m-->0)
{
scanf("%s",buf);
if(buf[0]=='Q')
printf("%I64d\n",total);
else
{
/* scanf("%d%d",&t1,&t2); */
scan_d(&t1);
scan_d(&t2);
tmp=f[t1];
for(i=t1;i<t2;i++)
{
f[i]=f[i+1];
if(tmp>f[i])
total++;
else if(tmp<f[i])
total--;
}
f[t2]=tmp; /* do not forget this one! */
}
}
}
return 0;
}
295

被折叠的 条评论
为什么被折叠?



