首页 > 其他分享 >暑假第一周周报

暑假第一周周报

时间:2024-07-14 21:51:57浏览次数:8  
标签:return 第一周 int mid long 暑假 ans check 周报

主要学习了二分算法:
写了一些经典的二分算法;
还写了一些和其他算法结合的二分:
递归分治,
题目:给一个数组{a},定义 h(a,b)为在十进制下 a + b 与 a 的位数差,求和所有的 h(ai,aj),0<i<j<n;
不能暴力n方,用分治的思想,分解成最小的子问题求两个数的位数差,再层层往上归并,将后半段排序后,枚举前半段每一个数字,对后半段二分查找,可以优化为nlogn的;

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[100010];
int b[10] = { 1,10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };
int check(int l,int r){
    if(l+1 == r)return 0;
    int mid = (l+r)/2;
    int ans = check(l,mid) + check(mid,r);
    sort(a+mid,a+r);
    for(int i = l;i < mid; ++i){
        for(int j = 1;j <= 9; ++j){
            if( b[j] - a[i] > 0 ){
                ans += r - (lower_bound(a+mid,a+r,b[j]-a[i])-a);
            }
        }
    }
    return ans;
}
signed main()
{
    int n;
    cin >> n;
    for(int i = 1;i <= n; ++i){
        cin >> a[i];
    }
    cout << check(1,n+1) << endl;
    return 0;
}
二分与前缀和: 题目[链接:https://ac.nowcoder.com/acm/contest/86187/J]()

暴力是n3方的二分答案优化为n方logn。check函数是一个n方的求和,用前缀和优化为2*n;

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,s;
int w[200010],v[200010];
int l[200010],r[200010];
int a[200010];
int b[200010];
int L = 0,R;
int Y;
int ans = 1e15,sum;
int check(int x){
	for(int i = 1;i <= n; ++i){
		if( w[i] >= x ){
			a[i] = a[i-1] + 1;
			b[i] = b[i-1] + v[i];
		}
		else a[i] = a[i-1],b[i] = b[i-1];
	}
	Y = 0;
	for(int i = 1;i <= m; ++i){
		Y += ( a[r[i]] - a[l[i]-1] ) * ( b[r[i]] - b[l[i]-1] );
	}
	sum = llabs(Y-s);
	if( Y > s )return 1;
	else return 0;
}
signed main()
{
	cin >> n >> m >> s;
	for(int i = 1;i <= n; ++i){
		cin >> w[i] >> v[i];
		R = max(R,w[i]);
	}
	R+=2;
	for(int i = 1;i <= m; ++i){
		cin >> l[i] >> r[i];
	}
	while( L<=R ){
		int mid = (L+R)/2;
		if( check(mid) ){
			L = mid+1;
		}
		else R = mid-1;
		ans = min(ans,sum);
	}
	cout << ans << endl;
	return 0;
}
二分与前缀和、差分 题目[H]() 区间减法,
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[1000010];//原数组
int b[1000010];//前缀和数组,用来将差分数组还原成原数组
int c[1000010];//差分数组
int d[1000010],l[1000010],r[1000010];
int n,m;
int check(int x){
	memset(c,0,sizeof(c));
	for(int i = 1;i <= x; ++i){
		c[l[i]] += d[i];
		c[r[i]+1] -= d[i];
	}
	for(int i = 1;i <= n; ++i){
		b[i] = b[i-1] + c[i];
		if( b[i] > a[i] ){
			return 0;
		}
	}
	return 1;
}
signed main()
{
	cin >> n >> m;
	for(int i = 1;i <= n; ++i)cin >> a[i];
	for(int i = 1;i <= m; ++i){
		cin >> d[i] >> l[i] >> r[i];
	}
	int l = 1,r = m;
	if( check(r) ){
		cout << 0 << endl ;
		return 0;
	}
	while( l < r ){
		int mid = (l+r)/2;
		if( check(mid) ){
			l = mid+1;
		}
		else r = mid;
	}
	cout << -1 << endl << r << endl ;
	return 0;
}
二分与尺取法(双指针); 题目:[I]() 题意:给你数列A,对于A的每一个区间,求第K大,插入到数列B中,最后再求数列B的第M大。 二分答案,用双指针找到所有满足答案的区间。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[100010];
int n,k,m;
int check(int x){
    int ans = 0;
    int num = 0;
    int j = 1;
    for(int i = 1;i <= n; ++i){
        if( a[i] >= x ) num++;
        if( num == k ){
            ans += n-i+1;
            while( a[j] < x ){
                ans += n-i+1;
                j++;
            }
            num--;
            j++;
        }
    }
    if( ans >= m )return 1;
    else return 0;
}
signed main()
{
    int T;
    cin >> T;
    while(T--){
        cin >> n >> k >> m;
        for(int i = 1;i <= n; ++i){
            cin >> a[i];
        }
        int l = 1,r = 1e9+10;
        while( l < r ){
            int mid = (l+r)/2;
            if( check(mid) ){
                l = mid+1;
            }
            else r= mid;
        }
        cout << l-1 << endl ;
    }
    return 0;
}
写了一些基础的堆、栈、队列,双端队列,优先队列。

标签:return,第一周,int,mid,long,暑假,ans,check,周报
From: https://www.cnblogs.com/yumz-blog/p/18302043

相关文章

  • SMU 2024 ptlks的周报Week 8(7.8-7.14)
    这周主要学习了线段树,基本能用线段树解决一些简单的题目。D-FlatSubsequence题意:单点修改+区间查询代码#include<bits/stdc++.h>#defineintlonglong#definemod998244353#definePIIpair<int,int>#definePIIIpair<int,PII>#definedoublelongdouble#define......
  • 2024 暑假友谊赛 1 (7.13)zhaosang
    A-Ahttps://vjudge.net/contest/638765#problem/A一开始贪心做不出来,后面发现是dp找到转移方程即可,01dp问题代码如下#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;llv[10000010];lln;llans;llprefix[10000010];intmain(){ intN; cin>>......
  • SMU Summer 2024 第一周周报 (zhaosang)
    学到了很多,不仅仅是学习方面的,在学校学跟在家寒假对比,天差地别吧。补题的过程中收获满满,最近练习二分三分,栈队列单调栈等习题,题目不简单,努力学习中。。打比赛也是,也有打的很惨的时候,我自己需要多总结找出原因,把短板补齐。总的来说,这个星期很累,但很爽!星期一:https://www.cnblogs......
  • 2024 暑假友谊赛-热身2 (7.12)zhaosang
    E-Ehttps://vjudge.net/problem/AtCoder-diverta2019_b给你a,b,c,n就是问你有多少(ia+jb+k*c)等于n的答案i,j,k任意几个都可以为零两种思想,数据量比较小,那么可以三重循环+减枝,或者枚举两个变量算出第三个代码如下:第一种三重循环#include<bits/stdc++.h>usingnamespa......
  • hadoop第一周总结
    在Hadoop学习的第一个周,我经历了一段充实而又具有挑战性的学习过程。在这个过程中,我深入了解了Hadoop的基本概念、核心组件和工作原理。以下是我对本周学习的总结:首先,我开始了解Hadoop的概念和背景。Hadoop是一个开源的分布式存储和计算框架,旨在处理大规模数据集,并且具有高可靠性......
  • 周报
    周报学习了线段树及其懒标记的使用,线段树二分,线段树优化dp等一些进阶用法,完成了线段树题单半数以上题目。这周总共打了六场比赛,每场题目几乎全部补完,只有个别较难知识点的题未来得及补,待学习知识:博弈sg函数、莫队、势能/李超线段树。需加强知识点:dp。以及一些思维上的突破。补......
  • 暑假第一周周报
    这周除了个人赛外,还进行了线段树、数状数组的练习。刚开始训练的时候,对线段数和数状数组是缺乏理解,感觉非常非常难,但随着做了越来越多的题。感觉现在是掌握了其中一部分。刚开始学线段树,其中的懒标记感觉不是太会,于是就网上找了一些资料,把那个懒标记的相关知识点给学了一下。个人......
  • 暑期训练第一周周报
    总体学习情况这周的强度还是很大的,二分和简单数据结构的牛客题单还没有刷完,想着把补题放到第一位,然后后面慢慢补上那些没有做的题,比赛打得还是依旧很拉,不过没有关系,太阳照常升起,总会赢的。知识点模块1.Floyd算法用来求两点到达的最小代价,复杂度是O(n3)其实代码并不难记,可以说板......
  • 2024 暑假友谊赛-热身2
    CodeForces1265E思路:期望dp,f[i]表示走到i的期望天数,有f[i]=p[i]/100*(f[i-1]+1)+(100-p[i])/100*(f[i-1]+1+f[i]),得到f[i]=100/p[i]*(f[i-1]+1)#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definePIIpair<int,......
  • 2024 暑假友谊赛 1
    AtCoderabc204_d一开始想着贪心,试了下wa掉了,然后看着过的人挺多的还是觉得是贪心......