最近做题遇到的坑 cf865d,cf838e,cf317d,cf1394b,poj3322,cf223c,hdu2435,cf47d

本文探讨了五道编程问题,涉及贪心算法、动态规划、哈希技巧、最大流和博弈策略。从优先队列操作到最大路径长度计算,再到博弈取数与网络流优化,展示了信息技术解决实际问题的实例和高效算法应用。

https://vjudge.net/problem/CodeForces-865D

n<=3e5n<=3e5n<=3e5,a[i]<=1e6a[i]<=1e6a[i]<=1e6,每天可以花a[i]a[i]a[i]买一个单位,或卖一个单位赚a[i]a[i]a[i],最后不留下单位,求最大赚的值

(最后不留下单位 这条件是没用的)
(每天计为卖了以后还可以买一次,相当于没有卖)
(不买不卖相当于当天买当天卖)
(可看作每天都买或卖)
(买了还可以卖1次(退回),又一次(卖自己))
所以每个a[i]a[i]a[i]可以用两次
再贪心每次卖当前最大的

int main() {
	priority_queue<int> Q;
	long long ans=0;
	int n=rd(),x;
	while(n--) {
		x=rd();
		Q.push(-x),Q.push(-x);
		ans+=x+Q.top();
		Q.pop();
	}
	cout<<ans;
}

https://vjudge.net/problem/CodeForces-838E

2500个点的凸多边形,求最多经过每个点一次的不自交的折线 的最长长度

