2020 . 1 . 17 寒假训练

CodeForces - 1256D 

记录0的位置,然后计算每一个往前动了多少就可

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1e6+5;
char C[MAXN],ans[MAXN];
vector<int>v;
int main()
{
    int t;
    cin>>t;
    while(t--){
        ll n,k;
        cin>>n>>k;
        v.clear();
        cin>>C+1;
        ans[n+1] = '\0';
        for(int i=1;i<=n;i++){
            ans[i] = '1';
            if(C[i] == '0'){
                v.push_back(i);
            }
        }
        int len = v.size();
        for(int i=0;i<len;i++){
            int now = v[i];
            ll Max = min(k,(ll)now-i-1);
           // cout<<Max<<" * "<<endl;
            k -= Max;
            v[i]  -= Max;
            ans[v[i]] = '0';
        }
        cout<<ans+1<<endl;
    }
}

CodeForces - 1267E

计算每个人如果想要超过第n个需要怎么删,优先删除票数差中最大的。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 105;
int a[MAXN][MAXN];
vector<int>v[MAXN];
struct node
{
    int x,y,z,id;
}C[MAXN];
bool cmp(node A,node B)
{
    return A.z<B.z;
}
int main()
{
    int n,m;
    scanf("%d%d",&m,&n);
    int sum_n = 0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=1;i<m;i++){
        int sum_i = 0;
        sum_n = 0;
        for(int j=1;j<=n;j++){
            sum_i += a[j][i];
            sum_n += a[j][m];

            C[j].x = a[j][i];
            C[j].y = a[j][m];
            C[j].id = j;
            C[j].z = C[j].x - C[j].y;
        }
        sort(C+1,C+n+1,cmp);
        for(int j=1;j<=n;j++){
            if(sum_i < sum_n && C[j].z<0){
                sum_i -= C[j].z;
                v[i].push_back(C[j].id);
            }
        }
    }
    int idx = -1;
    int Min = 99999;
    for(int i=1;i<m;i++){
       // cout<<i<<" ** "<<v[i].size()<<endl;
        if(v[i].size() < Min){

            idx = i;
            Min = v[i].size();
        }
    }
    printf("%d\n",Min);
    for(int i=0;i<Min;i++){
        printf("%d ",v[idx][i]);
    }
    printf("\n");
}

HDU - 4578 

线段树,疯狂打标记

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll MAXN = 1e5+5;
const ll mod = 10007;
ll sum1[MAXN*4],sum2[MAXN*4],sum3[MAXN*4];
ll Set[MAXN*4],Add[MAXN*4],Mul[MAXN*4];
ll n,m;
void Up(ll p)
{
    sum1[p] = (sum1[2*p] + sum1[2*p+1])%mod;
    sum2[p] = (sum2[2*p] + sum2[2*p+1])%mod;
    sum3[p] = (sum3[2*p] + sum3[2*p+1])%mod;
}
void build(ll p,ll l,ll r)
{
    //cout<<p<<" * "<<l<<" * "<<r<<endl;
    Add[p] = Set[p] = 0;
    Mul[p] = 1;
    if(l == r){
        sum1[p] = sum2[p] = sum3[p] = 0;
        return ;
    }
    ll mid = (l+r)/2;
    build(2*p,l,mid);
    build(2*p+1,mid+1,r);
    Up(p);
}

