2021杭电多校5

比赛情况:

在这里插入图片描述

比赛过程:cqf和wmd都因为被喊去当工具人晚到了,1006和1003我都先签掉了,然后我和wmd写1007,出题人一直在广播里说错误的题意导致我们一直判断错误,wa了几发后才过的。然后我一直在推1002,最后1h开始写1009,(赛后才发现1009有洛谷原题 )。

1006 Cute Tree

题意:按照这个代码建的树的节点数

idea:直接模拟即可

ACcode:

#include<bits/stdc++.h>
#define LL long long
#define N 201000
using namespace std;

int a[N],tr[N*4][3],t,n,tot = 0;


void build(int l,int r)
{
    int mid,len = r-l+1;
    tot++;
    if( l==r ) return;
    if( len==2 )
    {
        mid = (l+r)/2;
        build( l,l );
        build( r,r );
    }
    else
    {
        int b = l+len/3-1;
        int c = (b+r)/2;
        build( l,b );
        build( b+1,c );
        build( c+1,r );
    }
}

void solve()
{
    tot = 0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    build( 1,n );
    printf("%d\n",tot);
}

int main()
{
    //freopen("in.txt","r",stdin);
    cin>>t;
    while( t-- ) solve();
    return 0;
}

1003 VC Is All You Need

题意:给你一个k维平面,问你是不是随意放n个点都能用k-1条线分隔开

idea:直接判断n和k大小关系即可

ACcode:

#include<bits/stdc++.h>
#define LL long long
#define N 201000
using namespace std;

LL t,n,k;

void solve()
{
    scanf("%lld %lld",&n,&k);
    if( n<=k+1 ) printf("Yes\n");
    else printf("No\n");
}

int main()
{
    //freopen("in.txt","r",stdin);
    cin>>t;
    while( t-- ) solve();
    return 0;
}

1007 Banzhuan

题意:
给一个 n ∗ n ∗ n n*n*n nnn的立方体空间, 你只能用 1 ∗ 1 ∗ 1 1*1*1 111的小立方块去填,小立方体放在一个位置,那么它的价值就是 x ∗ y 2 ∗ z x*y^2*z xy2z ,如果你放的地方的底部(z轴)为空,那么它会一直往下掉。

借用一下dalao的图:
在这里插入图片描述


#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>

#define ll long long

using namespace std;

const ll mod = 1e9 + 7;

int T; long long n;

inline ll gcd(ll a, ll b) {
    while(b != 0) { ll aa = a, bb = b;  a = bb; b = aa % bb; }
    return a;
}

inline ll ksc(ll a, ll b){
    ll ans = 0;
    while( b > 0 ){
        if( b&1 ) ans = (ans + a) % mod;
        a = ( a + a ) % mod;
        b >>= 1;
    }
    return ans;
}

inline ll calc(ll l, ll r) {
    ll ans;
    if((r - l + 1) & 1) ans = ksc(r - l + 1, (l + r) >> 1);
    else ans = ksc((r - l + 1) >> 1, l + r);
    ll tmp1 = r, tmp2 = r + 1, tmp3 = 2 * r + 1, tmp4 = 6;
    ll g = gcd(tmp1, tmp4); tmp1 /= g; tmp4 /= g;
    g = gcd(tmp2, tmp4); tmp2 /= g; tmp4 /= g;
    g = gcd(tmp3, tmp4); tmp3 /= g; tmp4 /= g;
    tmp1 = ksc(tmp1, ksc(tmp2, tmp3));
    if(l == 2) tmp1 -= 1;
    ans = ksc(ans, tmp1);
    if((r - l + 1) & 1) tmp1 = ksc(r - l + 1, (l + r) >> 1);
    else tmp1 = ksc((r - l + 1) >> 1, l + r);
    ans = ksc(ans, tmp1);

    return ans;
}

inline ll calc3(ll l, ll r) {
    ll ans;
    if((r - l + 1) & 1) ans = ksc(r - l + 1, (l + r) >> 1);
    else ans = ksc((r - l + 1) >> 1, l + r);
    ll tmp1 = r, tmp2 = r + 1, tmp3 = 2 * r + 1, tmp4 = 6;
    ll g = gcd(tmp1, tmp4); tmp1 /= g; tmp4 /= g;
    g = gcd(tmp2, tmp4); tmp2 /= g; tmp4 /= g;
    g = gcd(tmp3, tmp4); tmp3 /= g; tmp4 /= g;
    tmp1 = ksc(tmp1, ksc(tmp2, tmp3));
    if(l == 2) tmp1 -= 1;
    ans = ksc(ans, tmp1);
    tmp1 = ksc(n, n);
    ans = ksc(ans, tmp1);

    return ans;
}

