zoukankan      html  css  js  c++  java
  • Luogu P2574 XOR的艺术 P3870 [TJOI2009]开关 P2846 [USACO08NOV]光开关Light Switching SP7259 LITE

    四倍经验题

    简单线段树qwq(那你怎么还调了好几个小时)

    修改:(ans[cur]=(r-l+1-ans[cur]);)

    点表示的区间有多长就是有多少盏灯 亮着的关掉 暗的开启 就是上述语句了。

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    #define MAXN 200233
    #define leftson cur<<1
    #define rightson cur<<1|1
    #define mid ((l+r)>>1)
    #define ll long long
    #define push_up ans[cur]=ans[leftson]+ans[rightson]
    #define push_down add(cur,leftson,l,mid); add(cur,rightson,mid+1,r); tag[cur]=0
    ll ans[MAXN<<2]={};
    int tag[MAXN<<2]={};
    //char c;
    //void build(int cur,int l,int r)
    //{
    //	if (l==r)
    //	{
    //		cin>>c;
    //		ans[cur]=c-'0';
    ////		printf("
    ??::%lld",ans[cur]);
    //		return;
    //	}
    //	build(leftson,l,mid);
    //	build(rightson,mid+1,r);
    //	push_up;
    //}
    inline void add(int delta,int cur,int l,int r)
    {
    	if (tag[delta])
    	{
    //		if(l==r)
    //		{
    //			printf("
    :::::::::%d's %lld
    ",l,ans[cur]);
    //		}
    		ans[cur]=(r-l+1-ans[cur]);
    		tag[cur]^=1;
    	}
    //	if (tag[cur]!=tag[delta])
    //	{
    //		printf("
    ::%lld  %lld
    ",(r-l+1),ans[cur]);
    //		ans[cur]=(r-l+1-ans[cur]);
    //		tag[cur]=tag[delta];
    //	}
    }
    inline void change(int cur,int l,int r,int adl,int adr)
    {
    //	printf("
    m%d~~%d 's tag::%d
    ",l,r,tag[cur]);
    	if (adl<=l&&r<=adr)
    	{
    		ans[cur]=(r-l+1-ans[cur]);
    		tag[cur]^=1;
    		return;
    	}
    	push_down;
    	if (adl<=mid) change(leftson,l,mid,adl,adr);
    	if (adr>mid) change(rightson,mid+1,r,adl,adr);
    	push_up;
    }
    
    ll query(int ql,int qr,int cur,int l,int r)
    {
    	if (ql<=l&&r<=qr)
    	{
    //		printf("sum::%d %d %lld
    ",l,r,ans[cur/2]);
    		return ans[cur];
    //		printf("
    
    
     ONE::%lld
    
    
    ",ans[cur]);
    	}
    	push_down;
    	ll answer=0;
    	if (ql<=mid)
    	{
    //		printf("
    
    
     TWO::%d
    
    
    ",query(ql,qr,leftson,l,mid));
    		answer+=query(ql,qr,leftson,l,mid);
    	}
    	if (qr>mid)
    	{
    //		printf("
    
    
     THREE::%d
    
    
    ",query(ql,qr,rightson,mid+1,r));
    		answer+=query(ql,qr,rightson,mid+1,r);
    	}
    	return answer;
    }
    
    int main()
    {
    	int n,m;
    	int p,l,r;
    	scanf("%d%d",&n,&m);
    	getchar();
    //	build(1,1,n);
    	for (int i=1;i<=m;i++)
    	{
    		scanf("%d%d%d",&p,&l,&r);
    		if (!p)
    		{
    			change(1,1,n,l,r);
    			
    /*			printf("
    tree1::
    %lld
    ",ans[1]);
    			for (int j=2;j<=3;j++)
    			{
    				printf("%lld ",ans[j]);
    			}
    			printf("
    ");
    			for (int j=4;j<=7;j++)
    			{
    				printf("%lld ",ans[j]);
    			}
    			printf("
    
    ");
    			*/
    //			printf("
    tree2::
    %lld
    ",tag[1]);
    //			for (int j=2;j<=3;j++)
    //			{
    //				printf("%lld ",tag[j]);
    //			}
    //			printf("
    ");
    //			for (int j=4;j<=7;j++)
    //			{
    //				printf("%lld ",tag[j]);
    //			}
    //			printf("
    
    ");
    //			
    //			for (int j=100;j<=200;j++)
    //			{
    //				printf("%d ",ans[j]);
    //			}
    			continue;
    		}
    		printf("%lld
    ",query(l,r,1,1,n));
    	}
    	return 0;
    }
    
  • 相关阅读:
    C++ template —— 类型区分(十一)
    C++ template —— 表达式模板(十)
    C++ template —— template metaprogram(九)
    C++ template —— 模板与继承(八)
    [转]2015有得有悟,2016笨鸟起飞
    C++ template —— trait与policy类(七)
    protobuf与json相互转换的方法
    如何通过卡面标识区分SD卡的速度等级
    MyEclipse设置字体和背景的方法
    JAVA中日期转换和日期计算的方法
  • 原文地址:https://www.cnblogs.com/Kan-kiz/p/10869102.html
Copyright © 2011-2022 走看看