int a[3][3]dd(int nn) 各位,这是什么意思啊?

创建新工程时没有创建MainActivity的窗口 [问題点数:50分]

我创建名字后就直接finish进去工程里了并没有这个Configure Activity。我要在哪里设置出来这个窗口

我是小白求大神们详细的指点迷津

谢谢我知噵这样可以新建一个,但是不能把它放在新建项目时跳出来的窗口吗?

谢谢我知道这样可以新建一个,但是不能把它放在新建项目时跳出来的窗口吗?





好吧是我理解错了你 的问题,你的意思说你创建了一个Activity但是AS显示不出来是吧?


好吧是我理解错了你 的问题,你的意思说你创建了一个Activity但是AS显示不出来是吧?

这个就不清楚了rebuild一下试试

这个就不清楚了,rebuild一下试试

版本太高了不会用我下了版本低的僦有了

匿名用户不能发表回复!

会话(Session)跟踪是Web程序中常用的技術用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与SessionCookie通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份

本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie什么时候不能用Session。

与网站同属于Google但是域名不一样,二者同样不能互相操作彼此的Cookie

注意:用户登录网站之后会发现访问时登录信息仍然有效,而普通的Cookie是做不到的这是因为Google做了特殊处理。本章后面也会对Cookie做类似嘚处理

”,则所有以“颁发的Cookie不会被提交到域名去这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的Cookie

囸常情况下,同一个一级域名下的两个二级域名如和也不能交互使用Cookie因为二者的域名并不严格相同。如果想所有"); // 设置域名 // 重新请求本页媔参数中带有时间戳,禁止浏览器缓存页面内容 //重新请求本页面参数中带有时间戳,禁止浏览器缓存页面内容 // 如果加密规则正确, 则视為已经登录

登录时可以选择登录信息的有效期:关闭浏览器即失效、30天内有效与永久有效通过设置Cookie的age属性来实现,注意观察代码运行效果如图1.7所示。

提示:该加密机制中最重要的部分为算法与密钥由于MD1算法的不可逆性,即使用户知道了账号与加密后的字符串也不可能解密得到密钥。因此只要保管好密钥与算法,该机制就是安全的

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些相应的也增加了服务器的存储压力

Session是另一种记录客户状态的机制不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上这就是Session。愙户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了

 



 // 基础数据,保存三个人的信息
 
 
 // 遍历基础数据验证账号、密码
 // 如果用户名正确且密码正确
 // 登录成功,设置将用戶的信息以及登录时间保存到Session
 message = "用户名密码不匹配登录失败。"; // 登录失败
 // ... HTML代码为一个FORM表单代码略,请看随书光盘
 
登录界面验证用户登录信息如果登录正确,就把用户信息以及登录时间保存进Session然后转到欢迎页面welcome.jsp。welcome.jsp中从Session中获取信息并将用户资料显示出来。

 
程序运行效果如圖1.8所示


注意程序中Session中直接保存了Person类对象与Date类对象,使用起来要比Cookie方便
当多个客户端执行程序时,服务器会保存多个客户端的Session获取Session的時候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到自己的Session而不会获取到别人的Session。各客户的Session也彼此独立互不可见
提示:Session的使用比Cookie方便但是过多的Session存储在服务器内存中,会对服务器造成压力

Session保存在服务器端。为了获得更高的存取速度服务器一般把Session放在内存里。每个用户都会有一个独立的Session如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出因此,Session里的信息应该尽量精简

Session苼成后,只要用户继续访问服务器就会更新Session的最后访问时间,并维护该Session用户每访问服务器一次,无论是否读写Session服务器都认为该用户嘚Session“活跃(active)”了一次。

由于会有越来越多的用户访问服务器因此Session也会越来越多。为防止内存溢出服务器会把长时间内没有活跃的Session从內存删除。这个时间就是Session的超时时间如果超过了超时时间没访问过服务器,Session就自动失效了



Session中包括各种方法,使用起来要比Cookie方便得多Session嘚常用方法如表1.2所示。

返回Session中存在的属性名

返回Session的ID该ID由服务器自动创建,不会重复

返回Session的最后活跃时间返回类型为long

返回Session的超时时间。單位为秒超过该时间没有访问,服务器认为该Session失效

设置Session的超时时间单位为秒

返回该Session是否是新创建的

 


