这场测验其实我感觉出的几个题都还是我印象比较深的几个题。但是感觉作的效果还不是很好,D题确实有些细节没注意到,卡了很长时间,E题原来是我理解的有错,看来以后补题还是要踏踏实实的再做一遍,不能太自大,只有自己能很轻松的完整写出来了,才能算是掌握了,不这样做训练效果其实也不好。
E .cf1260 D
这个写法我还是不理解先记下来
#include
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
const int N=2e5+5;
int cmp(int a,int b){
return a>b;
}
int m,n,k,t;
int a[N],vis[N],s[N];
struct node{
int u,v,p;
}b[N];
int check(int x){
int cnt=0;
for(int i=0;ix){
vis[b[i].u]++;
vis[b[i].v+1]--;
}
}
for(int i=1;i<=n+1;i++){
vis[i]+=vis[i-1];
}
for(int i=0;i<=n+1;i++){
if(vis[i]){
cnt++;
vis[i]=0;
}
}
if(cnt*2+n+1<=t)
return 1;
else
return 0;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>m>>n>>k>>t;
for(int i=1;i<=m;i++)
cin>>a[i];
sort(a+1,a+1+m,cmp);
for(int i=0;i>b[i].u>>b[i].v>>b[i].p;
}
int l=1,r=m;
while(r>=l){
int mid=(l+r)/2;
if(check(a[mid])){
l=mid+1;
}else{
r=mid-1;
}
}
for(int i=r;i>=l-1;i--){
if(check(a[i])){
cout<
#include
using namespace std;
struct node
{
int s;
int e;
int id;
}a[200005];
int cmp(node p,node q)
{
return p.s ans;
set > st;
int main()
{
int n,k;
scanf("%d%d",&n,&k);
int maxn,minn;
pairtmp;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].s,&a[i].e);
maxn=max(maxn,a[i].e);
minn=min(minn,a[i].s);
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
int pos=1;
for(int i=minn;i<=maxn;i++)
{
while(pos<=n&&a[pos].s<=i)
{
st.insert(make_pair(a[pos].e,a[pos].id));
pos++;
}
while(st.size()&& st.begin()->firstk)
{
tmp=*(--st.end());
ans.push_back(tmp.second);
st.erase(tmp);
}
}
sort(ans.begin(),ans.end());
printf("%d\n",ans.size());
for(auto v:ans)
{
printf("%d ",v);
}
printf("\n");
}
1.贪心算法~;
2.对于任意一个正整数n
,它有两种可能:case1:
3a ≤ n ≤ (3a+1-1)/2 和 case2:
(3a+1-1)/2 < n < 3a+1(其中a为对应常数);
3. (3a+1-1)/2是如何求的呢,是30+31+…+3a,如果处在case2
中的数,那大于等于它的good number肯定就是3a+1啦;
4. 处在case1
中的数,那大于等于它的good number肯定有3a这个因子,我们只需将a保存下来,然后去递归求大于等于n-3a的good number就好啦;
5. 为了保证运行效率,我们可以提前将30 ~ 339的结果保存起来,也将(31-1)/2 ~ (339-1)/2的结果保存起来;
#include
using namespace std;
typedef long long ll;
ll power_3[40];
ll cil[40];
vector v;
void dfs(ll n){
if(n<=0) return;
int pos;
for(pos=0;pos<=39&&n>=power_3[pos+1];pos++);
if(n>cil[pos]) v.push_back(pos+1);
else{
v.push_back(pos);
dfs(n-power_3[pos]);
}
}
int main(){
int q;
cin>>q;
ll power=1;
for(int i=0;i<=39;i++,power*=3) power_3[i]=power;
for(int i=0;i<=38;i++) cil[i]=(power_3[i+1]-1)>>1;
for(int i=0;i>n;
v.clear();
dfs(n);
ll ans=0;
for(auto e:v) ans+=power_3[e];
cout<
cf1251 E1
#include
#include
#include
#include
#include
#include
#include
#include
const int maxN = 2e5 + 7;
int N;
vector vt[maxn];
using namespace std;
int main()
{
int T,m,p;
cin>>T;
while(T--)
{
scanf("%d", &N);
for(int i=0; i<=N; i++) vt[i].clear();
for(int i=1; i<=N; i++) { scanf("%d%d", &m, &p); vt[m].push_back(p); }
priority_queue, greater> Q;
ll ans = 0;
for(int i=N; i>=0; i--)
{
int len = (int)vt[i].size();
for(int j=0; j N - i) { ans += Q.top(); Q.pop(); }
}
printf("%lld\n", ans);
}
return 0;
}