void Down(ll p,ll len)
{
    if(Set[p]){
        Set[2*p] = Set[2*p+1] = Set[p];
        Add[2*p] = Add[2*p+1] = 0;
        Mul[2*p] = Mul[2*p+1] = 1;
        sum1[2*p] = ((len - (len/2)) * Set[p])%mod;
        sum2[2*p] = (((len - (len/2)) * Set[p])%mod *Set[p])%mod;
        sum3[2*p] = ((((len - (len/2)) * Set[p])%mod *Set[p])%mod *Set[p] )%mod;
        sum1[2*p+1] = ( ( len/2 ) * Set[p])%mod;
        sum2[2*p+1] = (( ( len/2 ) * Set[p])%mod *Set[p])%mod;
        sum3[2*p+1] = ((( ( len/2 ) * Set[p])%mod *Set[p])%mod *Set[p] )%mod;
        Set[p] = 0;
    }
    if(Mul[p] != 1){
        Mul[2*p] = (Mul[2*p] * Mul[p])%mod;
        Mul[2*p+1] = (Mul[2*p+1] * Mul[p])%mod;
        Add[2*p] = (Add[2*p] * Mul[p])%mod;
        Add[2*p+1] = (Add[2*p+1] * Mul[p])%mod;
        sum1[2*p] = (sum1[2*p] * Mul[p])%mod;
        sum1[2*p+1] = (sum1[2*p+1] * Mul[p])%mod;
        sum2[2*p] = ((sum2[2*p] * Mul[p])%mod * Mul[p])%mod;
        sum2[2*p+1] = ((sum2[2*p+1] * Mul[p])%mod * Mul[p])%mod;
        sum3[2*p] = (((sum3[2*p] * Mul[p])%mod * Mul[p])%mod * Mul[p])%mod;
        sum3[2*p+1] = (((sum3[2*p+1] * Mul[p])%mod * Mul[p])%mod * Mul[p])%mod;
        Mul[p] = 1;
    }
    if(Add[p]){
        Add[2*p] += Add[p];
        Add[2*p+1] += Add[p];
        ll tmp = (Add[p] * Add[p] % mod) * Add[p] % mod;
        sum3[2*p] = (sum3[2*p] + (tmp * (len - (len >> 1)) % mod) + 3 * Add[p] * ((sum2[2*p] + sum1[2*p] * Add[p]) % mod)) % mod;
        sum3[2*p+1] = (sum3[2*p+1] + (tmp * (len >> 1) % mod) + 3 * Add[p] * ((sum2[2*p+1] + sum1[2*p+1] * Add[p]) % mod)) % mod;
        sum2[2*p] = (sum2[2*p] + ((Add[p] * Add[p] % mod) * (len - (len >> 1)) % mod) + (2 * sum1[2*p] * Add[p] % mod)) % mod;
        sum2[2*p+1] = (sum2[2*p+1] + (((Add[p] * Add[p] % mod) * (len >> 1)) % mod) + (2 * sum1[2*p+1] * Add[p] % mod)) % mod;
        sum1[2*p] = (sum1[2*p] + (len - (len >> 1)) * Add[p]) % mod;
        sum1[2*p+1] = (sum1[2*p+1] + (len >> 1) * Add[p]) % mod;
        Add[p] = 0;
    }
}
void update(ll p,ll l,ll r,ll L,ll R,ll op,ll c)
{
    if(L<=l && r<=R){
        if(op == 1){
            Add[p] += c;
            ll tmp = ( ( (c*c)%mod * c )%mod * (r-l+1) ) %mod ;
            sum3[p] = (sum3[p] + (3*c*sum2[p])%mod + ((3*c*c)%mod*sum1[p])%mod + tmp%mod )%mod;
            sum2[p] = (sum2[p] + (2*c*sum1[p])%mod + ((c*c%mod)*(r-l+1)%mod) )%mod;
            sum1[p] = (sum1[p] + (r-l+1)*c%mod )%mod;
        }
        else if(op == 2){
            Mul[p] = (Mul[p] * c) % mod;
            Add[p] = (Add[p] * c)%mod;
            sum1[p] = (sum1[p] * c)%mod;
            sum2[p] = ((sum2[p] * c)%mod * c)%mod;
            sum3[p] = (((sum3[p] * c)%mod * c)%mod * c)%mod;
        }
        else if(op == 3){
            Mul[p] = 1;
            Add[p] = 0;
            Set[p] = c;
            sum1[p] = ((r - l + 1) * c)%mod;
            sum2[p] = (((r - l + 1) * c)%mod * c)%mod;
            sum3[p] = ((((r - l + 1) * c)%mod * c)%mod *c)%mod;
        }
        return ;
    }
    Down(p,(r-l+1));
    ll mid = (l+r)/2;
    if(L <= mid)
        update(2*p,l,mid,L,R,op,c);
    if(R > mid)
        update(2*p+1,mid+1,r,L,R,op,c);
    Up(p);
}
ll query(ll p,ll l,ll r,ll L,ll R,ll op)
{
    //cout<<p<<" * "<<l<<" * "<<r<<" * "<<L<<" * "<<R<<" * "<<op<<" ** "<<endl;
    if(L<=l && r<=R){
        if(op == 1)
            return sum1[p]%mod;
        else if(op == 2)
            return sum2[p]%mod;
        else if(op == 3)
            return sum3[p]%mod;
    }
    ll ans = 0;
    Down(p,r-l+1);
    ll mid = (l+r)/2;
    if(L<=mid) ans += query(2*p,l,mid,L,R,op);
    if(R>mid) ans += query(2*p+1,mid+1,r,L,R,op);
    return ans%mod;
}
int main()
{
    while(~scanf("%lld%lld",&n,&m)){
        if(n == m&& n == 0)break;
        ll op,x,y,c;
        build(1,1,n);
        for(ll i=1;i<=m;i++){
            scanf("%lld%lld%lld%lld",&op,&x,&y,&c);
            if(op != 4)
                update(1,1,n,x,y,op,c);
            else
                printf("%lld\n",query(1,1,n,x,y,c));
        }
    }
}

