• cf 1179 C


    目录

    A

    模拟出A不是最大值的情况,存起来。
    最多有n个。当A为最大值的时候,后面n-1个数开始循环。
    查询分两种情况讨论就行了

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int _=2e5+7;
    ll read() {
    	ll x=0,f=1;char s=getchar();
    	for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
    	for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
    	return x*f;
    }
    int n,m,gs;
    pair<int,int> ans[_];
    vector<int> a;
    deque<int> q;
    int main() {
    	n=read(),m=read();
    	int ma=0;
    	for(int i=1,x;i<=n;++i) {
    		x=read();
    		q.push_back(x);
    		ma=max(ma,x);
    	}
    	for(int i=1;i<=n;++i) {
    		int A=q.front();q.pop_front();
    		int B=q.front();q.pop_front();
    		ans[++gs]=make_pair(A,B);
    		//cout<<ans[gs].first<<" "<<ans[gs].second<<"<
    ";
    		q.push_front(max(A,B));
    		q.push_back(min(A,B));
    		if(q.front()==ma) break;
    	}
    	q.pop_front();
    	while(!q.empty()) a.push_back(q.front()),q.pop_front();
    	//for(auto v:a) cout<<v<<"< ";cout<<"
    ";
    	while(m --> 0) {
    		ll Query=read();
    		if(Query<=(ll)gs) printf("%d %d
    ",ans[Query].first,ans[Query].second);
    		else printf("%d %d
    ",ma,a[(Query-gs-1)%a.size()]);
    	}
    	return 0;
    }
    
    

    B

    构造。
    一行的很容易构造,(1,m,2,m-2,3…………)
    两行也很容易,(1,1),(2,m),(1,2),(2,m-1)…………。
    扩展的也很容易就是差不多一行的二维形式。
    代码

    #include <bits/stdc++.h>
    using namespace std;
    int n,m;
    int main() {
    	scanf("%d%d",&m,&n);
    	int p=1,q=m;
    	pair<int,int> a=make_pair(1,1);
    	while(p<=q) {
    		int js=1,len=(p==q?n:2*n);
    		for(int i=1;i<=len;++i) {
    			printf("%d %d
    ",a.first,a.second);
    			if(i!=len) a=make_pair(a.first==p?q:p,i&1?n-a.second+1:++js);
    		}
    		p++;q--;
    		a=(a.first>m/2)?make_pair(p,1):make_pair(q,1);
    	}
    	return 0;
    }
    

    C

    转化一下,首先我们先排序a,没有影响。c为i选的菜的价格
    那考虑一下b,i<j,c[i]<c[j],那么我们交换一下c[i],c[j]对最后我们拿到的菜没有影响。c[i]>c[j]就不管咯,最后b也是有序的了。
    判断时候排序a,b,一对对的比较,第一个买不起的就是ans。可以想这份菜不一定他能买到,但最后一个“我”的一定买不到。但找到的第一份买不到的菜是一定剩下的,前面卖的更得起贵的菜(也买得到),后面买不起这份菜.a[i]至少要有i个人大于等于他。
    用权值线段树求出权值最大的(能买得起的人数-rk<0)的值。

    //第一个能买得起的人数-rk< 0的值 
    #include <bits/stdc++.h>
    #define ls rt<<1
    #define rs rt<<1|1
    using namespace std;
    const int _=1e6+7,N=1e6,INF=0x3f3f3f3f;
    int n,m,q,a[_],b[_],tong[_];
    struct node {
    	int l,r,mi,lazy;
    }t[_<<2];
    void pushup(int rt) {
    	t[rt].mi=min(t[ls].mi,t[rs].mi);
    }
    void pushdown(int rt) {
    	if(t[rt].lazy) {
    		t[ls].lazy+=t[rt].lazy,t[ls].mi+=t[rt].lazy;
    		t[rs].lazy+=t[rt].lazy,t[rs].mi+=t[rt].lazy;
    		t[rt].lazy=0;	
    	}
    }
    void build(int l,int r,int rt) {
    	t[rt].l=l,t[rt].r=r,t[rt].mi=INF;
    	if(l==r) return;
    	int mid=(l+r)>>1;
    	build(l,mid,ls);
    	build(mid+1,r,rs);
    }
    void modify(int rt,int L,int R,int ad) {
    	if(L>R) return;
    	if(L<=t[rt].l&&t[rt].r<=R) {
    		t[rt].lazy+=ad,t[rt].mi+=ad;
    		return;
    	}
    	pushdown(rt);
    	int mid=(t[rt].l+t[rt].r)>>1;
    	if(L<=mid) modify(ls,L,R,ad);
    	if(R>mid) modify(rs,L,R,ad);
    	pushup(rt);
    }
    int query(int rt){
    	if(t[rt].l==t[rt].r) return t[rt].l;
    	pushdown(rt);
    	if(t[rs].mi<0) return query(rs);
    	else return query(ls);
    }
    int main() {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    	for(int i=1;i<=m;++i) scanf("%d",&b[i]);
    	build(1,N,1);
    	for(int i=1;i<=n;++i) {
    		if(!tong[a[i]]) modify(1,a[i],a[i],-INF);
    		tong[a[i]]++;
    		modify(1,1,a[i],-1);
    	}
    	for(int i=1;i<=m;++i) modify(1,1,b[i],1);
    	scanf("%d",&q);
    	while(q --> 0) {
    		int opt,id,val;
    		scanf("%d%d%d",&opt,&id,&val);
    		if(opt==1) {
    			tong[a[id]]--;
    			if(!tong[a[id]]) modify(1,a[id],a[id],INF);
    			modify(1,1,a[id],1);
    			a[id]=val;
    			modify(1,1,a[id],-1);
    			if(!tong[a[id]]) modify(1,a[id],a[id],-INF);
    			tong[a[id]]++;
    		} else { 	
    			modify(1,1,b[id],-1);
    			b[id]=val;
    			modify(1,1,b[id],1);
    		}
    		if(t[1].mi>=0) puts("-1");
    		else printf("%d
    ",query(1));
    	}
    	return 0;
    }
    
  • 相关阅读:
    opengl打开本地bmp图片绘制
    jsp连接mysql数据库
    opengl雾开启
    opengl多重采样
    抗锯齿说
    opengl混合效果
    android实现视频图片取缩略图
    opengl Test
    动态规划算法(@背包问题)
    百钱买百鸡的问题(递归解法)
  • 原文地址:https://www.cnblogs.com/dsrdsr/p/11241164.html
Copyright © 2020-2023  润新知