Codeforces Global Round 2

Contest Link

A.Ilya and a Colorful Walk

题意:
有n栋房子,每栋房子都有一种颜色,并且房子的位置为i,问最远的不同颜色的房子的距离是多少。

题解:
贪心,从最开始和最后面开始找,比较当前第i间和第j间房子颜色是否相等,如果不等,就比较第i间和第j-1间、第i+1间和第j间,如果不等,进行下一次比较,如果进行下一次比较,说明第i,j,i+1,j-1的房子颜色相等。

AC_CODE:

/*
 * Author: lwktxdy
 * Time: 2020-01-26 13:40:07
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<sstream>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#include<vector>
#include<limits.h>
#include<assert.h>
#include<bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define FORS(I, S) for (int I = 0; S[I]; ++I)
#define RS(X) scanf("%s", (X))
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
using namespace std;
typedef long long ll,LL;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<PII> VPII;
typedef pair<LL,LL> PLL;
typedef vector<PLL> VPLL;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(LL &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const LL &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.F); putchar(' '); _W(x.S);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
#ifdef HOME
 #define DEBUG(...) {printf("# ");printf(__VA_ARGS__);puts("");}
#else
 #define DEBUG(...)
#endif
#define Test() int t; cin >> t; while(t--) 
#define in freopen("in.txt","r",stdin);
#define out freopen("out.txt","w",stdout);
#define mod 998244353
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int maxn = 4e6+5;
char s[maxn];
int a[maxn];

/*
struct node{
	
}k[maxn];
*/

int main(){
    int n;
    R(n);
    FOR(i,1,n) R(a[i]);
    for(int i=1,j=n; i<=j; ){
        if(a[i] != a[j]){
            W(j-i);
            break;
        }else{
            if(a[i+1] != a[j]){
                W(n-i-1);
                break;
            }else if(a[i] != a[j-1]){
                W(j-2);
                break;
            }else{
                i += 1;
                j -= 1;
            }
        }
    }
}

B.Alyona and a Narrow Fridge

题意:
有一个2*h的冰箱,你可以往冰箱插入挡板(无厚度),挡板长度为2,然后依次给n种高度的牛奶,牛奶只能放在挡板上,问最多能放置多少牛奶?PS:需要按顺序放置。

题解:
每次同时放入2瓶牛奶,然后对牛奶高度进行排序(题解按从小到大排),第1瓶牛奶和第2瓶牛奶放一起,第3瓶牛奶和第四瓶牛奶放一起,… ,然后这些牛奶所占空间(最优)为height(1)+height(3)+…,判断当前空间和h的关系,如果小于等于h,那么可以继续放置新的牛奶,否则,判断只放入一瓶牛奶时所占的空间,由于现在的状态是奇数瓶牛奶,容易证明,当前所占空间(最优)为height(1) + height(2) + height(4) + height(6) + …,即从大到小,大的放一块,最小的单独放。

AC_CODE:

/*
 * Author: lwktxdy
 * Time: 2020-01-26 13:40:07
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<sstream>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#include<vector>
#include<limits.h>
#include<assert.h>
#include<bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define FORS(I, S) for (int I = 0; S[I]; ++I)
#define RS(X) scanf("%s", (X))
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
using namespace std;
typedef long long ll,LL;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<PII> VPII;
typedef pair<LL,LL> PLL;
typedef vector<PLL> VPLL;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(LL &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const LL &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.F); putchar(' '); _W(x.S);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
#ifdef HOME
 #define DEBUG(...) {printf("# ");printf(__VA_ARGS__);puts("");}
#else
 #define DEBUG(...)
#endif
#define Test() int t; cin >> t; while(t--) 
#define in freopen("in.txt","r",stdin);
#define out freopen("out.txt","w",stdout);
#define mod 998244353
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int maxn = 4e6+5;
char s[maxn];
ll a[maxn];

/*
struct node{
	
}k[maxn];
*/