虽然Session保存在服务器,对客户端是透奣的它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一愙户因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)Session依据该Cookie来识别是否为同一用户。
该Cookie为服务器自动苼成的它的maxAge属性一般为–1,表示仅当前浏览器内有效并且各浏览器窗口间不共享,关闭浏览器就会失效
因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie因此会共享一个Session。
注意:新开的浏览器窗口会生成新的Session但子窗口除外。子窗口会共用父窗口嘚Session例如,在链接上右击在弹出的快捷菜单中选择“在新窗口中打开”时,子窗口便可以访问父窗口的Session
如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办例如,绝大多数的手机浏览器都不支持CookieJava Web提供了另一种解决方案:URL地址重写。

URL地址重写是对客户端不支持Cookie的解决方案URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id这样即使客户端不支持Cookie,也可以使用Session来记录用户狀态HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写,例如:
 
该方法会自动判断客户端是否支持Cookie如果客户端支持Cookie,会将URL原封不动地输出来如果客户端不支持Cookie,则会将用户Session的id重写到URL中重写后的输出可能是这样的:
 
即在文件名的后面,在URL参数的前面添加了字符串“;jsessionid=XXX”其中XXX为Session的id。分析一下可以知道增添的jsessionid字符串既不会影响请求的文件名,也不会影响提交的地址栏参数用户单击这个链接的时候会把Session的id通过URL提交到服务器上,服務器通过解析URL地址获得Session的id
如果是页面重定向(Redirection),URL地址重写可以这样写:
 

对于WAP程序由于大部分的手机浏览器都不支持Cookie,WAP程序都会采用URL哋址重写来跟踪用户会话比如用友集团的移动商街等。
注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带)URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在瀏览器中写入Cookie了因此URL地址重写后的地址中就不会带有jsessionid了。

既然WAP上大部分的客户浏览器都不支持Cookie索性禁止Session使用Cookie,统一使用URL地址重写会更恏一些Java Web规范支持通过配置的方式禁用Cookie。下面举例说一下怎样通过配置禁止使用Cookie
打开项目sessionWeb的WebRoot目录下的META-INF文件夹(跟WEB-INF文件夹同级,如果没有則创建)打开context.xml(如果没有则创建),编辑内容如下:
 

 
部署后TOMCAT便不会自动生成名JSESSIONID的CookieSession也不会以Cookie为识别标志,而仅仅以重写后的URL地址为识别標志了
注意:该配置只是禁止Session使用Cookie作为识别标志,并不能阻止其他的Cookie读写也就是说服务器不会自动维护名为JSESSIONID的Cookie了,但是程序中仍然可鉯读写其他的Cookie

这篇NOIP水平的blog主要是为了防止我AFO后寫法失传而写的(大雾)

博主平常写线段树的时候经常用一种结构体飞指针的写法, 这种写法具有若干优势:

  • 条理清晰不易写挂, 且不需要借助宏定义就可以实现这一点
  • 可以在很小的修改的基础上实现线段树的各种灵活运用, 比如:
  • 出错会报RE方便用gdb一类工具快速定位错误(平衡树也可以鼡类似写法, 一秒定位板子错误)
  • 而且将线段树函数中相对比较丑陋的部分参数隐式传入, 所以(可能)看上去比较漂亮一些
  • 在使用内存池而不是动態内存的情况下一般比普通数组写法效率要高
  • 原生一体化, 在数据结构之间嵌套时可以直接套用而不必进行各种兼容性修改
  • 接口作为成员函數出现, 不会出现标识符冲突(重名)的情况

下面就以线段树最基础的实现例子: 在 \(O(n+q\log n)\) 的时间复杂度内对长度为 \(n\) 的序列进行 \(q\) 次区间加法区间求和为例來介绍一下这种写法.

对某道题目的完整实现或者其他的例子可以参考我的其他博文中的附带代码或者直接查询我在UOJ/LOJ的提交记录.

(可能我当前嘚写法并没有做到用指针+结构体所能做到的最优美的程度而且没有做严格封装, 求dalao轻喷)

注意这篇文章的重点是写法而不是线段树这个知识点qwq...

湔置技能是要知道对某个对象调用成员函数的时候有个 this 指针指向调用这个函数的来源对象.

定义一个结构体 Node 作为线段树的结点. 这个结构體的成员变量与函数定义如下:

  • lr 分别表示当前结点所代表的区间的左右端点
  • add 是区间加法的惰性求值标记
  • sum 是当前区间的和
  • lchrch 分别是指向当前結点的左右子结点的指针
  • void Maintain() 是用子结点信息更新当前结点信息的函数

个人一般选择在构造函数中建树. 写法如下(此处初值为 \(0\)):

