USACO 选做
思路点拨
再开始的局面显然是一个三角形
-
新增节点
,满足 在三角形 的内部。 -
新增节点
,满足 在三角形 的内部。
不然就容易画图证明画不出三个线条。并且我们的局面每时每刻会保持一个三角形的状态。
考虑动态规划,设
-
选择的节点在三角形
的内部 -
枚举一个新的节点
并且判断是否合法,可以转移。
相信容易写出转移式。现在还有一个细节,就是怎么判断一个节点
时间复杂度分析发现对于每一个状态,我们枚举一个三角形外的节点
思路点拨
考虑容斥,问题转换为了求包含 unordered_map
里面看出现次数即可。时间复杂度
代码比较短所以贴一个:
#include<bits/stdc++.h>
#define int unsigned long long
#define ll long long
using namespace std;
const int MAXN=5e4+5,base=1e6+5;
int n,a[MAXN][5];
long long ans;
unordered_map<int,int> cnt;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=0;j<5;j++) cin>>a[i][j];
sort(a[i],a[i]+5);
for(int j=0;j<(1<<5);j++){
int popcount=0,hsh=0;
for(int k=0;k<5;k++)
if(j&(1<<k)){
popcount++;
hsh=hsh*base+a[i][k];
}
cnt[hsh]++;
if(popcount&1) ans=ans-cnt[hsh];
else ans=ans+cnt[hsh];
}
}
cout<<ans;
return 0;
}
思路点拨
先想一下对于一个长度为
怎么样构造方案才可以让距离之和最小。考虑对于一个序对
现在我们对全部的区间这个权值计数。但是存在一个问题,按照我们常规的枚举方法,固定一个左端点,右端点从小到大这样枚举会改变H牛的配对方式。所以我们考虑枚举区间最中间的一头牛或者两头牛,这样时间复杂度没有改变并且对于同一个中点奶牛的配对方式是固定的。我们将这个值放入树状数组中优化计算即可。时间复杂度
思路点拨
考虑每一时刻我们可以到达的区间是连续的,我们最初的想法就是求出区间的左端点扩展到
考虑令
现在时间复杂度可以做到
思路点拨
这题有很多同学使用了
考虑按照
现在就好放进线段树里了。
问题是使用了跳板之后假设到了
时间复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】