int main(){
    ll n,h;
    R(n,h);
    FOR(i,1,n) R(a[i]);
    VL vl1,vl2;
    int i=1;
    for(; i<=n-1; i += 2){
        ll first = a[i];
        ll second = a[i+1];
        vl2.PB(first);
        vl2.PB(second);
        ll sum = 0LL;
        sort(vl2.begin(),vl2.end());
        for(int j=1; j<SZ(vl2); j+=2){
            sum += vl2[j];
        }   
        if(sum > h){
            vl1.PB(first);
            sort(vl1.begin(),vl1.end());
            ll new_sum = 0;
            for(int j=SZ(vl1)-1; j>1; j-=2){
                new_sum += vl1[j];
            }
            new_sum += vl1[0];
            W((new_sum > h ? static_cast<int>(SZ(vl1) - 1) : SZ(vl1)));
            return 0;
        }else{
            vl1.PB(first);
            vl1.PB(second);
        }
    }
    if(n % 2){
        vl2.PB(a[n]);
        sort(vl2.begin(),vl2.end());
        ll new_sum = 0;
        for(int j=SZ(vl2)-1; j>1; j-=2){
            new_sum += vl2[j];
        }
        new_sum += vl2[0];
        W((new_sum > h ? static_cast<int>(SZ(vl2) - 1) : SZ(vl2)));
        return 0;
    }else{
        sort(vl1.begin(),vl1.end());
        ll new_sum = 0;
        for(int j=SZ(vl1)-1; j>1; j-=2){
            new_sum += vl1[j];
        }
        new_sum += vl1[0];
        W((new_sum > h ? static_cast<int>(SZ(vl1) - 1) : SZ(vl1)));
        return 0; 
    }
}

C.Ramesses and Corner Inversion

题意:
给定两个n*m的矩阵,每次可以选定一个四个点(x1,y1),(x2,y1),(x1,y2),(x2,y2),每次可以让这四个点取反,问可不可以经过若干次操作,使得两个矩阵相等。

题解:
通过观察,每次操作所改变的,都是两行中的四个数,因此,无论执行多少次操作,我们只需判断,两个矩阵每一行不同的数的数量是否整除2,并且每一列需要改变的数是否整除2即可。

/*
 * Author: lwktxdy
 * Time: 2020-01-26 13:40:07
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<sstream>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#include<vector>
#include<limits.h>
#include<assert.h>
#include<bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define FORS(I, S) for (int I = 0; S[I]; ++I)
#define RS(X) scanf("%s", (X))
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
using namespace std;
typedef long long ll,LL;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<PII> VPII;
typedef pair<LL,LL> PLL;
typedef vector<PLL> VPLL;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(LL &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const LL &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.F); putchar(' '); _W(x.S);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
#ifdef HOME
 #define DEBUG(...) {printf("# ");printf(__VA_ARGS__);puts("");}
#else
 #define DEBUG(...)
#endif
#define Test() int t; cin >> t; while(t--) 
#define in freopen("in.txt","r",stdin);
#define out freopen("out.txt","w",stdout);
#define mod 998244353
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int maxn = 4e3+5;
char s1[maxn][maxn];
char s2[maxn][maxn];
int a[maxn];

/*
struct node{
	
}k[maxn];
*/

int main(){
    int n,m;
    R(n,m);
    REPP(i,0,n) REPP(j,0,m) R(s1[i][j]);
    REPP(i,0,n) REPP(j,0,m) R(s2[i][j]);
    VI v[n];
    bool flag = true;
    REPP(i,0,n){
        REPP(j,0,m){
            if(s1[i][j] != s2[i][j]){
                v[i].PB(j);
                a[j] += 1;
            }
        }
        if(SZ(v[i]) % 2) flag = false;
    }
    REPP(i,0,501){
        if(a[i] % 2){
            flag = false;
        }
    }
    if(flag) {
        W("Yes");
    }
    else W("No");
}
/*

2 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 1 0
0 0 0 1 0 1

3 4
0 0 0 0
0 0 1 1
1 1 0 0
0 0 1 1
1 1 0 0
0 0 0 0

*/

D.Frets On Fire

题意:
给你n个数组的起点,每个数组的元素是上一个元素+1,数组长度最长到达1e18,有q次询问,每次询问给定l,r,询问下标从l到r所有数组中元素的种类个数。

题解:
数组的顺序并不会改变答案,先对数组起点进行去重排序到数组v。设k = r - l,如果k > 相邻数组起点之叉 - 1,那么,相邻数组可认为是连续的,即两个数组所构成的范围是min(两个数组的起点)~max(两个数组的起点+k)。统计相邻数组构成的差为数组b,排序,计算前缀和方便O(1)计算和,根据输入的k判断有多少个差m满足k>差,假设m为0,那么答案为sum = v[SZ(v)-1] + m - v[0] +1LL,然后根据m的个数,每个m带来的与答案的差值,为c[SZ(b)-1] - c[pos-1] - (SZ(b)-pos) * m,c是前缀和数组,特判pos为0。

AC_CODE

