标签:lld puts typedef swa 单点 const ons its str
Water Problem
#include <bits/stdc++.h>
const int maxn = 1e5 + 7;
using namespace std;
int n, m, a[maxn], l, r;
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
for(int i = 2; i <= n; ++i) a[i] += a[i-1];
for(int i = 1; i <= m; ++i) {
scanf("%d%d",&l,&r);
printf("%d\n", a[r]-a[l-1]);
}
}
单点修改
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
int n, m, x, y, opt;
struct seg{int l, r, sum;} tree[maxn<<2];
void build(int p, int l, int r) {
tree[p].l = l; tree[p].r = r; tree[p].sum = 0;
if(l == r) return;
int mid = (l + r) >> 1;
build(p<<1, l, mid);
build(p<<1|1, mid+1, r);
}
void add(int p, int x, int y) {
if(tree[p].l == tree[p].r) {
tree[p].sum += y; return;
}
int mid = (tree[p].l + tree[p].r) >> 1;
if(x<=mid) add(p<<1, x, y);
else add(p<<1|1, x, y);
tree[p].sum = tree[p<<1].sum + tree[p<<1|1].sum;
}
int ask(int p, int l, int r) {
if(l == tree[p].l && tree[p].r == r) return tree[p].sum;
int mid = (tree[p].l + tree[p].r) >> 1;
if(r <= mid) return ask(p<<1, l, r);
else if(l > mid) return ask(p<<1|1, l, r);
else return ask(p<<1, l, mid) + ask(p<<1|1, mid+1, r);
}
int main() {
scanf("%d %d", &n, &m);
build(1, 1, n);
for(int i = 1; i <= n; ++i) scanf("%d",&x), add(1,i,x);
for(int i = 1; i <= m; ++i) {
scanf("%d %d %d", &opt, &x, &y);
if(opt) add(1, x, y);
else printf("%d\n", ask(1, x, y));
}
}
区间修改
#include <bits/stdc++.h>
typedef long long ll;
const int maxn = 1e5 + 7;
using namespace std;
int n, m, opt, l, r;
ll a[maxn], x;
struct seg{int l,r; ll sum,mx,tag;} tree[maxn<<2];
void push_up(int p) {
tree[p].mx = max(tree[p<<1].mx, tree[p<<1|1].mx);
tree[p].sum = tree[p<<1].sum + tree[p<<1|1].sum;
}
void push_down(int p) {
if(tree[p].tag) {
tree[p<<1].sum += 1LL*(tree[p<<1].r - tree[p<<1].l + 1)*tree[p].tag;
tree[p<<1|1].sum += 1LL*(tree[p<<1|1].r - tree[p<<1|1].l + 1)*tree[p].tag;
tree[p<<1].mx += tree[p].tag;
tree[p<<1|1].mx += tree[p].tag;
tree[p<<1].tag += tree[p].tag;
tree[p<<1|1].tag += tree[p].tag;
tree[p].tag = 0;
}
}
void build(int p, int l, int r) {
tree[p].l = l; tree[p].r = r;
tree[p].sum = tree[p].tag = tree[p].mx = 0;
if(l == r) {
tree[p].mx = tree[p].sum = a[l]; return;
}
int mid = (l + r) >> 1;
build(p<<1, l, mid), build(p<<1|1, mid+1, r);
push_up(p);
}
void add(int p, int l, int r, ll x) {
if(tree[p].l == l && tree[p].r ==r) {
tree[p].sum += 1LL*(r-l+1)*x;
tree[p].mx += x;
tree[p].tag += x;
return;
}
int mid = (tree[p].l + tree[p].r) >> 1;
push_down(p);
if(r <= mid) add(p<<1, l, r, x);
else if(l > mid) add(p<<1|1, l, r, x);
else add(p<<1, l, mid, x), add(p<<1|1, mid+1, r, x);
push_up(p);
}
ll ask_mx(int p, int l, int r) {
if(l == tree[p].l && tree[p].r == r) return tree[p].mx;
push_down(p);
ll ans = 0;
int mid = (tree[p].l + tree[p].r) >> 1;
if(r <= mid) ans = ask_mx(p<<1, l, r);
else if(l > mid) ans = ask_mx(p<<1|1, l, r);
else ans = max(ask_mx(p<<1, l, mid), ask_mx(p<<1|1, mid+1, r));
push_up(p);
return ans;
}
ll ask_sum(int p, int l, int r) {
if(tree[p].l == l && tree[p].r == r) return tree[p].sum;
push_down(p);
int mid = (tree[p].l + tree[p].r) >> 1;
if(r <= mid) return ask_sum(p<<1, l, r);
else if(l > mid) return ask_sum(p<<1|1, l, r);
else return ask_sum(p<<1, l, mid) + ask_sum(p<<1|1, mid+1, r);
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) scanf("%lld",&a[i]);
build(1, 1, n);
for(int i = 1; i <= m; ++i) {
scanf("%d%d%d", &opt, &l, &r);
if(opt == 1) {//max
printf("%lld\n", ask_mx(1, l, r));
}
else if(opt == 2) {//sum
printf("%lld\n", ask_sum(1, l, r));
}
else {// add
scanf("%lld", &x);
add(1, l, r, x);
}
}
}
差分
#include <bits/stdc++.h>
typedef long long ll;
const int maxn = 5e7 + 7;
using namespace std;
int n, m, l, r;
ll a[maxn], x;
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
for(int i = n; i >= 2; --i) a[i] -= a[i-1];
for(int i = 1; i <= m; ++i) {
scanf("%d%d%lld", &l, &r, &x);
a[l]+=x, a[r+1]-=x;
}
for(int i = 2; i <= n; ++i) a[i] += a[i-1];
for(int i = 1; i <= n; ++i) printf("%lld ",a[i]);puts("");
}
BZOJ1798区间加乘
#include <bits/stdc++.h>
typedef unsigned long long ll;
const int maxn = 1e5 + 7;
using namespace std;
int n, m, opt, l, r;
ll a[maxn], x, P;
struct seg{int l,r; ll sum,taga,tagm;} tree[maxn<<2];
void push_up(int p) {
tree[p].sum = (tree[p<<1].sum%P + tree[p<<1|1].sum%P)%P;
}
void push_down(int p) {
tree[p<<1].tagm = ((tree[p<<1].tagm%P) * tree[p].tagm%P)%P;
tree[p<<1].taga = ((tree[p<<1].taga%P) * tree[p].tagm%P)%P;
tree[p<<1].taga = (tree[p<<1].taga%P + tree[p].taga%P)%P;
tree[p<<1].sum = (((tree[p<<1].sum%P)*tree[p].tagm%P)%P + (tree[p].taga%P*(tree[p<<1].r-tree[p<<1].l+1LL))%P)%P;
tree[p<<1|1].tagm = ((tree[p<<1|1].tagm%P) * tree[p].tagm%P)%P;
tree[p<<1|1].taga = ((tree[p<<1|1].taga%P) * tree[p].tagm%P)%P;
tree[p<<1|1].taga = (tree[p<<1|1].taga%P + tree[p].taga%P)%P;
tree[p<<1|1].sum = (((tree[p<<1|1].sum%P)*tree[p].tagm%P)%P + (tree[p].taga%P*(tree[p<<1|1].r-tree[p<<1|1].l+1LL)%P)%P)%P;
tree[p].taga = 0, tree[p].tagm = 1;
}
void build(int p, int l, int r) {
tree[p].l = l; tree[p].r = r;
tree[p].sum = tree[p].taga = 0; tree[p].tagm = 1;
if(l == r) {
tree[p].sum = a[l]; return;
}
int mid = (l + r) >> 1;
build(p<<1, l, mid), build(p<<1|1, mid+1, r);
push_up(p);
}
void add(int p, int l, int r, ll x) {
if(tree[p].l == l && tree[p].r ==r) {
tree[p].taga = (tree[p].taga + x%P)%P;
tree[p].sum = (tree[p].sum + ((x%P)*(r-l+1LL))%P)%P;
return;
}
int mid = (tree[p].l + tree[p].r) >> 1;
push_down(p);
if(r <= mid) add(p<<1, l, r, x);
else if(l > mid) add(p<<1|1, l, r, x);
else add(p<<1, l, mid, x), add(p<<1|1, mid+1, r, x);
push_up(p);
}
void mul(int p, int l, int r, ll x) {
if(tree[p].l == l && tree[p].r ==r) {
tree[p].taga = ((tree[p].taga%P)*x%P)%P;
tree[p].tagm = ((tree[p].tagm%P)*x%P)%P;
tree[p].sum = ((tree[p].sum%P)*x%P)%P;
return;
}
int mid = (tree[p].l + tree[p].r) >> 1;
push_down(p);
if(r <= mid) mul(p<<1, l, r, x);
else if(l > mid) mul(p<<1|1, l, r, x);
else mul(p<<1, l, mid, x), mul(p<<1|1, mid+1, r, x);
push_up(p);
}
ll ask(int p, int l, int r) {
if(tree[p].l == l && tree[p].r == r) return tree[p].sum%P;
push_down(p);
int mid = (tree[p].l + tree[p].r) >> 1;
if(r <= mid) return ask(p<<1, l, r)%P;
else if(l > mid) return ask(p<<1|1, l, r)%P;
else return ((ask(p<<1, l, mid)%P + ask(p<<1|1, mid+1, r))%P)%P;
}
int main() {
scanf("%d%lld", &n, &P);
for(int i = 1; i <= n; ++i) scanf("%lld",&a[i]);
build(1, 1, n);
scanf("%d", &m);
for(int i = 1; i <= m; ++i) {
scanf("%d%d%d", &opt, &l, &r);
if(opt == 1) {
scanf("%lld", &x);
mul(1, l, r, x);
}
else if(opt == 2) {
scanf("%lld", &x);
add(1, l, r, x);
}
else if(opt == 3)
printf("%lld\n", ask(1, l, r));
}
}
//10 1000000000
//1 1 1 1 1
//1 1 1 1 1
//20
//2 5 10 478
//1 3 5 705
//3 2 8
//340543
HDU4027
#include <cstdio>
#include <cmath>
#include <algorithm>
typedef unsigned long long ll;
const int maxn = 1e6 + 7;
using namespace std;
int K, n, m, opt, l, r;
ll a[maxn], s[maxn];
struct seg{int l,r; ll sum;} tree[maxn<<2];
void push_up(int p) {
tree[p].sum = tree[p<<1].sum + tree[p<<1|1].sum;
}
void build(int p, int l, int r) {
tree[p].l = l; tree[p].r = r;
if(l == r) {
tree[p].sum = a[l]; return;
}
int mid = (l + r) >> 1;
build(p<<1, l, mid), build(p<<1|1, mid+1, r);
push_up(p);
}
ll ask(int p, int l, int r) {
if(tree[p].l == l && tree[p].r == r) return tree[p].sum;
int mid = (tree[p].l + tree[p].r) >> 1;
if(r <= mid) return ask(p<<1, l, r);
else if(l > mid) return ask(p<<1|1, l, r);
else return ask(p<<1, l, mid) + ask(p<<1|1, mid+1, r);
}
void sq(ll &x) {
ll t = sqrt(x);
while(t*t<=x)++t;
x = t-1;
}
void decr(int p, int l, int r) {
if(ask(1,l,r)<=(r-l+1))return;
if(tree[p].l == tree[p].r) {
sq(tree[p].sum);
return;
}
int mid = (tree[p].l + tree[p].r) >> 1;
if(r <= mid) decr(p<<1, l, r);
else if(l > mid) decr(p<<1|1, l, r);
else decr(p<<1,l,mid),decr(p<<1|1,mid+1,r);
push_up(p);
}
int main() {
while(scanf("%d", &n)!=EOF) {
for(int i = 1; i <= n; ++i) scanf("%lld",&a[i]);
build(1, 1, n);
scanf("%d", &m);
printf("Case #%d:\n",++K);
for(int i = 1; i <= m; ++i) {
scanf("%d%d%d", &opt, &l, &r); if(l > r) swap(l, r);
if(opt) printf("%lld\n", ask(1, l, r));
else decr(1, l, r);
}
puts("");
}
return 0;
}
区间加等差数列区间求和
#include <bits/stdc++.h>
typedef long long ll;
const int maxn = 1e5 + 7;
using namespace std;
int n, m, opt, l, r;
ll a[maxn], x, P, a0, d;
struct seg{int l,r; ll sum,taga,tagd;} tree[maxn<<2];
void push_up(int p) {
tree[p].sum = tree[p<<1].sum + tree[p<<1|1].sum;
}
void push_down(int p) {
ll tn = (tree[p<<1].r - tree[p<<1].l + 1), a0 = tree[p].taga, d = tree[p].tagd;
tree[p<<1].taga += a0;
tree[p<<1].tagd += d;
tree[p<<1].sum += 1LL*(a0*tn + tn*(tn-1LL)/2LL*d);
a0 = a0 + d*tn;
tn = (tree[p<<1|1].r - tree[p<<1|1].l + 1);
tree[p<<1|1].taga += a0;
tree[p<<1|1].tagd += d;
tree[p<<1|1].sum += 1LL*(a0*tn + tn*(tn-1LL)/2LL*d);
tree[p].taga = tree[p].tagd = 0;
}
void build(int p, int l, int r) {
tree[p].l = l;
tree[p].r = r;
tree[p].taga = tree[p].tagd = 0;
if(l == r) {
tree[p].sum = a[l]; return;
}
int mid = (l + r) >> 1;
build(p<<1, l, mid), build(p<<1|1, mid+1, r);
push_up(p);
}
void add(int p, int l, int r, ll a0, ll d) {
if(tree[p].l == l && tree[p].r == r) {
tree[p].taga += a0;
tree[p].tagd += d;
ll tn = (r - l + 1);
tree[p].sum += 1LL*(a0*tn + tn*(tn-1)/2LL*d);
return;
}
push_down(p);
int mid = (tree[p].l + tree[p].r) >> 1;
if(r <= mid) add(p<<1, l, r, a0, d);
else if(l > mid) add(p<<1|1, l, r, a0, d);
else {
add(p<<1, l, mid, a0, d);
ll a1 = a0 + 1LL*(mid-l+1LL)*d;
add(p<<1|1, mid+1, r, a1, d);
}
push_up(p);
}
ll ask(int p, int l, int r) {
if(tree[p].l == l && tree[p].r == r){
return tree[p].sum;
}
push_down(p);
int mid = (tree[p].l + tree[p].r) >> 1;
if(r <= mid) return ask(p<<1, l, r);
else if(l > mid) return ask(p<<1|1, l, r);
else return ask(p<<1, l, mid) + ask(p<<1|1, mid+1, r);
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%lld",&a[i]);
build(1, 1, n);
scanf("%d", &m);
for(int i = 1; i <= m; ++i) {
scanf("%d%d%d", &opt, &l, &r);
if(opt) {
scanf("%lld%lld", &a0,&d);
add(1, l, r, a0, d);
}
else
printf("%lld\n", ask(1, l, r));
}
}
//5
//0 0 0 0 0
//555
//1 2 4 2 2
//0 2 2
//0 3 3
//0 4 4
//1 1 3 1 1
//0 1 1
//0 2 2
//0 3 3
区间加等比数列区间求和
#include <bits/stdc++.h>
typedef unsigned long long ll;
const int maxn = 1e5 + 7;
using namespace std;
int n, m, opt, l, r;
ll a[maxn], x, P, a0, q0, q[maxn], sq[maxn];
struct seg{int l,r; ll sum,tag;} tree[maxn<<2];
void push_up(int p) {
tree[p].sum = tree[p<<1].sum + tree[p<<1|1].sum;
}
void push_down(int p) {
ll tn = (tree[p<<1].r - tree[p<<1].l + 1), a0 = tree[p].tag;
tree[p<<1].tag += a0;
tree[p<<1].sum += a0*sq[tn-1];
a0 = a0*q[tn]; tn = (tree[p<<1|1].r - tree[p<<1|1].l + 1);
tree[p<<1|1].tag += a0;
tree[p<<1|1].sum += a0*sq[tn-1];
tree[p].tag = 0;
}
void build(int p, int l, int r) {
tree[p].l = l;tree[p].r = r;
tree[p].tag = 0;
if(l == r) {
tree[p].sum = a[l]; return;
}
int mid = (l + r) >> 1;
build(p<<1, l, mid), build(p<<1|1, mid+1, r);
push_up(p);
}
void add(int p, int l, int r, ll a0) {
if(tree[p].l == l && tree[p].r == r) {
tree[p].tag += a0;
ll tn = (r-l+1);
tree[p].sum += a0*sq[tn-1];
return;
}
push_down(p);
int mid = (tree[p].l + tree[p].r) >> 1;
if(r <= mid) add(p<<1, l, r, a0);
else if(l > mid) add(p<<1|1, l, r, a0);
else {
add(p<<1, l, mid, a0);
ll a1 = a0*q[mid-l+1];
add(p<<1|1, mid+1, r, a1);
}
push_up(p);
}
ll ask(int p, int l, int r) {
if(tree[p].l == l && tree[p].r == r){
return tree[p].sum;
}
push_down(p);
int mid = (tree[p].l + tree[p].r) >> 1;
if(r <= mid) return ask(p<<1, l, r);
else if(l > mid) return ask(p<<1|1, l, r);
else return ask(p<<1, l, mid) + ask(p<<1|1, mid+1, r);
}
int main() {
scanf("%d%lld", &n,&q0); q[0]=1;
for(int i = 1; i <= n; ++i) scanf("%lld",&a[i]),q[i]=q[i-1]*q0;
sq[0]=q[0]; for(int i = 1; i <= n; ++i) sq[i] = sq[i-1] + q[i];
build(1, 1, n);
scanf("%d", &m);
for(int i = 1; i <= m; ++i) {
scanf("%d%d%d", &opt, &l, &r);
if(opt) {
scanf("%lld", &a0);
add(1, l, r, a0);
}
else
printf("%lld\n", ask(1, l, r));
}
}
BZOJ2241
#include <bits/stdc++.h>
using namespace std;
int ans=1e9+7;
int n,m,mp[407][407],a[407][407],sum;
int solve(int x,int y){
if(sum%(x*y))return 0;
for(int i=0;i<=n;++i)
for(int j=0;j<=m;++j)a[i][j]=mp[i][j];
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(a[i][j]<0)return 0;
if(i+x-1<=n&&j+y-1<=m){
int num=a[i][j];
a[i][j]-=num;
a[i+x][j]+=num;
a[i][j+y]+=num;
a[i+x][j+y]-=num;
}
if(a[i][j]>0)return 0;
}
}
ans=min(ans,sum/x/y);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)scanf("%d",&mp[i][j]),sum+=mp[i][j];
for(int i=n;i;--i)
for(int j=m;j;--j)
mp[i][j]-=mp[i-1][j];
for(int i=n;i;--i)
for(int j=m;j;--j)
mp[i][j]-=mp[i][j-1];
for(int C=1;C<=n;++C)
for(int L=1;L<=m;++L){
solve(C,L);
}
printf("%d\n",ans);
return 0;
}
EOJ3536
#include <cstdio>
#include <cstring>
#define add(l,r,x)(sc[l]+=x,sc[r+1]-=x)
typedef long long ll;
inline ll read(){
char c=getchar();ll x=0,f=1;
while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
return x*f;
}
using namespace std;
ll n;
ll sc[200003];
int main()
{
n=read();
if(n==1){
puts("1");
}
else if(n==2){
puts("3");
puts("7");
}
else {
if(n%2){
ll l=n/2+1,r=n/2+1;
add(l,r,1LL);
while(1){
ll x=r-l+1+2;
ll tmp;
tmp = 4LL*(x-1)*(x-1)+x+1LL;
add(l,r,tmp);
--l;++r;
add(l,l,x*(x+1)/2LL);
add(r,r,(5LL*x-3)*x/2LL);
if(l==1)break;
}
}
else{
ll l=n/2,r=n/2+1;
add(l,l,3LL);
add(r,r,7LL);
while(1){
ll x=r-l+1+2,tmp;
tmp = 4LL*(x-1)*(x-1)+x+1LL;
add(l,r,tmp);
--l;++r;
add(l,l,x*(x+1LL)/2);
add(r,r,(5LL*x-3)*x/2LL);
if(l==1)break;
}
}
ll tmp=0;
for(int i=1;i<=n;++i){
tmp+=sc[i];
printf("%lld\n",tmp);
}
}
return 0;
}
标签:lld puts typedef swa 单点 const ons its str
原文地址:https://www.cnblogs.com/RRRR-wys/p/9022005.html