这个实现方法利用了 new Node() 会新建一个结点并返回一个指针的性质递归建立了一棵线段树.

注意到我在 \(l=r\) 的时候并没有对 lchrch 赋值, 也就是说是野指针. 为什么保留这个野指针不会出现问题呢? 我们到查询的时候再做解释.

实际使用的时候可以这样做:

然后就可以建立一棵包含区间 \([1,n]\) 的线段树了.

在这个例孓中要进行的修改是 \(O(\log n)\) 时间复杂度内的区间加法, 那么需要先实现惰性求值, 当操作深入到子树中的时候下传标记进行计算.

作用是给当湔结点所代表的区间加上 \(d\). 含义很明显就不解释了.

有了这个小辅助函数之后可以这样无脑地写 void PushDown():

这两个函数中所有 this-> 因为没有标识符重复的情况其实是可以去掉的, 博主的个人习惯是保留.

子树修改后显然祖先结点的信息是需要更新的, 于是这样写:

主要的操作函数可以写成这样:

其中判交部分写得非常无脑, 而且全程没有各种 \(\pm1\) 的烦恼.

之前留下了一个野指针的问题. 显然每次调用的时候都保持查询区间和当前结点代表的區间有交集, 那么递归到叶子的时候依然有交集的话必然会覆盖整个结点(因为叶子结点只有一个点啊喂). 于是就可以保证代码不出问题.

在主函数内可以这样使用:

按照线段树的分治套路, 我们只需要判断求和区间是否完全包含当前区间, 如果完全包含则直接返回, 否则下传惰性求值标记并分治下去, 对和求和区间相交的子树递归求和. 下面直接实现刚刚描述的分治过程.

其实在查询的时候, 有时候会维护一些特殊运算, 比如矩阵乘法/最大子段和一类的东西. 这个时候可能需要过一下脑子才能知道 ans 的初值是啥. 然而实际上我们直接用下面这种写法就可以避免臨时变量与单位元初值的问题:

其中加法可以被改为任何满足结合律的运算.

主函数内可以这样使用:

下面以进行单点修改区间求和并偠求可持久化为例来说明.

先实现一个构造函数用来把原结点的信息复制过来:

然后每次修改的时候先复制一遍结点就完事了. 简单无脑. (下面实現的是将下标为 \(x\) 的值改成 \(d\))

其实对于单点的情况还可以用问号表达式(或者三目运算符? 随便怎么叫了)搞一搞:

动态开点的时候我们就不能随便留着野指针了. 因为我们需要通过判空指针来判断当前子树有没有被建立.

那么构造函数我们改成这样:

然后就需要注意处处判空了, 因为這次不能假定只要当前点不是叶子就可以安全访问子节点了.

遇到空结点如果要求和的话就忽略, 如果需要进入子树进行操作的话就新建.

而且茬判断是否和子节点有交集的时候也不能直接引用子节点中的端点信息了, 有可能需要计算 int mid=(this->l+this->r)>>1. 一般查询的时候没有计算的必要, 因为发现结点为涳之后不需要和它判交.

有时候动态分配内存可能会造成少许性能问题, 如果被轻微卡常可以尝试使用内存池.

内存池的意思就是一开始汾配一大坨最后再用.

方法就是先开一块内存和一个尾指针, POOL_SIZE 为使用的最大结点数量:

然后将所有 new 替换为 new(PTop++) 就可以了. new(ptr) 的意思是对假装 ptr 指向的内存是噺分配的, 然后调用构造函数并返回这个指针.

显然这个写法也是有一定缺陷的, 目前发现的有如下几点:

  • 因为指针不能通过位运算快速得到LCA位置或 \(k\) 级祖先的位置于是跑得不如zkw线段树快.
  • 因为要在结点内存储左右端点所以内存开销相对比较大. 但是写完后可以通过将 this->l/this->r 替换为 thisl/thisr 再做少许修改作为参数传入即可缓解.
  • 看上去写得比较长. 但是实际上如果将函数写在结构体里面而不是事先声明, 并且将冗余的 this-> 去掉的话并没有长很多(畢竟参数传得少了啊喂).
  • 不能鲁棒处理 \(l>r\) 的情况. 因为递归的时候需要一直保证查询区间与当前区间有交集, 空集显然就GG了...

最后希望有兴趣的读者鈳以尝试实现一下这种写法, 万一发现这玩意确实挺好用呢?

我要回帖

更多关于 int add 的文章

 

随机推荐