/*
 * Author: lwktxdy
 * Time: 2020-01-26 13:40:07
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<sstream>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#include<vector>
#include<limits.h>
#include<assert.h>
#include<bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define FORS(I, S) for (int I = 0; S[I]; ++I)
#define RS(X) scanf("%s", (X))
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
using namespace std;
typedef long long ll,LL;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<PII> VPII;
typedef pair<LL,LL> PLL;
typedef vector<PLL> VPLL;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(LL &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const LL &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.F); putchar(' '); _W(x.S);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
#ifdef HOME
 #define DEBUG(...) {printf("# ");printf(__VA_ARGS__);puts("");}
#else
 #define DEBUG(...)
#endif
#define Test() int t; cin >> t; while(t--) 
#define in freopen("in.txt","r",stdin);
#define out freopen("out.txt","w",stdout);
#define mod 998244353
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int maxn = 4e6+5;

/*
struct node{
	
}k[maxn];
*/

int main(){
	int n;
    R(n);
    set<ll>a;
    FOR(i,1,n){
        ll ppp;
        R(ppp);
        a.insert(ppp);
    }
    if(SZ(a) > 1){
        vector<ll>v;
        copy(a.begin(),a.end(),inserter(v,v.begin()));
        vector<ll>b;
        REPP(i,0,SZ(v)-1){
            b.PB(v[i+1] - v[i] - 1LL);
        }
        //W(b[0]);return 0;
        sort(b.begin(),b.end());
        vector<ll>c;
        c.PB(b[0]);
        int ans = 1;
        for(; ans < SZ(b); ++ans){
            c.PB(c[ans-1] + b[ans]);
        }
        int q;
        R(q);
        while(q--){
            ll l,r;
            R(l,r);
            ll m = r - l;
            //multiset<ll>::iterator it = lower_bound(b.begin(),b.end(),m);
            auto pos = lower_bound(b.begin(),b.end(),m) - b.begin();
            //auto pos = distance(b.begin(),it);
            //W(pos);
            ll sum;
            if(pos == 0) sum = c[SZ(b)-1] - (SZ(b)-pos) * m;
            else sum = c[SZ(b)-1] - c[pos-1] - (SZ(b)-pos) * m;
            //W(SZ(b)-1,ans,pos);
            printf("%lld ",v[SZ(v)-1] + m - v[0] + 1LL - sum);
        }
    }else{
        int q;
        R(q);
        while(q--){
            ll l,r;
            R(l,r);
            printf("%lld ",r-l+1LL);
        }
    }
}

E.Pavel and Triangles

题意:
给定i根长度为ai的木棍,问最多可以组成多少个三角形,每根木棍只能用一次。

题解:
由于长度是2的次幂,因此,组合成三角形只有两种方法,第一种是三条边相等,第二种是两条边相等加上任意一条比这两条边小的边,因此,从后往前考虑,因为较长的边只有一根时,不能组成三角形,因此,有以下贪心取法,每一种木棍两根两根的取,如果最后剩下一根,则该木棍和自己长度相等的两条木棍组合,最后有sum个两根的集合和ans个三个相等的集合,答案为sum*2/3+ans。

AC_CODE:

/*
 * Author: lwktxdy
 * Time: 2020-01-26 13:40:07
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<sstream>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#include<vector>
#include<limits.h>
#include<assert.h>
#include<bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define FORS(I, S) for (int I = 0; S[I]; ++I)
#define RS(X) scanf("%s", (X))
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
using namespace std;
typedef long long ll,LL;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<PII> VPII;
typedef pair<LL,LL> PLL;
typedef vector<PLL> VPLL;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(LL &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const LL &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.F); putchar(' '); _W(x.S);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
#ifdef HOME
 #define DEBUG(...) {printf("# ");printf(__VA_ARGS__);puts("");}
#else
 #define DEBUG(...)
#endif
#define Test() int t; cin >> t; while(t--) 
#define in freopen("in.txt","r",stdin);
#define out freopen("out.txt","w",stdout);
#define mod 998244353
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int maxn = 4e6+5;
char s[maxn];
ll a[maxn];
ll Sum[maxn];

/*
struct node{
	
}k[maxn];
*/

int main(){
    int n;
    R(n);
    FOR(i,1,n) R(a[i]);
    ll sum = 0LL, ans = 0LL;
    for(int i=n; i>0; --i){
        sum += a[i] / 2;
        if(a[i] % 2 && sum){
            sum -= 1;
            ans += 1;
        }
    }
    W(ans+2*sum/3);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值