问题代码
报错:
[Error] expected unqualified-id before 'long'
[Note] in expansion of macro 'll'
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional> //“greater”: 未声明的标识符错误
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
#define ll long long
#define llu long long unsigned
#define mkp make_pair
const int N=1e5+10;
int n,m;
ll a[N]={0};
struct node{
ll sum;
ll a0;
ll d;
} seg[4*N];
node operator+(const node &a,const node &b)
{
node obj;
obj.a0=0;
obj.d=0;
obj.sum=a.sum+b.sum;
return obj;
}
void update(int k)
{
seg[k]=seg[k<<1]+seg[k<<1|1];
}
void set_tag(int k,int len ,ll a0,ll d)
{
seg[k].sum+=1ll*a0*len+1ll*len*(len-1)*d/2;
seg[k].d+=d;
seg[k].a0+=a0;
}
void push_down(int k,int len)//len ->个数
{
ll a0=seg[k].a0;
ll d=seg[k].d;
ll len0=len+1>>1;
set_tag(k<<1,len+1>>1,a0,d);
set_tag(k<<1|1,len>>1,a0+d*(len0),d);
seg[k].a0=0;
seg[k].d=0;
}
void init(int k,int l,int r)
{
if(l==r){
seg[k].sum=a[l];
seg[k].a0=0;
seg[k].d=0;
}else{
int mid=l+r>>1;
init(k<<1,l,mid);
init(k<<1|1,mid+1,r);
update(k);
}
}
void modify(int k,int l,int r,int ql,int qr,ll a0,ll d)
{
// printf("k = %d l = %d r = %d a0 = %d d = %d\n",k,l,r,a0,d);
if(l==ql && qr==r){
set_tag(k,r-l+1,a0,d);
}else{
if(seg[k].a0 || seg[k].d)
push_down(k,r-l+1);
int mid=l+r>>1;
int len0=(mid-ql+1);
if(qr<=mid)modify(k<<1,l,mid,ql,qr,a0,d);
else if(ql>mid)modify(k<<1|1,mid+1,r,ql,qr,a0,d);
else modify(k<<1,l,mid,ql,mid,a0,d),modify(k<<1|1,mid+1,r,mid+1,qr,a0+len0*d,d);
update(k);
}
}
node check(int k,int l,int r,int pos)
{
// printf("k = %d l = %d r = %d a0 = %d d = %d\n",k,l,r,a0,d);
if(l==pos && r==pos){
return seg[k];
}else{
if(seg[k].a0 || seg[k].d)
push_down(k,r-l+1);
int mid=l+r>>1;
if(pos<=mid)return check(k<<1,l,mid,pos);
else if(pos>mid)return check(k<<1|1,mid+1,r,pos);
}
}
int main(int argc, char** argv)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
init(1,1,n);
while(m--){
int op;
scanf("%d",&op);
int l,r,
ll K,D;
int p;
switch(op){
case 1:
scanf("%d%d%lld%lld",&l,&r,&K,&D);
modify(1,1,n,l,r,K,D);
break;
case 2:
scanf("%d",&p);
printf("%lld\n",check(1,1,n,p).sum);
break;
}
// for(int k=1;k<=10;k++)
// printf("%d:a0 = %d d = %d sum = %lld\n",k,seg[k].a0,seg[k].d,seg[k].sum) ;
}
return 0;
}
原因:
int l,r,//这里不能加逗号
ll K,D;//要不然ll也是一个变量,导致宏ll违法
标签:seg,int,ll,long,逗号,a0,include
From: https://www.cnblogs.com/ZZQ323/p/17378870.html