hdu4417
2015-09-05 09:26
393 查看
这道题,一开始想到了用主席树,但是后来又觉得,不必这么大动干戈,是不是自己想复杂了,但是因为暂时没有别的想法,所以试着写了一下,wr了,瞬间感觉好像找对方向了,但是接下来就一直卡在了wr上,不得已找了个kuangbin的模板,修改了一下,交上去,结果ac了,有对照着找了一下错,结果发现是关于全局变量与递归的问题(已在代码中标出)。
(昨天吃了酸辣粉,一开始吃着不酸,不好吃,后来多加了醋,味道才稍微出来点,从来没有觉得醋这么神奇过!
)
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100010
struct querynode{
int l;
int r;
int h;
};
querynode query
;
int croot[40*N],lson[40*N],rson[40*N];
int Tree
;
int num
;
int newid[2*N];
int cou;
int ncou;
void lisanhua(){
sort(newid+1,newid+ncou+1);
ncou=unique(newid+1,newid+ncou+1)-(newid+1);
return;
}
int getid(int x){
return lower_bound(newid+1,newid+ncou+1,x)-newid;
}
int build(int l,int r){
int root=cou++;
croot[root]=0;
if(l<r){
int middle=(l+r)>>1;
lson[root]=build(l,middle);//因为这里要递归,递归中用到cou,所以cou的值会改变,lson[cou-1]中的cou不确定会不会变,但是rson[cou-1]中的cou一定会随着递归的变化而变化。
rson[root]=build(middle+1,r);
}
return root;
}
int insert(int froroot,int x){//已验证,正确
croot[cou++]=croot[froroot]+1;
int temproot=cou-1,rroot=cou-1;
int l=1,r=ncou;
while(l<r){
int middle=(l+r)>>1;
if(x<=middle){
r=middle;
lson[temproot]=cou++;
rson[temproot]=rson[froroot];
temproot=lson[temproot];
froroot=lson[froroot];
}
else{
l=middle+1;
lson[temproot]=lson[froroot];
rson[temproot]=cou++;
temproot=rson[temproot];
froroot=rson[froroot];
}
croot[temproot]=croot[froroot]+1;
}
return rroot;
}
int squery(int temproot,int l,int r,int x){//已验证,正确
//printf("%d %d %d\n",l,r,x);
if(l==r){
return croot[temproot];
}
else{
int middle=(l+r)>>1;
if(x<=middle){
return squery(lson[temproot],l,middle,x);
}
else if(x>middle){
return croot[lson[temproot]]+squery(rson[temproot],middle+1,r,x);
}
}
}
int fquery(int v,int x){
return squery(Tree[v],1,ncou,x);
}
int main(){
int t;
int n,m;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++){
scanf("%d%d",&n,&m);
cou=0;
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
newid[i]=num[i];
}
ncou=n;
for(int i=0;i<m;i++){
scanf("%d%d%d",&query[i].l,&query[i].r,&query[i].h);
newid[++ncou]=query[i].h;
}
lisanhua();
for(int i=0;i<m;i++){
query[i].l++;
query[i].r++;
query[i].h=getid(query[i].h);
}
Tree[0]=build(1,ncou);
for(int i=1;i<=n;i++){
Tree[i]=insert(Tree[i-1],getid(num[i]));
}
printf("Case %d:\n",cas);
for(int i=0;i<m;i++){
printf("%d\n",(fquery(query[i].r,query[i].h)-fquery(query[i].l-1,query[i].h)));
}
}
}
(昨天吃了酸辣粉,一开始吃着不酸,不好吃,后来多加了醋,味道才稍微出来点,从来没有觉得醋这么神奇过!
)
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100010
struct querynode{
int l;
int r;
int h;
};
querynode query
;
int croot[40*N],lson[40*N],rson[40*N];
int Tree
;
int num
;
int newid[2*N];
int cou;
int ncou;
void lisanhua(){
sort(newid+1,newid+ncou+1);
ncou=unique(newid+1,newid+ncou+1)-(newid+1);
return;
}
int getid(int x){
return lower_bound(newid+1,newid+ncou+1,x)-newid;
}
int build(int l,int r){
int root=cou++;
croot[root]=0;
if(l<r){
int middle=(l+r)>>1;
lson[root]=build(l,middle);//因为这里要递归,递归中用到cou,所以cou的值会改变,lson[cou-1]中的cou不确定会不会变,但是rson[cou-1]中的cou一定会随着递归的变化而变化。
rson[root]=build(middle+1,r);
}
return root;
}
int insert(int froroot,int x){//已验证,正确
croot[cou++]=croot[froroot]+1;
int temproot=cou-1,rroot=cou-1;
int l=1,r=ncou;
while(l<r){
int middle=(l+r)>>1;
if(x<=middle){
r=middle;
lson[temproot]=cou++;
rson[temproot]=rson[froroot];
temproot=lson[temproot];
froroot=lson[froroot];
}
else{
l=middle+1;
lson[temproot]=lson[froroot];
rson[temproot]=cou++;
temproot=rson[temproot];
froroot=rson[froroot];
}
croot[temproot]=croot[froroot]+1;
}
return rroot;
}
int squery(int temproot,int l,int r,int x){//已验证,正确
//printf("%d %d %d\n",l,r,x);
if(l==r){
return croot[temproot];
}
else{
int middle=(l+r)>>1;
if(x<=middle){
return squery(lson[temproot],l,middle,x);
}
else if(x>middle){
return croot[lson[temproot]]+squery(rson[temproot],middle+1,r,x);
}
}
}
int fquery(int v,int x){
return squery(Tree[v],1,ncou,x);
}
int main(){
int t;
int n,m;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++){
scanf("%d%d",&n,&m);
cou=0;
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
newid[i]=num[i];
}
ncou=n;
for(int i=0;i<m;i++){
scanf("%d%d%d",&query[i].l,&query[i].r,&query[i].h);
newid[++ncou]=query[i].h;
}
lisanhua();
for(int i=0;i<m;i++){
query[i].l++;
query[i].r++;
query[i].h=getid(query[i].h);
}
Tree[0]=build(1,ncou);
for(int i=1;i<=n;i++){
Tree[i]=insert(Tree[i-1],getid(num[i]));
}
printf("Case %d:\n",cas);
for(int i=0;i<m;i++){
printf("%d\n",(fquery(query[i].r,query[i].h)-fquery(query[i].l-1,query[i].h)));
}
}
}
相关文章推荐
- Fusion Application(FA)补丁管理工具简介
- hdu4417
- 面试题 7
- 乐观锁与悲观锁——解决并发问题
- C++ #include .h extern 的相关关系及说明
- IOS 内存管理
- 操作系统及IIS版本选择参考
- Immutable(不可变)集合
- HDU 5241 Friends (数学)
- 【UI初级 连载三】--------UIWindow 和 UIView 的使用
- 我想做的事
- PHP 程序员解决问题能力的八个级别
- 关于 U-BOOT 中 SPL 的移植——基本配置
- Ubuntu 12.04中文输入法的安装
- uC/OS-II任务机制理解
- vmware虚拟机下安装vmware tool之后可能导致虚拟机连不上网
- 3.2.5.2 模拟C函数 scanf()功能
- 查看某个文件夹下面是否有文件数据
- 3.2.5.2 模拟C函数 scanf()功能
- 找到控制面板