| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2319 人关注过本帖
标题:位运算与常用表达式的转换
取消只看楼主 加入收藏
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
结帖率:75%
收藏
 问题点数:0 回复次数:2 
位运算与常用表达式的转换
刚刚学习LIS最长上升子序列的时候,网上找了一文,里面有个解法是用树状数组来优化的
程序代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define rg register int
using namespace std;

int n;
int s[200005];

struct su{
    int v,id; //按照权值为第一关键字保证算法正确性
    inline bool operator <(su x){
        if(v==x.v)return id>x.id; //按照序号从大到小可以保证所求为上升子序列
        return v<x.v; //(针对标号)因为相同权值的数,前面的状态不能转移给后面
    }                 //(针对标号)从大到小枚举就不会出现这种情况
}a[200005];

inline void add(int x,int y){
    for(;x<=n;x+=x&-x) s[x]=max(s[x],y);
}

inline int ask(int x){
    rg res=0;
    for(;x>=1;x-=x&-x) res=max(s[x],res);
    return res;
}

int main(){
    cin>>n;
    for(rg i=1;i<=n;++i)
        cin>>a[i].v,a[i].id=i;
    sort(a+1,a+n+1);
    for(rg i=1;i<=n;++i)
        add(a[i].id,ask(a[i].id)+1);
    cout<<ask(n)<<endl;
    return 0;
}

请问里边的add函数和ask函数中for循环的那个x+=x&-x和x-=x&-x是什么意思?
能用非位运算表达式写吗?
搜索更多相关主题的帖子: res 位运算 for int return 
2020-04-11 11:12
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
收藏
得分:0 
回复 2楼 叶纤
谢谢啊,我都不知道11以上已经加了自动优化了。。。
2020-04-11 19:41
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
收藏
得分:0 
回复 4楼 lin5161678
谢谢大佬
2020-04-12 09:51
快速回复:位运算与常用表达式的转换
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035918 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved