題目大意:略
題目思路:線段樹or樹狀陣列
我們可以將區間值做一些調整。a*3+b*2+c=a+(a+b)+(a+b+c)
也就是利用字首和建樹。然後單點更新也就轉換成了區間更新。修改乙個點x時,需要修改 x~n 的值(因為是按字首和建樹
查詢時也很簡單,查詢 x~y,則直接返回 x~y的值,再減去 (x-1的值)*(y-x+1),要把(1~x)的字首和減去。
用線段樹時要注意乙個坑點,若查詢時 x==1,則不用減去任何值直接輸出即可,否則有可能re(別問我怎麼知道的
#include #include再附上樹狀陣列**#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r //
/巨集#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using
namespace
std;
#define gamma 0.5772156649015328606065120
#define mod 1000000007
#define inf 0x3f3f3f3f
#define n 1000005
#define maxn 100005typedef pair
pii;
typedef
long
long
ll;int
n,m,k,cnt,l,r;
ll a[maxn],mrk[maxn
<<2
],v;
struct
nodenode[maxn
<<2
];void build(int rt,int l,int
r)
int mid=l+r>>1
; build(lson);
build(rson);
node[rt].v=node[rt<<1].v+node[rt<<1|1
].v;
}inline
void pushup(int
rt)void add(int rt,int l,int
r)
if(mrk[rt])pushup(rt);
int mid=l+r>>1
;
if(r<=mid)add(lson);
else
if(l>mid)add(rson);
else
add(lson),add(rson);
node[rt].v=node[rt<<1].v+node[rt<<1|1
].v;
}ll
get(int rt,int l,int
r)int
main()
build(
1,1,n);
while(m--)
else
printf(
"%lld\n
",ans);}}
return0;
}
#include #include#include
#include
#include
#include
#include
using
namespace
std;
const
int n=100010
;typedef
long
long
ll;ll c[
2][n];
intn;
void add(int p,int x,ll y)}
ll query(
int p,int x)return
r;}int
main()
for(i=1;i<=q;i++)
else
}return0;
}
洛谷oj P1025 數的劃分 遞推 動態規劃
將整數 n n 分成 k k 份,且每份不能為空,任意兩個方案不相同 不考慮順序 例如 n 7n 7 k 3k 3 下面三種分法被認為是相同的。1,1,51,1,5 1,5,11,5,1 5,1,15,1,1 問有多少種不同的分法。輸入格式 n,kn,k 6620 0 2 le k le 62 k ...
洛谷 3768 簡單的數學題
根據crash的數字 很容易可以將式子化簡為 begin ans sum limits n sum limits ij i,j sum limits n d 3 sum limits right rfloor mu k k 2 left sum limits right rfloor i right...
洛谷 P4999 煩人的數學作業
題目鏈結 這道題從下午一來就開始寫,一直寫到 4 00 終於寫完了,累死我辣,但是做出來的感覺還是很蘇服的 本題思路 按位考慮 模擬 題目大意是很好理解的,就是算從l到r的所有數中每個數的每一位數字加起來的和。如果你從 l 到 r 這樣乙個個列舉的話,就是暴力了,不知道有沒有分 思路分析 既然是模擬...