CodeForces - 1253C 

贪心,肯定是要排序,再从后往前拿,求个前缀和加个dp就行了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll MAXN = 2e5+5;
ll a[MAXN],dp[MAXN],sum[MAXN];
int main()
{
    ll n,m;
    scanf("%lld%lld",&n,&m);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    sort(a+1,a+1+n);
    for(ll i=1;i<=n;i++){
        sum[i] = sum[i-1]+a[i];
    }
    for(ll i=1;i<=m;i++){
        dp[i] = sum[i];
    }
    for(ll i=m;i<=n;i++){
        dp[i] = sum[i-m]+dp[i-m]+(sum[i] - sum[i-m]);
    }
    for(ll i=1;i<=n;i++){
        printf("%lld ",dp[i]);
    }
    printf("\n");

}

CodeForces - 1243B2 

水水

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 55;
char s1[MAXN],s2[MAXN];
struct node
{
    int x,y;
}C[10005];
int tot = 0 ;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        tot = 0;
        scanf("%d",&n);
        scanf("%s%s",s1+1,s2+1);
        bool ff = 1;
        for(int i = 1;i<=n;i++){
            if(s1[i] == s2[i])continue;
            bool f = 0;
            for(int j=i+1;j<=n;j++){
                if(s1[j] == s1[i]){
                    C[++tot].x = j;
                    C[tot].y = i;
                    swap(s1[j],s2[i]);
                    f = 1;
                    break;
                }
            }
            if(!f){
                for(int j=i+1;j<=n;j++){
                    if(s1[i] == s2[j]){
                        C[++tot].x = n;
                        C[tot].y = j;
                        swap(s1[n],s2[j]);
                        C[++tot].x = n;
                        C[tot].y = i;
                        swap(s1[n],s2[i]);
                        f = 1;
                        break;
                    }
                }
            }
            if(!f)ff = 0;
        }
        if(!ff)printf("No\n");
        else{
            printf("Yes\n%d\n",tot);
            for(int i=1;i<=tot;i++){
                printf("%d %d\n",C[i].x,C[i].y);
            }
        }
    }
}

HDU - 1166

水水水

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1e5+5;
int sum[MAXN*4],a[MAXN];
char op[10];
void build(int p,int l,int r)
{
    if(l == r){
        sum[p] = a[l];
        return ;
    }
    int mid = (l+r)/2;
    build(2*p,l,mid);
    build(2*p+1,mid+1,r);
    sum[p] = sum[2*p] + sum[2*p+1];
}
int query(int p,int l,int r,int L,int R)
{
    if(L<=l && r<=R){
        return sum[p];
    }
    int ret  = 0;
    int mid = (l+r)/2;
    if(L<=mid) ret += query(2*p,l,mid,L,R);
    if(R > mid) ret += query(2*p+1,mid+1,r,L,R);
    return ret;
}
void add(int p,int l,int r,int x,int k)
{
    if(l == r&& l == x){
        sum[p] += k;
        return ;
    }
    int mid = (l+r)/2;
    if(x<=mid)add(2*p,l,mid,x,k);
    else add(2*p+1,mid+1,r,x,k);
    sum[p] = sum[2*p] + sum[2*p+1];
    return ;
}
int main()
{
    int t,_=0;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        build(1,1,n);
        printf("Case %d:\n",++_);
        while(1)
        {
            int l,r;
            scanf("%s",op);
            if(op[0] == 'E')break;
            scanf("%d%d",&l,&r);
            if(op[0] == 'Q'){
                printf("%d\n",query(1,1,n,l,r));
            }
            else if(op[0] == 'A'){
                add(1,1,n,l,r);
            }
            else if(op[0] == 'S'){
                add(1,1,n,l,-r);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41645482/article/details/104020740