inline ll calc1(ll l = 2, ll r = n) {
    ll ans;
    if((r - l + 1) & 1) ans = ksc(r - l + 1, (l + r) >> 1);
    else ans = ksc((r - l + 1) >> 1, l + r);
    return ans;
}

int main() {
    //freopen("test.in", "r", stdin);
    scanf("%d", &T);
    while(T--) {
        scanf("%lld", &n);

        ll ansmax = calc(1, n), ansmin = (ansmax - calc(2, n) - calc1() + mod + mod) % mod;

        ansmax = calc3(1, n);


        /*ansmax = ansmin = 0;
        for(int i = 1; i <= n; ++i)
            for(int j = 1; j <= n; ++j)
                for(int k = 1; k <= n; ++k) ansmax = (ansmax + i * j % mod * j % mod * k % mod) % mod;

                for(int i = 1; i <= n; ++i)
                    for(int j = 1; j <= n; ++j)
                        for(int k = 1; k <= n; ++k) if(i == 1 || j == 1 || k == 1) ansmin = (ansmin + i * j % mod * j % mod * k % mod) % mod;

                        for(int i = 1; i <= n; ++i)
                            for(int j = 1; j <= n; ++j)
                                for(int k = 1; k <= n; ++k) if(i == 1 && j == 1 && k != 1) ansmin = (ansmin - i * j % mod * j % mod * k % mod + mod) % mod; */

        printf("%lld\n%lld\n", ansmin, ansmax);
    }

    return 0;
}

T1009 Array

#include<bits/stdc++.h>
#define LL long long
typedef long long i64;
const int N=1e6+100;
char ib[N*12],*ip=ib;
int read(){int x;scanf("%d",&x);return x;};
LL ans=0;
int n,mx;
struct pos
{
    int x,y;
}ps[N],pb[N];
void rsort(pos*a,pos*b,int n)
{
    for(int t=0;t<20;t+=10){
        int ts[1111]={};
        pos*rs[1111],*p=b;
        for(int i=0;i<n;++i)++ts[a[i].y>>t&1023];
        for(int i=0;i<1024;++i)rs[i]=p,p+=ts[i];
        for(int i=0;i<n;++i)*rs[a[i].y>>t&1023]++=a[i];
        std::swap(a,b);
    }
}
int tk;
struct node
{
    i64 s0,s1,s2;
    int ed;
}bit[N*2];
void inc(int w,int a)
{
    w+=n+2;
    i64 a0=a*w*i64(w-1),a1=a*i64(1-w*2),a2=a;
    for(;w<=mx;w+=w&-w)
    {
        if(bit[w].ed!=tk)
        {
            bit[w]=(node){a0,a1,a2,tk};
        }
        else
        {
            bit[w].s0+=a0;
            bit[w].s1+=a1;
            bit[w].s2+=a2;
        }
    }
}
i64 sum(int w)
{
    w+=n+2;
    int w0=w;
    i64 s0=0,s1=0,s2=0;
    for(;w;w-=w&-w)if(bit[w].ed==tk)
    {
        s0+=bit[w].s0;
        s1+=bit[w].s1;
        s2+=bit[w].s2;
    }
    return (s2*w0+s1)*w0+s0;
}
void ins(int l,int r,int c)
{
    inc(2*c-r+1,1);
    inc(2*c-l+1,-1);
}
void que(int l,int r,int c)
{
    ans+=sum(2*c-l)-sum(2*c-r);
}
void cal(pos*a,int n)
{
    ++tk;
    ins(0,a[1].x,0);
    for(int i=1;i<n;++i)
    {
        int w=a[i].x;
        que(a[i].x,a[i+1].x,i);
        ins(a[i].x,a[i+1].x,i);
    }
    que(a[n].x,::n+1,n);
}

void so()
{
    ans = 0;
//    memset(ps,0,sizeof(ps));
//    memset(pb,0,sizeof(pb));
//    memset(ib,0,sizeof(ib));
    scanf("%d",&n);
    mx=n*2+5;
    for(int i=1;i<=n;++i)ps[i]=(pos){i,read()};
    rsort(ps+1,pb,n);
    for(int i=1,j=1;i<=n;i=j){
        for(++j;j<=n&&ps[i].y==ps[j].y;++j);
        cal(ps+i-1,j-i);
    }
    printf("%lld\n",ans/2);
}

int main(){
    int T;
    scanf("%d",&T);
    while( T-- ) so();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值