zoukankan      html  css  js  c++  java
  • 【wikioi】2216 行星序列(线段树)

    http://wikioi.com/problem/2216/

    这题太让我感动了QAQ,让我找到了我一直以来写线段树的错误!!!!

    就是,pushdown一定要放在最前面!要不然顺序会错。也就是说,当到达更新点时,你重合了标记,然后再pushdown,就会导致pushdown标记没了顺序。

    因为有两种运算,乘法与加法,会冲突,所以必须先pushdown!

    还有一点是,要开long long !!!(我的线段是太慢了T_T)

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getint()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << #x << " = " << x << endl
    #define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
    inline const long long getint() { long long r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    inline const int max(const int &a, const int &b) { return a>b?a:b; }
    inline const int min(const int &a, const int &b) { return a<b?a:b; }
    
    #define lc x<<1
    #define rc x<<1|1
    #define MID (l+r)>>1
    #define lson l, m, lc
    #define rson m+1, r, rc
    const int N=200005;
    long long s[N*10], L, R, fix, who, n, p;
    int add1[N*10], add2[N*10];
    inline void pushup(const int &x) { s[x]=(s[lc]+s[rc])%p; }
    inline void pushdown(const int &x, const int &m) {
    	if(m==1) return;
    	long long mf=add2[x], af=add1[x]; add1[x]=0; add2[x]=1;
    	s[lc]=( (s[lc]*mf) + ((m-(m>>1))*af) )%p;
    	s[rc]=( (s[rc]*mf) + ((m>>1)*af) )%p;
    	add1[lc]=(af+(add1[lc]*mf))%p;
    	add1[rc]=(af+(add1[rc]*mf))%p;
    	add2[lc]=(mf*add2[lc])%p;
    	add2[rc]=(mf*add2[rc])%p;
    }
    void build(const int &l, const int &r, const int &x) {
    	if(l==r) { read(s[x]); s[x]%=p; add2[x]=1; return; }
    	int m=MID;
    	build(lson); build(rson);
    	pushup(x); add2[x]=1;
    }
    void update(const int &l, const int &r, const int &x) {
    	pushdown(x, r-l+1);
    	if(L<=l && r<=R) { 
    		if(who) add1[x]=(add1[x]+fix)%p, s[x]=(s[x]+((r-l+1)*fix)%p)%p; 
    		else add2[x]=(fix*add2[x])%p, s[x]=(s[x]*fix)%p; 
    		return; 
    	}
    	int m=MID;
    	if(L<=m) update(lson); if(m<R) update(rson);
    	pushup(x);
    }
    int query(const int &l, const int &r, const int &x) {
    	pushdown(x, r-l+1);
    	if(L<=l && r<=R) return s[x];
    	int m=MID, ret=0;
    	if(L<=m) ret+=query(lson); if(m<R) ret+=query(rson);
    	pushup(x);
    	return ret%p;
    }
    int main() {
    	read(n); read(p);
    	build(1, n, 1);
    	int m=getint(), cs;
    	while(m--) {
    		read(cs); read(L); read(R);
    		if(cs==1) {
    			read(fix); who=0;
    			update(1, n, 1);
    		}
    		else if(cs==2) {
    			read(fix); who=1;
    			update(1, n, 1);
    		}
    		else printf("%d
    ", query(1, n, 1));
    	}	
    	return 0;
    }
    

    “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小宇航员夏令营”,在这里小可可 不仅学到了丰富的宇航知识,还参与解决了一些模拟飞行中发现的问题,今天指导老师交给他一个任务,在这次模拟飞行的路线上有N个行星,暂且称它们为一个行 星序列,并将他们从1至n标号,在宇宙未知力量的作用下这N个行星的质量是不断变化的,所以他们对飞船产生的引力也会不断变化,小可可的任务就是在飞行途 中计算这个行星序列中某段行星的质量和,以便能及时修正飞船的飞行线路,最终到达目的地,行星序列质量变化有两种形式:

    1,行星序列中某一段行星的质量全部乘以一个值

    2,行星序列中某一段行星的质量全部加上一个值

    由于行星的质量和很大,所以求出某段行星的质量和后只要输出这个值模P的结果即可,小可可被这个任务难住了,聪明的你能够帮他完成这个任务吗?

    第一行两个整数N和P(1<=p<=1000000000);

      第二行含有N个非负整数,从左到右依次为a1,a2,…………,an(0<=ai<=100000000,1<=i<=n),其中ai表示第i个行星的质量:

      第三行有一个整数m,表示模拟行星质量变化以及求质量和等操作的总次数。从第四行开始每行描述一个操作,输入的操作有以下三种形式:

       操作1:1 t g c 表示把所有满足t<=i<=g的行星质量ai改为ai*c

       操作2:2 t g c 表示把所有满足t<=i<=g的行星质量ai改为ai+c

       操作3:3 t g 表示输出所有满足t<=i<=g的ai的和模p的值

       其中:1<=t<=g<=N,0<=c<=10000000

       注:同一行相邻的两数之间用一个空格隔开,每行开头和末尾没有多余空格

    对每个操作3,按照它在输入中出现的顺序,依次一行输出一个整数表示所求行星质量和

    7 43
    1 2 3 4 5 6 7 
    5
    1 2 5 5 
    3 2 4
    2 3 7 9
    3 1 3 
    3 4 7
    2
    35
    8

    100%的数据中,M,N<=100000

    40%的数据中,M,N<=10000

     

  • 相关阅读:
    东北师范大学信息化建设-北大公益论坛演讲稿
    HTML5定稿一周年,你必须要重新认识HTML5了
    从Java的角度理解前端框架,nodejs,reactjs,angularjs,requirejs,seajs
    mui开发webapp(2)
    mui开发webapp(1)
    html5+ plus和phoneGap、cordova的比较
    mui开发
    Web前端技能
    javascript权威指南第六版学习
    鼠标移入的box-shadow参考
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3936482.html
Copyright © 2011-2022 走看看