樹狀數組區間操作模板

  樹狀數組支持區間修改與區間查詢,很久沒編,又快忘了,編程時要注意的兩點是:1、樹狀數組前綴和可能會爆int 2、用%d讀入long long即使輸入數據保證小於10^9也可能出問題

  記錄差分數組a[i]=num[i]-num[i-1];

sum[i]=sum[1]+sum[2]+...+sum[n]

   =a1+a1+a2+a1+a2+a3+...+a1+a2+...+an
   =n*a1+(n-1)*a2+...+1*an
   =(n+1)*(a1+a2+...+an)-1*a1-2*a2-...-(n)*an

分別處理segma(ai)和segma(ai*i)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<string>
#include<queue>
using namespace std;
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
#define MAXN 110000
#define MAXV MAXN*2
#define MAXE MAXV*2
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
typedef long long qword;
inline int nextInt()
{
        char ch;
        int x=0;
        bool flag=false;
        do
                ch=getchar(),flag=(ch==‘-‘)?true:flag;
        while(ch<‘0‘||ch>‘9‘);
        do x=x*10+ch-‘0‘;
        while (ch=getchar(),ch<=‘9‘ && ch>=‘0‘);
        return x*(flag?-1:1);
}

int n,m;
struct Edge
{
        int np;
        Edge *next;
}E[MAXE],*V[MAXV];
int tope=-1;
void addedge(int x,int y)
{
        E[++tope].np=y;
        E[tope].next=V[x];
        V[x]=&E[tope];
}

struct aaa
{
        int val,id;
};
bool operator <(aaa a1,aaa a2)
{
        return a1.val<a2.val;
}

multiset<aaa>S;
int ptr[MAXN][2];
int num[MAXN];
int gp[MAXN];
bool vis[MAXN];
bool vis2[MAXN];
bool dfs(int now,int g)
{
        if (now==-1)return true;
        if (vis2[now])
        {
                return gp[now]==g;
        }
        gp[now]=g;
        if (ptr[now][g]==-1)return false;
        vis[now]=vis2[now]=true;
        bool t=dfs(ptr[now][1-g],g) && dfs(ptr[now][g],g);
        vis2[now]=false;
        return t;
}
int main()
{
        freopen("input.txt","r",stdin);
        //freopen("output.txt","w",stdout);
        int i,j,k;
        int x,y,z;
        int a,b;
        scanf("%d%d%d",&n,&a,&b);
        aaa at;
        for (i=0;i<n;i++)
        {
                scanf("%d",&x);
                num[i]=x;
                at.val=x;
                at.id=i;
                S.insert(at);
        }
        multiset<aaa>::iterator it1;
        memset(ptr,-1,sizeof(ptr));
        for (i=0;i<n;i++)
        {
                at.val=a-num[i];
                it1=S.find(at);
                if (it1!=S.end())
                {
                        ptr[i][0]=it1->id;
                }
                at.val=b-num[i];
                it1=S.find(at);
                if (it1!=S.end())
                {
                        ptr[i][1]=it1->id;
                }
        }
        for (i=0;i<n;i++)
        {
                if (vis[i])continue;
                if (!dfs(i,0))
                {
                        if (!dfs(i,1))
                        {
                                printf("NO\n");
                                return 0;
                        }
                }
        }
        printf("YES\n");
        for (i=0;i<n;i++)
        {
                printf("%d ",gp[i]);
        }
        return 0;
}
时间: 2024-10-07 09:55:51

樹狀數組區間操作模板的相关文章

uva_10140/poj_2689 Prime Distance(區間素數)

uva 題目鏈接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=35&page=show_problem&category=13&problem=1081&mosmsg=Submission+received+with+ID+15689014 題目大意:在給定範圍L和R,找到L和R範圍內差距最小和最大的兩對素數.1=< L<=R<=2,147,483,647,

bzoj 1031: [JSOI2007]字符加密Cipher 後綴數組模板題

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3157  Solved: 1233[Submit][Status] Description 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JS

在子页面中操作模板页的内容

Button btn=(Button)this.Master.FindControl("Button1"); btn.Visible=false; 模板页中要注意html控件的url问题 ResolveClientUrl:获得相对路径 ResolveUrl:相对于跟目录的路径 在子页面中操作模板页的内容,布布扣,bubuko.com

Delphi 二維數組 和 多維數組

procedure TForm1.Button1Click(Sender: TObject); var s:string; i,j,k:integer; arr:Array of array of array of string; lst:TStringList; begin lst:=TStringlist.Create; setLength(arr,10,10,10); for i := low(arr) to High(arr) do begin s:=''; for j := low(a

uva 12299 线段树 点相关的操作模板

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=502&page=show_problem&problem=3720 唯一值得一说的就是shift,变成更新点就行 这道题主要是测试下我做的算法模板 先贴模板 /**************************************************************** 2014.4 By Pilgr

js 添加二維數組

var a = [];a.push([1,2,3,4]);a.push([5,6,7,8]);alert(a[0][1]); 添加二個數組進a 組成二維數組

bzoj 1041: [HAOI2008]圆上的整点 本原勾股數組

1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 853[Submit][Status] Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input r Output 整点个数 Sample Input 4 Sample Output 4 HINT n<=2000 000 000 Source 這道題可用本原勾股數組解,由於本原

subString,split方法——获取子字符串,分割數組

1.2.31 subString方法——获取子字符串本文所属图书 > Java程序开发参考手册 subString方法实现对字符串从指定的索引位置开始截取,直到此字符串的末尾,并返回一个新的字符串. 语法1 public String subString(int beginIndex) 返回值:指定的子字符串. 参数:beginIndex为开始处的索引(包括该位置). 示例 本示例使用subString方法截取字符串strCom,索引位置从3开始截取到字符串strCom的结尾处,并将截取的结果赋

C# 數據集合---1.數組

數組arry 1.一維數組 namespace arry { class Myarry { /// <summary> /// 數組Arry /// </summary> /// <param name="args"></param> static void Main(string[] args) { //聲明數組datatype[] arryName datatype指定被存儲在數組中的元素的類型 []指定數組的維度,秩指定數組的大小