java学习
一.正则表达式
定义:正则表达式是一种用于描述字符串模式的表达式,通常被用于文本搜索、匹配和替换。它是一种强大的工具,可以在文本处理和文本分析中进行复杂的匹配和操作。
通过字符串引用里面的方法matches,然后执行匹配功能。
1.
举例:
public static void main(String[] args) {String t="a";System.out.println(t.matches("[abc]"));}
上面代码表示,如果字符串t里面的元素之含[]里面有的,那么就返回真,反之返回假。
public static void main(String[] args) {String t="p";System.out.println(t.matches("[abc]"));}
注意:只能匹配单个字符。
public static void main(String[] args) {String t="abc";System.out.println(t.matches("[abc]"));}
2.
举例:
注意:这里虽然是一个反斜杠,但是我们在写代码时需要两个,这是一个规则。
public static void main(String[] args) {String t="2";System.out.println(t.matches("\\d"));}
2是数字,所以结果应该是真。
但是如果你使用了多字符还是会和上面一样,返回false,因为这个也是匹配单字符的。
3.
举例:
public static void main(String[] args) {String t="123";System.out.println(t.matches("[1-9]{3}"));}
上面是1到9之间的数字刚刚好出现三次。
所以应该返回真。
使用案例:
比如我们需要匹配一个qq好是否合理,我们知道qq号全部是由数字组成,并且第一个数字不能为0,长度在5到10之间。
那么我们就可以用这些信息来写一个匹配。
下面是完成的代码:
public static void main(String[] args) {String t="12003000";System.out.println(t.matches("[1-9]\\d{5,10}"));}
表示第一个数字在1到9之间,后面全部是由数字组成,不包括第一个字符在内后面有4到9个数字,加起来就是限制在5到10个数字。
二.线段树练习题
Sample 1
Inputcopy | Outputcopy |
---|---|
5 5 1 5 4 2 3 2 2 4 1 2 3 2 2 3 4 1 1 5 1 2 1 4 | 11 8 20 |
线段树的入门题,这里就不过多讲解。
AC代码:
#include<iostream>
#include<cstdio>
#define MAXN 1000001
#define ll long long
using namespace std;
unsigned ll n,m,a[MAXN],ans[MAXN<<2],tag[MAXN<<2];
inline ll ls(ll x)
{return x<<1;
}
inline ll rs(ll x)
{return x<<1|1;
}
inline void push_up(ll p)
{ans[p]=ans[ls(p)]+ans[rs(p)];
}
void build(ll p,ll l,ll r)
{tag[p]=0;if(l==r){ans[p]=a[l];return ;}ll mid=(l+r)>>1;build(ls(p),l,mid);build(rs(p),mid+1,r);push_up(p);
}
inline void f(ll p,ll l,ll r,ll k)
{tag[p]=tag[p]+k;ans[p]=ans[p]+k*(r-l+1);
}
inline void push_down(ll p,ll l,ll r)
{ll mid=(l+r)>>1;f(ls(p),l,mid,tag[p]);f(rs(p),mid+1,r,tag[p]);tag[p]=0;
}
inline void update(ll nl,ll nr,ll l,ll r,ll p,ll k)
{if(nl<=l&&r<=nr){ans[p]+=k*(r-l+1);tag[p]+=k;return ;}push_down(p,l,r);ll mid=(l+r)>>1;if(nl<=mid)update(nl,nr,l,mid,ls(p),k);if(nr>mid) update(nl,nr,mid+1,r,rs(p),k);push_up(p);
}
ll query(ll q_x,ll q_y,ll l,ll r,ll p)
{ll res=0;if(q_x<=l&&r<=q_y)return ans[p];ll mid=(l+r)>>1;push_down(p,l,r);if(q_x<=mid)res+=query(q_x,q_y,l,mid,ls(p));if(q_y>mid) res+=query(q_x,q_y,mid+1,r,rs(p));return res;
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}build(1,1,n);while(m--){int k;cin>>k;switch(k){case 1:{ll l,r,w;scanf("%lld%lld%lld",&l,&r,&w);update(l,r,1,n,1,w);break;}case 2:{ll l,r;scanf("%lld%lld",&l,&r);printf("%lld\n",query(l,r,1,n,1));break;}}}return 0;
}