SPOJ 3261. Race Against Time(RACETIME)(分块)
2014-05-02 09:38
465 查看
题意:给n个数,有两种操作,一种是修改第i个数,第二种是查询[L,R]中小于等于X的数的个数。
思路:表示不会树套树,只好用分块搞掉。。。分完块以后二分找一下就好了,其实还是挺快的
代码:
思路:表示不会树套树,只好用分块搞掉。。。分完块以后二分找一下就好了,其实还是挺快的
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<cmath> #include<vector> #define inf 0x3f3f3f3f #define Inf 0x3FFFFFFFFFFFFFFFLL #define eps 1e-9 #define pi acos(-1.0) using namespace std; typedef long long ll; const int maxn=100000+10; const int Size=355; int block[Size+10][Size+10]; int num[maxn]; void Init(int n) { for(int i=0;i<n;++i) { scanf("%d",&num[i]); block[i/Size][i%Size]=num[i]; } for(int i=0;i<=n/Size;++i) sort(block[i],block[i]+Size); } void Modify(int p,int x) { int y=num[p]; num[p]=x; int bk=p/Size; for(int i=0;i<Size;++i) if(block[bk][i]==y) { block[bk][i]=x; break; } sort(block[bk],block[bk]+Size); } int Query(int L,int R,int X) { int Lb=L/Size,Rb=R/Size; int cnt=0; if(Lb==Rb) { for(int i=L;i<=R;++i) cnt+=(num[i]<=X); } else { for(int i=L;i<(Lb+1)*Size;++i) cnt+=(num[i]<=X); for(int i=Rb*Size;i<=R;++i) cnt+=(num[i]<=X); for(int i=Lb+1;i<Rb;++i) cnt+=upper_bound(block[i],block[i]+Size,X)-block[i]; } return cnt; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n,q; char str[5]; while(~scanf("%d%d",&n,&q)) { Init(n); int L,R,X; while(q--) { scanf("%s",str); if(str[0]=='M') { scanf("%d%d",&L,&X); Modify(L-1,X); } else { scanf("%d%d%d",&L,&R,&X); int ans=Query(L-1,R-1,X); printf("%d\n",ans); } } } return 0; }
相关文章推荐
- SPOJ 3261. Race Against Time(RACETIME) 【线段树套SBT】
- Codeforces Round #438 B. Race Against Time
- CodeFroces Round 438 B.Race Against Time(模拟)
- 【Codeforces 868 B. Race Against Time】& 模拟
- CF 868 B. Race Against Time【模拟】
- Codeforces Round #438 B Race Against Time(模拟)
- Codeforces Round #438 B. Race Against Time 题解
- ACM刷题之codeforce————Race Against Time
- Codeforces Round #438 B. Race Against Time 思路很重要
- 【Codeforces Round #438 B】Race Against Time
- Codeforces Round #438 - B. Race Against Time
- Codeforces-868B - Race Against Time - 模拟
- Codeforces 868 B Race Against Time(水题)
- Codeforces Round #438 (Div. 1 + Div. 2 combined) B. Race Against Time
- 【SPOJ-NAGAY】Joseph’s Problem【余数求和】【分块】
- 【CodeForces】80D Time to Raid Cowavans 分块
- SPOJ 3261 (树套树傻逼题)
- SPOJ:Visible Lattice Points(莫比乌斯函数 分块加速)
- BZOJ 2818 Gcd + spoj 4491(莫比乌斯反演 分块)
- Codeforces Beta Round #80 (Div. 1 Only) D. Time to Raid Cowavans 分块