首页 > 其他分享 >2024杭电第一场

2024杭电第一场

时间:2024-07-20 14:52:23浏览次数:14  
标签:杭电 int ll long 2024 ++ 第一场 y2 dp

1012 并

考虑两维坐标都离散化后枚举每个格子,用二维前缀和计算其被覆盖的次数,设为cnt

则k固定时该格子的贡献为:( 1 - C[n-cnt][k] / C[n][k] ) * 该格子的面积

注意事项:1.处处取模 2.给的是点坐标,不是格点坐标,因此计算二维前缀和时要x++,y++

#include<bits/stdc++.h>
using namespace std;
const int N = 4e3+5;
const int mod = 998244353;
typedef long long ll;
int n;
int sum[N][N],tot[N];
ll f[N][N];
map<int,int>xid,yid;
struct tringle{
    int x,y,x2,y2;
    void deal(){
        x=xid[x],x2=xid[x2];
        y=yid[y],y2=yid[y2];
        x++,y++;
        sum[x][y]++;
        sum[x][y2+1]--;
        sum[x2+1][y]--;
        sum[x2+1][y2+1]++;
    }
}t[N];
int x[N*2],y[N*2];
int qpow(ll a,ll b){
    ll ret=1;
    while(b){
        if(b&1) ret=ret*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ret;
}
int inv(int x){
    return qpow(x,mod-2);
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    
    f[0][0]=1;
    for(int i=1;i<N;i++){
        f[i][0]=1;
        for(int j=1;j<=i;j++)
            f[i][j]=(f[i-1][j-1]+f[i-1][j])%mod;
    }
        
    cin>>n;
    int cntx=0,cnty=0;
    for(int i=1;i<=n;i++){
        cin>>t[i].x>>t[i].y>>t[i].x2>>t[i].y2;
        x[++cntx]=t[i].x;x[++cntx]=t[i].x2;
        y[++cnty]=t[i].y;y[++cnty]=t[i].y2;
    }
    sort(x+1,x+cntx+1);
    sort(y+1,y+cnty+1);
    cntx=unique(x+1,x+cntx+1)-(x+1);
    cnty=unique(y+1,y+cnty+1)-(y+1);
    

    for(int i=1;i<=cntx;i++){
        xid[x[i]]=lower_bound(x+1,x+cntx+1,x[i])-(x);
     //   cout<<x[i]<<" "<<xid[x[i]]<<"\n";
    }
    
    for(int i=1;i<=cnty;i++){
        yid[y[i]]=lower_bound(y+1,y+cnty+1,y[i])-(y);
    //    cout<<y[i]<<" "<<yid[y[i]]<<"\n";
    }
    for(int i=1;i<=n;i++)
        t[i].deal();
    
    
    for(int i=1;i<=cntx;i++){
        
        for(int j=1;j<=cnty;j++){
            int tmp=(sum[i-1][j]+sum[i][j-1])%mod;
            tmp=(tmp-sum[i-1][j-1]+mod)%mod;
            sum[i][j]+=tmp;
            sum[i][j]%=mod;
            tot[sum[i][j]]+=1ll*(x[i]-x[i-1])*(y[j]-y[j-1])%mod;
            tot[sum[i][j]]%=mod;
        }
    }
    
    ll ans[n+5]={0};
    for(int k=1;k<=n;k++){
        
        int inv_c_n_k=inv(f[n][k]);
        for(int cnt=1;cnt<=n;cnt++){
            ll tmp=(1-1ll*f[n-cnt][k]*inv_c_n_k%mod+mod)%mod;
            tmp=tmp*tot[cnt]%mod;
            ans[k]=(ans[k]+tmp)%mod;
        }
    }
    for(int i=1;i<=n;i++) cout<<ans[i]<<"\n";
    
}

1001 

处理出每个循环串的哈希值丢到一个map里,在大串中查询[ i-len,i ]的哈希值是否在map中出现过,是则+1

不要被骗去写后缀自动机了,这题空间给的很小

#include<bits/stdc++.h>
using namespace std;
const int N = 1048576*2;
const int base=13331;
typedef unsigned long long ull;
ull z[N],p[N],f[N];
ull get1(int l,int r){
	return z[r]-z[l-1]*p[r-l+1];
}
ull get2(int l,int r){
	return f[r]-f[l-1]*p[r-l+1];
}
void solve(){
	map<ull,int>mp;
	string s,t;cin>>s>>t;
	s=s+s;
	s=" "+s;
	p[0]=1;
	int n=s.length();
	n--;
	for(int i=1; i<=n; i++)
	{
		z[i]=z[i-1]*base-s[i]-'a'+1;
		p[i]=p[i-1]*base;
	}
	
	t=" "+t;
	int m=t.length();
	m--;
	for(int i=1; i<=m; i++)
	{
		f[i]=f[i-1]*base-t[i]-'a'+1;
	}
	
	int ans=0;
	for(int i=1;i<=n/2;i++){
		mp[get1(i,i+n/2-1)]=1;
	}
	for(int j=n/2;j<=m;j++){
		if(mp[get2(j-n/2+1,j)]) ans++;
	}
	cout<<ans<<"\n";
}

int main(){
	ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t;cin>>t;
	while(t--){
		//TODO
		solve();
	}
}

1002 

暴力dp就可以

正解是 nsqrt(k) 的做法,考虑把读入的数据随机打乱,则在第i格预计的期望是 k/n*i,在这个范围附近找即可,但步长没看懂为什么是v*sqrt(k)

#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
typedef long long ll;
ll dp[N*4],a[N],b[N],c[N],d[N];

void solve(){
	int n,k;cin>>n>>k;
	for(int i=1;i<=n;i++) {
		cin>>a[i]>>b[i]>>c[i]>>d[i];
	}
	
	dp[0]=0;
	for(int j=1;j<=k;j++) dp[j]=1e16;
//	cout<<666<<"\n";
	for(int i=1;i<=n;i++){
		for(int j=k;j>=1;j--){
	
			if(j>=1) dp[j]=min(dp[j],dp[j-1]+a[i]);
			if(j>=2) dp[j]=min(dp[j],dp[j-2]+b[i]);
			if(j>=3) dp[j]=min(dp[j],dp[j-3]+c[i]);
			if(j>=4) dp[j]=min(dp[j],dp[j-4]+d[i]);
		//		cout<<i<<" "<<j<<" "<<dp[j]<<"\n";
 		}
	}
		
	cout<<dp[k]<<"\n";
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int t;cin>>t;
	while(t--){
		//TODO
		solve();
	}
}

1008 

队友做的

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int K=15,N=1<<K;
int n,k,ans;
inline int read()
{
	int x=0;bool f=1;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())f^=(ch=='-');
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
	return f?x:-x;
}
void Kafka()
{
	n=read(),k=read();
	ans=1;
	for(int i=0;i<k;++i)
	{
		int res=0;
		if(n&(1<<i)) res=12;
		else res=4;
		ans*=res;
	}
	cout<<ans<<endl;
}
signed main()
{
	for(int T=read();T--;)Kafka();
    return 0;
}

  

 

