Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

蒟蒻给跪了,怎么写都是TLE,求大神解释一下

Posted by lushan06 at 2014-08-05 09:09:00 on Problem 3468
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <vector>
#include <ctime>
#include <functional>
#include <iterator>
#define pritnf printf
#define scafn scanf
#define For(i,j,k) for(int i=(j);i<=(k);(i)++)
using namespace std;
typedef __int64 LL;
typedef unsigned int Uint; 
const int INF=0x7ffffff;
//==============struct declaration==============

//==============var declaration=================
LL addv[100000*3];
LL sum[100000*3];
int n,q;
#define y1 leftboundary
#define y2 rightboundary
int y1,y2;
LL v;
LL _sum;
LL cmd;
//==============function declaration============
void add(LL l,LL r,LL o);
void query(LL l,LL r,LL o,LL sumadd);
void maintain(LL l,LL r,LL o);
//==============main code=======================
int main()
{  
#ifdef DEBUG
  freopen("in.txt","r",stdin);
  freopen("out.txt","w",stdout); 
#endif
  scanf("%d%d",&n,&q);
  memset(addv,0,sizeof(addv));
  memset(sum,0,sizeof(sum));
  For(i,1,n)
  {
    scanf("%I64d",&v);
    y1=y2=i;
    add(1,n,1);
  }
  For(i,1,q)
  {
    cin.ignore(10,10);
    scanf("%c %d %d",&cmd,&y1,&y2);
    if (cmd=='Q')
    {
      _sum=0;
      query(1,n,1,0);
      printf("%I64d\n",_sum);
    }
    else
    {
      scanf("%I64d",&v);
      add(1,n,1);
    }
  }
  return 0;
}
//================fuction code====================
void maintain(LL l,LL r,LL o)
{
  int m=(l+r)/2;
  int lc=2*o,rc=2*o+1;
  if (l<r)
  {
    maintain(l,m,lc);
    maintain(m+1,r,rc);
    sum[o]=sum[lc]+sum[rc]+addv[o]*(r-l+1);
  }
  else
    sum[o]=addv[o];
}
void add(LL l,LL r,LL o)
{
  int m=(l+r)/2;
  int lc=2*o,rc=2*o+1;
  if (y1<=l&&r<=y2)
    addv[o]+=v;
  else
  {
    if (m>=y1)
      add(l,m,lc);
    if (m<y2)
      add(m+1,r,rc);
  }
  maintain(l,r,o);
}
void query(LL l,LL r,LL o,LL sumadd)
{
  int m=(l+r)/2;
  int lc=2*o,rc=2*o+1;
  if (y1<=l&&r<=y2)
    _sum+=(r-l+1)*(sumadd)+sum[o];
  else
  {
    if (m>=y1)
      query(l,m,lc,sumadd+addv[o]);
    if (m<y2)
      query(m+1,r,rc,sumadd+addv[o]);
  }
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator