zoukankan      html  css  js  c++  java
  • 线段树基操

    P1816 忠诚

    st表竟然写挂了,线段树一遍过(就当练码力)

    P1198 [JSOI2008]最大数

    • 1.动态在末尾插入一个数
    • 2.输出末尾的L个数的最大值
      线段树维护!

    P3870 [TJOI2009]开关

    P2574 XOR的艺术

    P2846 [USACO08NOV]光开关Light Switching

    三倍经验题!!!

    • 对一段01区间取^1,则若要修改这个o,这段区间的1的个数=区间长度-这段区间的1的个数(t[o].yihuo)
    • 对于一个o,是否修改这个区间,可以对t[o].tag^1,

    若原来有标记,现在又要反转这个区间,则t[o].tag置为零。

    若原来无标记,就打上标记

    P3373 【模板】线段树 2

    复习一下,今下午考了一道+和/(向下取整),特此复习

    P2023 [AHOI2009]维护序列

    上题的双倍经验

    P4588 [TJOI2018]数学计算

    第一反应并不觉得这是个线段树,题意很好模拟,交了发模拟WA的心痛,模拟的算法没有问题,貌似是……mod出锅了,题目并没有说mod是一个质数啊喂喂喂i除法不满足取模意义下的分配律啊喂,那么我们来想一下除法的逆运算:乘法。

    首先要知道一个关于取模的公式:

    (a*b)%P=(a%P*b%P)%P
    
    然后观察题意,始终是对于一个曾经乘过的数进行除操作,
    如果之前乘上了某一个数,那么之后无论经过多少次操作,再除以之前的这个数,那么就可以视作对其没有操作,
    那么不难想到可以以操作时间为线段建立线段树,记录的就是区间乘积模mod,那么就可以用上面的式子维护,
    

    对于操作1:

    把当前操作的序号位置变成m,
    

    对于操作2:

    就是将pos改成1,每次询问的t[1].mul就是整个序列的操作结果.
    

    P2161 [SHOI2009]会场预约 : 披着treap外衣的slt set好题

    /*
    translation:
    
    题意就是叫你维护一条时间轴,支持2种操作:
    1)删除当前时间轴上所有与新区间有交的区间输出删除个数,然后插入新区间。
    2)查询当前时间轴上的区间个数。
    reference:
    	
    solution:
    	首先考虑A操作,由于STL的set有相同元素只保留一个的特性,因此我们不难想到令有冲突的预约相等,
    	这样我们就可以很方便的用.find()这个函数来完成A操作了。
    	
    	怎么令它们相等呢?	
    	struct Plan{
    	    int l,r;
    	    bool operator <(const Plan &rhs)const{
    	        return r<rhs.l;
    	    }
    	};
    	这样对于两个Plan类型的结构体a,b来说,
    	a<b就代表a完全在b的左边,a>b就代表a完全在b的右边,a==b就代表a与b有冲突(有重叠部分)
    	对于B操作,直接输出set里元素的个数就好了
    trigger:
    	
    note:
    	*
    date:
    	2019.09.10
    */
    struct node{
    	int l,r;
    	bool operator < (const node &rhs)const{
    		return r<rhs.l;
    	}
    };
    
    int n;
    set<node>s;
    
    int main(){
    	freopen("yuyue.txt","r",stdin);
    	rd(n);
    	while(n--){
    		char op;
    		scanf(" %c",&op);
    		if(op=='A'){
    			int l,r;rd(l),rd(r);
    			int cnt=0;
    			node tmp=(node){l,r};
    			set<node>::iterator it=s.find(tmp);
    			while(it!=s.end()){
    				++cnt;
    				s.erase(it);
    				it=s.find(tmp);
    			}
    			s.insert((node){l,r});
    			printf("%d
    ",cnt);
    		}
    		else printf("%d
    ",s.size());
    	}
    	return 0;
    }
    
  • 相关阅读:
    从excel表中生成批量SQL,将数据录入到数据库中
    执行git命令时出现fatal: 'origin' does not appear to be a git repository错误
    小程序获取openid 出现null,{"errcode":40163,"errmsg":"code been used, hints: [ req_id: WNUzlA0105th41 ]"}
    由客户端内部通讯引发的插件化开发的随想和实践
    Prism6下的MEF:基于微软企业库的Cache
    从微信SDK看ProtoBuffer文件的生成
    Prism6下的MEF:添加Logger
    Prism6下的MEF:第一个Hello World
    讲讲Windows10(UWP)下的Binding
    Windows10(UWP)下的MEF
  • 原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11634686.html
Copyright © 2011-2022 走看看