(先想,dp的时候每个状态表示围成一个圈的最长长度,然后输出的时候减掉一条边) (错的
(又想,图形一定是简单的 折到1 -> 折到n -> 折到 2 -> 折到n-1 ->… 然后打了一下,) (wa on test 3
(面向数据编程,发现可以有 k -> n-k+1 -> k+1 -> k+2 -> n-(k+1)+1 …这种情况
打打打~过了test3,wa on test 4
???
贺题,发现不一定要走完n个点
2500个点的凸多边形,求最多经过每个点一次的不自交的折线 的最长长度
(中间还被环形结构坑过,不管了


int main()
{
	n=read();
	for(int i=1; i<=n; ++i) x[i]=read(),y[i]=read();
	for(int i=1; i<n; ++i)
		for(int j=i+1; j<=n; ++j)
			dis[j][i]=dis[i][j]=Calc(x[i],x[j],y[i],y[j]);
	double ans=0;
	for(int len=1; len<n; ++len)
		for(int i=1,j; i<=n; ++i)
		{
			j=Turn(i+len);
			f[i][j][0] = std::max(f[Turn(i+1)][j][0]+dis[i][Turn(i+1)], f[Turn(i+1)][j][1]+dis[i][j]);
			f[i][j][1] = std::max(f[i][Turn(j-1)][0]+dis[i][j], f[i][Turn(j-1)][1]+dis[j][Turn(j-1)]);
			ans=std::max(ans,std::max(f[i][j][0],f[i][j][1]));//不一定走n个点...吗?
		}
	printf("%.10lf\n",ans);
	return 0;
}

https://vjudge.net/problem/CodeForces-317D

博弈取1~n的数(n<=1e9n<=1e9n<=1e9) 每次取一个未取的数 xxx 及所有 xnx^nxn。求赢家

显然是sg函数, 找规律竟然找了半天
可以分割成若干个独立的问题,每个是对{xn∣n>=1}\{x^n|n>=1\}{xnn>=1} (其中xxx不是其他数的整数次幂)博弈
最大的独立问题是{2n}\{2^n\}{2n}230>1e92^{30}>1e9230>1e9,所以只有1<<29个状态,状压暴枚打表即可

#include<bits/stdc++.h>
using namespace std;
int mex[]={0,1,2,1,4,3,2,1,5,6,2,1,8,7,5,9,8,7,3,4,7,4,2,1,10,9,3,6,11,12};
set<int> vi;
int main() {
	int n,sm=0;
	cin>>n;
	int lf=n;
	for(int i=2;i*i<=n;++i) {
		if(vi.find(i)==vi.end()) {
			int c=0;
			for(long long j=i;j<=n;j*=i) ++c,--lf,vi.insert(j);
			sm^=mex[c];
		}
	}
	sm^=(lf&1);
	puts(sm?"Vasya":"Petya");
}

https://vjudge.net/problem/CodeForces-1394B

2e52e52e5个点的有向图,每个点出度不超过K,K≤9K \le 9K9,边权不会重复。求K元组(c1,c2,...cK)(c_1,c_2,...c_K)(c1,c2,...cK)的个数,使图中出度为K的点只保留第cKc_KcK大的边,且每个点能走这些边回到自己

(先写了个暴力dfs,边跑边暴枚K元组,若生成的子图满足“回到自己”的性质则++ans 过了前面的水数据,然后被卡死了
(然后尝试bitset,打不出来,贺
(在每个点出度为1的情况下全部回到自己,即每个点入度也恰好为1)
哈希即可(即可替换bitset的功能
暴枚n+2Kn+2^Kn+2K 即可

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=2e5+5,SE=48271;
int n,m,K,ans;
vector<PII> e[N];
long long ha[N],ed;
long long w[10][10];
void dfs(int u,long long sm) {
	if(u==K+1) {
		if(sm==ed) ++ans;// cerr << "++++ans\n" ;
		return;
	}
//cerr << "dfs " << u << endl;
	for(int i=1;i<=u;++i)  dfs(u+1,sm+w[u][i]);
//cerr << "end\n" ;
}

int main() {
	cin>>n>>m>>K;
	ha[0]=1;
	for(int i=1;i<=n;++i) ed+=ha[i]=ha[i-1]*SE;
	int x,y,z;
	while(m--) {
		cin>>x>>y>>z;
		e[x].push_back((PII){z,y});
	}
	for(int i=1;i<=n;++i) {
		sort(e[i].begin(),e[i].end());
		for(int j=0;j<e[i].size();++j) {
			w[e[i].size()][j+1]+=ha[e[i][j].second];
//cerr << "::: " << "e[" << e[i].size() << "][" << j+1 << "]+= ha[" << e[i][j].second<< endl;
		}
	}
//	for(int i=1;i<=K;++i, cerr << endl)
//		for(int j=1;j<=i;++j) cerr << w[i][j] << ' ';
	dfs(1,0);
	cout<<ans;
}

https://vjudge.net/problem/POJ-3322

P(wo)O(de)J(li)的(jie)题(li)都比较坑(cai),这题我就没发现’#'不是不提供支撑而是根本不能放,,
然后就比较水

https://vjudge.net/problem/CodeForces-223C

n≤2000,K≤1e9n\le 2000, K\le1e9n2000,K1e9,序列K次前缀和,然后输出

也是水题,但是我发现我不会求(n−1+kk)\binom{n-1+k}{k}(kn1+k)
(阶乘有没有什么快速求法吗 好像excrt里有,不过那里的模数比较小 模1e9+7有什么阶乘的快速求法吗(((
贺!(!)
尝试展开,发现是(n−1+k)..(1+k)(n−1)!\frac{(n-1+k)..(1+k)}{(n-1)!}(n1)!(n1+k)..(1+k)
是水题。

https://vjudge.net/problem/HDU-2435

题意是求 max{把2~n-1中任意一对点打通之后的最大流}

(最大流?既然最近没有打过,就贺好了
发现n2n^2n2暴枚打通的点即可,因为残量网络上流很少跑的很快

https://vjudge.net/problem/CodeForces-47D

不想写题意

前两天做的时候还会的,今天看看竟然不会了
N≤35,M≤10N\le 35,M\le 10N35,M10,裸的双向dfs,复杂度O(2N2×M)O(2^{\frac N 2}\times M)O(22N×M)
(网上的题解好像单向dfs也过了?

#include<bits/stdc++.h>
using namespace std;
int n,m,bl,di[11];
long long ans;
char s[11][44];
map<vector<int>,int> mp;
void dfs(int u,int op) {
	if(u==(op==-1 ? n : bl)) {
		vector<int> v;
		for(int i=1;i<=m;++i) v.push_back(di[i]);
		op==-1 ? ans+=mp[v] : ++mp[v];
		return;
	}
	for(int p=0;p<=1;++p) {
		int fl=1;
		for(int i=1;i<=m;++i)
			if((di[i]-=op*(p^s[i][u]-'0'))<0) fl=0;
		if(fl) dfs(u+1,op);
		for(int i=1;i<=m;++i)
			di[i]+=op*(p^s[i][u]-'0');
	}
}
int main() {
	scanf("%d%d",&n,&m); bl=n/2;
	for(int i=1;i<=m;++i) scanf("%s%d",s[i],di+i);
	dfs(0,1);
	for(int i=1;i<=m;++i) di[i]=0;
	dfs(bl,-1);
	printf("%lld\n",ans);
}
内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度和16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值