标签:杭电,int,ll,long,2024,++,第一场,y2,dp
From: https://www.cnblogs.com/liyishui2003/p/18313105

相关文章

  • NOI2024退役记
    本文仍在不断更新中不知不觉我的OI生涯就结束了,走到这一步才突然发觉。才想起来我还有好多感兴趣的内容没学,还有好多有趣的题没做,还有好多流逝的时间没有抓住。但是都已经走到这一步了,高中的OI之旅就也只能到此为止了。Day-?提前两周来到了重庆,跟着梦熊的模拟赛,又认识了一个......
  • 【2024-ZR-C Day 4】图论(1)
    1.强连通分量1.1.定义在有向图中,选取一个点集\(S\),若对于\(S\)中的任意两点\(u,v\),都满足\(u\)可以到达\(v\),则称\(S\)是强连通的。强连通分量是图中一个极大的强连通的点集。性质:把一个有向图通过强连通分量缩点后,新的图是一个DAG.1.2.Kosaraju算法在无向图......
  • C基础(学习)2024.7.19
             Linux基本命令,vi编译器的使用,简单的编程步骤,程序语言,gcc编译器编译过程,进制转换相关知识可以查看文档http://t.csdnimg.cn/CmqhC        数值表示,词法符号,变量,常量相关知识可以查看文档http://t.csdnimg.cn/jJIe2        运算符和输表达式......
  • 2024/7/20周末总结
    本周,我完美完成了PTA基础编程题目集中的函数部分。对阶乘计算的进阶方法这道上周无法通过的题目进行了学习和复现通过。对超大数的输出方式有了新的理解。同时,完成了编程题三分之一的题目,其中,由于BCD数中需要实现位运算而有些难以理解外,其他均以C++通过。关于本周Java的学习,......
  • 【北航主办丨本届SPIE独立出版丨已确认ISSN号】第三届智能机械与人机交互技术学术会议
    由北京航空航天大学指导,北京航空航天大学自动化科学与电气工程学院主办,AEIC学术交流中心承办的第三届智能机械与人机交互技术学术会议(IHCIT2024)将定于2024年7月27日于中国杭州召开。大会面向基础与前沿、学科与产业,旨在将“人工智能”、“智能系统”和“人机交互”等学......
  • 2024暑假集训测试6
    前言比赛链接。挂分挂的最多的一集。T1不知道摩尔投票,被2M内存限制卡死。T2赛时打了个很像正解的莫队,赛时出题人发现了之后现往里加hack,还一个捆绑里加一个,直接爆零了,我真的谢了,求求以后不要一个捆绑放一个hack了,给条活路吧。T3一眼看出线段树优化建图,但是不会打......
  • 2024牛客暑期多校训练营1
    A:ABitCommon题目大意:建立一个长度为n且每个数严格小于\(2^m\)的非空序列A使其存在一个非空子序列B,B中所有元素的与运算结果为1,输出合法A序列的个数。思路:存在子序列合法即该序列合法,其他元素无要求。即可以枚举合法子序列的长度,其他元素均为必定非合法整数。又因为需要结果为......
  • 小欧吃苹果-OPPO 2024届校招正式批笔试题-数据开发(C卷)
    在处理这个问题前,先看一个经典的贪心算法题目。信息学奥赛一本通(C++版)在线评测系统http://ybt.ssoier.cn:8088/problem_show.php?pid=1320注意移动纸牌的贪心策略并不是题目中给出的移动次序:第1堆纸牌9<10,因为是最左侧,它只能从第2堆移动过来一张,这个动作是必须做的(没有别的......
  • [lnsyoj110/luoguP2024]食物链
    题意原题链接三类元素\(a,b,c\)满足\(a\tob\),\(b\toc\),\(c\toa\)。现在共有\(n\)个元素,给出\(m\)条关系\(x\toy\)或\(x\)与\(y\)种类相同,输出非法或与前面所属关系相矛盾的关系数量sol并查集可以处理“朋友的朋友是朋友”这样的传递关系,却不能处理“敌人......
  • 大一升大二暑假 NJU暑期课程 Linux系统基础(1) 20240720
    一.操作系统操作系统OperatingSystem简称OS,是软件的一部分,它是硬件基础上的第一层软件,是硬件和其它软件沟通的桥梁。操作系统会控制其他程序运行,管理系统资源,提供最基本的计算功能,如管理及配置内存、决定系统资源供需的优先次序等,同时还提供一些基本的服务程序。Q1:什么是文件......