Day5

· 2026-7-14 21:24:36

t1:把每堆蚯蚓的数量累加,得到每堆的结束编号,这样所有堆就形成了连续的编号区间。对于每个查询编号,只需要在结束编号数组中二分查找第一个大于等于它的位置,该位置就是所在的堆号。t2:先将数组a从小到大排序,这样所有不超过某个值的元素都集中在数组前部。对于每个询问bj,在排序后的a中二分查找第一个大于bj的位置,该位置的下标就是小于等于bj的元素个数。排序加二分,每次查询只需log级别时间,能高效处理大量询问。t3:将每天融雪量做前缀和,用优先队列存放每堆雪消失的临界累计融化量。每天更新总累计量后,检查堆顶是否达到临界值,达到则弹出并计算该堆当天实际融化量;否则说明所有雪堆都能融化Ti,直接累加Ti乘以堆数。每堆雪只被处理一次,效率高。t4:先检查行差和列差是否都是k的倍数。由于左右移动时不改变行,所以从起点列到终点列之间所有列在起点行高度必须畅通。只需查询这段区间内每列封锁高度的最大值,若最大值小于起点行则可行,否则不行。用线段树维护区间最大值,快速回答每次询问。t5:思路:将相邻数的差取绝对值得到差值数组。一段子数组存在公共模数,等价于这些差值的最大公约数大于1。用ST表预处理区间gcd,枚举左端点,二分查找最远的右端点使区间gcd>1。记录差值段的最大长度,答案加1。注意原数组长度为1时答案为1。t6:一个好集合等价于存在某个点被集合中所有区间覆盖,因此问题转化为:删去最少的区间,使剩余区间有公共交集。扫描所有区间的端点,统计每个坐标被多少个区间覆盖,覆盖数的最大值就是最多能保留的区间数,答案即为n减去这个最大值。核心在于用差分或扫描线快速统计每个点的覆盖区间数量,取最大值即可。

t1:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100001],q[100001];
int erfen(int x){
	int l=1;
	int r=n;
	while(l<r){
		int mid=(l+r)/2;
		if(a[mid]>=x){
			r=mid;
		}
		else l=mid+1;
	}
	return l;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>a[i];
		a[i]+=a[i-1];
	}
	sort(a+1,a+1+n);
	cin>>m;
	for(int i=1;i<=m;++i){
		int q;
		cin>>q;
		cout<<erfen(q)<<endl;
	}
	return 0;
}
t2:
#include<bits/stdc++.h>
using namespace std;
const int N=200005;
int n,m,a[N],b[N],ans[N];
int erfen(int x) {
    int l=1,r=n,res=0;
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]<=x){
            res=mid;
            l=mid+1;
        }else{
            r=mid-1;
        }
    }
    return res;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	cin>>a[i];
	}
    for(int i=1;i<=m;i++){
    	cin>>b[i];
	}
    sort(a+1,a+n+1);
    for(int i=1;i<=m;i++){
    	ans[i]=erfen(b[i]);
	}
    for(int i=1;i<=m;i++){
    	cout<<ans[i]<<" ";
	}
    return 0;
}
t3:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,t[N],v[N];
priority_queue<ll,vector<ll>,greater<ll> > q;
ll last;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>t[i];
	}
	for(int i=1;i<=n;i++){
		cin>>v[i];
	}
	for(int i=1;i<=n;i++){
		q.push(t[i]+last);
		last+=v[i];
		ll tlast=0;
		while(!q.empty()&&q.top()<=last){
			ll m=q.top()-last+v[i];
			tlast+=m;
			q.pop();
		}
		tlast+=q.size()*v[i];
		cout<<tlast<<" ";
	}
	return 0;
}
t4:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll a[N][30];
ll query(ll l,ll r){
    ll len=r-l+1;
    ll k=log2(len);
    return max(a[l][k],a[r-(1<<k)+1][k]);
}
void solve(){
    ll n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++) cin>>a[i][0];
    for(int j=1;j<=27;j++)
        for(int i=1;i+(1<<j)-1<=m;i++)
            a[i][j]=max(a[i][j-1],a[i+(1<<(j-1))][j-1]);
    int q;
    cin>>q;
    while(q--){
        ll x1,y1,x2,y2,k;
        cin>>x1>>y1>>x2>>y2>>k;
        ll dx=abs(x1-x2);
        ll dy=abs(y1-y2);
        if(dx%k!=0||dy%k!=0){
            cout<<"NO\n";
            continue;
        }
        ll dis=n-x1;
        ll top=(dis/k)*k+x1;
        ll L=min(y1,y2);
        ll R=max(y1,y2);
        ll maxBlock=query(L,R);
        if(maxBlock<top) cout<<"YES\n";
        else cout<<"NO\n";
    }
}
int main(){
    int T=1;
    while(T--) solve();
    return 0;
}
t5:
#include<bits/stdc++.h>
using namespace std;
int t,n,ans;
long long a[200010],sub[200010],st[200010][20];
long long gcd(long long x,long long y){
    if(!y) return x;
    return gcd(y,x%y);
}
long long query(int i,int j){
    int k=log2(j-i+1);
    return gcd(st[i][k],st[j-(1<<k)+1][k]);
}
int main(){
    cin>>t;
    while(t--){
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        if(n==1){
            cout<<"1\n";
            continue;
        }
        for(int i=1;i<n;i++){
            sub[i]=a[i]-a[i+1];
            if(sub[i]<0) sub[i]=-sub[i];
        }
        n--;
        for(int i=1;i<=n;i++)
            st[i][0]=sub[i];
        for(int j=1;(1<<j)<=n;j++)
            for(int i=1;i+(1<<j)-1<=n;i++)
                st[i][j]=gcd(st[i][j-1],st[i+(1<<(j-1))][j-1]);
        ans=0;
        for(int i=1,l,r;i<=n;i++){
            l=i,r=n;
            while(l<r){
                int mid=(l+r+1)>>1;
                if(query(i,mid)==1) r=mid-1;
                else l=mid;
            }
            if(sub[i]!=1) ans=max(ans,l-i+1);
        }
        cout<<ans+1<<'\n';
    }
    return 0;
}
t6:
#include<bits/stdc++.h>
using namespace std;
int T;
struct node{
	int x,y;
}a[1000010];
vector<int> l,r;
int main(){
	cin>>T;
	while(T--){
		int n;
		scanf("%d",&n);
		l.clear();
		r.clear();
		for(int i=1;i<=n;i++){
			scanf("%d%d",&a[i].x,&a[i].y);
			l.push_back(a[i].x);
			r.push_back(a[i].y);
		}
		sort(l.begin(),l.end());
		sort(r.begin(),r.end());
		int ans=1e9;
		for(int i=1;i<=n;i++){
			int res=0;
			int dl=upper_bound(l.begin(),l.end(),a[i].y)-l.begin();//找第一个>目标值的位置
			res+=(n-dl+1);
			int dr=lower_bound(r.begin(),r.end(),a[i].x)-r.begin();//找第一个>=目标值的位置
			res+=(dr-1);
			ans=min(ans,res);
		}
		cout<<ans<<endl;
	} 
	return 0;
} 

 

3 次查看 举报

0 条评论

目前还没有评论...

Be the first to comment!

返回讨论列表
StArWaLk
159
通过题目
4
发帖数