杭电多校第一场

这场我和队友过了4个题

rank差不多到了两百

不算太好

第七题是有实力切的

后边不想写了

这场我水了三道水题

卡了一道题

那道题队友解决了

第一题

1/r+1/t+1/s=1

这个不定方程只有三组解,我当时没有证出,只是猜了一下结论,然后随便以讨论就好了

#include
using namespace std;
typedef long long ll;
const int M=1e9+7;
int main(){
    int T;
    cin>>T;
    while(T--){
        ll x;
        scanf("%lld",&x);
        if(x%3==0){
            printf("%lld\n",x*x*x/27);
        }else if(x%4==0){
            printf("%lld\n",x*x*x/32);
        }else printf("-1\n");
    }
}

第三题

比较简单,随便排下序,很水的一道题

#include
using namespace std;
typedef long long ll;
const int N=2e4+10;
struct P{
    ll x,y,id;
}A[N];
bool cmp(P a,P b){
    return a.x<=b.x;
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n*3;++i){
            scanf("%lld%lld",&A[i].x,&A[i].y);
            A[i].id=i;
        }
        sort(A+1,A+1+3*n,cmp);
        for(int i=1;i<=n;++i){
            printf("%lld %lld %lld\n",A[3*i-2].id,A[3*i-1].id,A[3*i].id);
        }
    }
}

第十题

模拟水题,注意小数的问题

#include
using namespace std;
typedef long long ll;
int main(){
    int T;
    cin>>T;
    while(T--){
        int x,y;
        scanf("%d%d",&x,&y);
        int ans=x*60+y;
        char c;
        for(int i=1;i<=5;++i)scanf("%c",&c);
        double z;
        scanf("%lf",&z);
        if(c=='+'){
            ans+=round((z-8)*60);
        }else{
            ans-=round((z+8)*60);
        }
        ans+=3*1440;
        ans%=1440;
        if(ans/60<10) printf("0");
        printf("%d:",ans/60);
        if(ans%60<10) printf("0");
        printf("%d\n",ans%60);
    }
}

第四题

贪心算法,双指针扫一遍就好,每次不断取最小的,可以拿set来维护一下,这题把我卡了,队友代码:

#include

using namespace std;

struct pp{
    int l,r;
};

int ttt,n,m,head,tail,dui[100010],tot,str[100010],pre[100010],now,o;

pp a[100010];

bool cmp(pp &a,pp &b){
    if (a.l==b.l){
        return a.r1){
        int j=i/2;
        if (dui[i]>dui[j]) break;
        swap(dui[i],dui[j]);
        i=j;
    }
}

int pop(){
    int t=dui[1];
    swap(dui[1],dui[tot]);
    tot--;
    int i=1;
    while (i*2<=tot){
        int j=i*2;
        if ((j+1<=tot)&&(dui[j+1]a[now].r&&now!=m){
                now++;
            }
            if (i>=a[now].l&&i<=a[now].r){
                pre[i]=a[now].l;
            }
        }
        now=1;
        tail=1;
        o=pre[tail];
        while (1){
            while (pre[tail]==o){
                str[tail]=pop();
                tail++;
            }
            o=pre[tail];
            for (int i=now;i

第七题

我的算法两个log被卡了,诶似乎讲题的也是两个log,23333,上下他的代码:

#include 
using namespace std;
#define rep(i,a,n) for (int i=a;i=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector VI;
typedef long long ll;
typedef pair PII;
const ll mod=1000000007;
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;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head
 
//int a[101000];
int _;
ll n;
ll mul(ll a,ll b) {
	a%=mod; b%=mod;
//	printf("%lld %lld %lld %lld\n",a,b,c,d);
	return a*b%mod;
}
 
 
ll mul(ll a,ll b,ll c) {
	a%=mod; b%=mod; c%=mod;
//	printf("%lld %lld %lld %lld\n",a,b,c,d);
	return a*b%mod*c%mod;
}
int main() {
	for (scanf("%d",&_);_;_--) {
		scanf("%lld",&n);
		ll l=0,r=n;
		while (l+1>1;
			if (2*md-__builtin_popcountll(md)

 

你可能感兴趣的:(杭电多校第一场)