2016-05-28  10:27:19

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3343

比较显然的分块题,分块后块内排序,维护整块的附加信息add

对于操作来说,l,r所在的块暴力,其它块内直接加add,或二分查找大于某个值的数有多少个。

神奇WA

update:本傻叉的二分写法太过傻叉,卒于tmp没有赋初值

 1 #include<bits/stdc++.h>
 2 #define inf 1000000000
 3 #define N 1000005
 4 #define ll long long
 5 using namespace std;
 6 int read(){
 7   int x=0,f=1;char ch=getchar();
 8   while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 9   while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
10   return x*f;
11 }
12 int n,q,m,block,a[N],b[N],pos[N],add[N];
13 void reset(int x){
14   int l=(x-1)*block+1,r=min(x*block,n);
15   for(int i=l;i<=r;i++)b[i]=a[i];
16   sort(b+l,b+r+1);
17 }
18 void update(int x,int y,int v){
19   if(pos[x]==pos[y]){
20     for(int i=x;i<=y;i++)a[i]+=v;
21   }
22   else{
23     for(int i=x;i<=pos[x]*block;i++)a[i]+=v;
24     for(int i=(pos[y]-1)*block+1;i<=y;i++)a[i]+=v;
25   }
26   reset(pos[x]);reset(pos[y]);
27   for(int i=pos[x]+1;i<pos[y];i++)add[i]+=v;
28 }
29 int find(int x,int v){
30   int l=(x-1)*block+1,r=min(x*block,n),last=r,mid,tmp=r+1;
31   while(l<=r){
32     mid=l+r>>1;
33     if(b[mid]>=v)tmp=mid,r=mid-1;
34     else l=mid+1;
35   }
36   return last-tmp+1;
37 }
38 int query(int x,int y,int v){
39   int sum=0;
40   if(pos[x]==pos[y]){
41     for(int i=x;i<=y;i++)if(a[i]+add[pos[x]]>=v)sum++;
42   }
43   else{
44     for(int i=x;i<=pos[x]*block;i++)
45       if(a[i]+add[pos[x]]>=v)sum++;
46     for(int i=(pos[y]-1)*block+1;i<=y;i++)
47       if(a[i]+add[pos[y]]>=v)sum++;
48   }
49   for(int i=pos[x]+1;i<pos[y];i++)
50     sum+=find(i,v-add[i]);
51   return sum;
52 }
53 int main(){
54   n=read();q=read();
55   block=(int)sqrt(n);
56   for(int i=1;i<=n;i++){
57     a[i]=read();
58     pos[i]=(i-1)/block+1;
59     b[i]=a[i];
60   }
61   if(n%block)m=n/block+1;
62   else m=n/block;
63   for(int i=1;i<=m;i++)reset(i);
64   for(int i=1;i<=q;i++){
65     char ch[5];
66     scanf("%s",ch);
67     int x=read(),y=read(),v=read();
68     if(ch[0]=='M')update(x,y,v);
69     else printf("%d\n",query(x,y,v));
70   }
71   return 0;
72 }
View Code

相关文章: