• [HNOI2017] 大佬


    这真的是一道综合题。然而感觉A得莫名其妙,交上去的时候其实非常虚,然后就莫名其妙地AC了?


    首先我们考虑到,所有和怼有关的操作都是时刻无关的。也就是说,我们把这些操作拆散放到任何时候都对结果不会有影响。因此我们考虑把这些操作剥离出来。换言之,我们可以把所有2操作剥离出来。

    为什么剥离2号操作呢?因为只要二号操作和自己的生命有关(你不妨理解为xu`ming)。也只有这一种操作时与时刻有关的。什么叫做与时刻有关呢?就是说,这批操作,放在1-3时间点执行是可以的,而放在8-10时间点执行可能就会GameOver。

    考虑到其余操作的时刻无关性,我们只需要丢给它们一个单一量(D)表示最大空余天数就可以了。
    注意这个天数为何要取最大?因为这个天数是益多不宜少的。毕竟时间多的话可以拿来刷水题,少的话就要gg了。

    得到的天数以后,我们可以考虑对大佬的事情。
    首先我们发现把1号操作单独作为一种决策太浪费了,毕竟它是那样的有规律。我们不妨将1号操作扔进最后的状态判断里。
    现在不管一号操作,我们就只有最多两次怼的机会。最多两次?最多两次?
    看到这里应该已经能想到单调性了。如果我们第一次怼多,第二次必然怼少,才能满足要求。那么,究竟要满足什么样的要求呢?

    我们这样考虑。假设第一次怼的消耗与天数分别是(f_i, d_i),第二次是(f_j, d_j),那么显然有
    (f_i+f_j <= c)
    同时还有
    (f_i+f_j+(D-d_i-d_j)>=c)
    将第二个式子变形为
    (f_i-d_i+f_j-d_j>=c-D)

    使用尺取法。在以(f)为第一关键字排序后,将(j)从右向左扫描,同时不断更新合法的(i)。考虑到如果一个(i)合法,那么任意(k<=i)必然合法,于是我们记录一个前缀最大值,但是记录的是(f_k+d_k (k<=i))的最大值。每刷出((i,j))的时候,用这个值去更新答案,看看是否大于(c-D)。如果大于那么该情况成立。否则继续直到大于为止。如果找不到,那就意味着该情况不成立了。

    #include<bits/stdc++.h>
    using namespace std;
    const int Mod=2332831, Multi=1000007;
    
    int n,m,mc,a[1005],w[1005],c[1005],b[1005][1005],D,C;
    struct Dui { int f,d,l; };
    Dui makedui(int _f,int _d,int _l) {Dui ret;ret.f=_f;ret.d=_d;ret.l=_l;return ret;}
    vector <Dui> dui;
    bool cmp(const Dui &a, const Dui &b) {
    	return a.f==b.f?a.d<b.d:a.f<b.f;
    }
    bool equ(const Dui &a, const Dui &b) {
    	return a.f==b.f;
    }
    struct Hashchecker{
    	vector <pair<int,int> > tab[Mod+2];
    	void insert(int x,int y) {
    		int key=(x+y*Multi)%Mod;
    		tab[key].push_back(make_pair(x,y));
    	}
    	bool query(int x,int y) {
    		int key=(x+y*Multi)%Mod;
    		for(int i=0;i<tab[key].size();i++)
    			if(tab[key][i].first==x && tab[key][i].second==y)
    				return true;
    		return false;
    	}
    } mp;
    
    queue <Dui> q;
    void bfs() {
    	q.push(makedui(1,1,0)); dui.push_back(makedui(1,1,0));
    	mp.insert(1,1);
    	while(q.size()){
    		Dui p=q.front(); q.pop();
    		if(p.d>=D) break;
    		Dui now1=makedui(p.f,p.d+1,p.l+1);
    		q.push(now1);
    		if((long long)p.f * (long long)p.l>C) continue; 
    		Dui now2=makedui(p.f*p.l,p.d+1,p.l);
    		if(now2.f==0||now2.l==0) continue;
    		if(!mp.query(now2.f,now2.d))
    			q.push(now2), mp.insert(now2.f,now2.d),
    			dui.push_back(makedui(now2.f,now2.d,now2.l));
    	}
    }
    
    int main() {
    	cin>>n>>m>>mc;
    	for(int i=1;i<=n;i++) cin>>a[i];
    	for(int i=1;i<=n;i++) cin>>w[i];
    	for(int i=1;i<=m;i++) cin>>c[i],C=max(C,c[i]);
    	for(int i=1;i<=n;++i)
            for(int j=a[i];j<=mc;++j){
                b[i][j-a[i]]=max(b[i-1][j]+1,b[i][j-a[i]]);
                b[i][min(j-a[i]+w[i],mc)]=max(b[i-1][j],b[i][min(j-a[i]+w[i],mc)]);
            } 
    	for(int i=1;i<=n;i++) {
    		for(int j=0;j<=mc;j++)
    			/*cout<<b[i][j]<<" ",*/ D=max(b[i][j],D);
    		//cout<<endl;	
    	}
    	//cout<<"!!!" << D<<endl;
    	bfs();
    	//cout<<dui.size()<<endl;
    	int avg=0;
    	for(int i=0;i<Mod;i++) avg=max(avg,(int) mp.tab[i].size());
    	//cout<<avg<<endl; 
    	dui.push_back(makedui(1,1,0));
    	dui.push_back(makedui(0,0,0));
    	sort(dui.begin(),dui.end(),cmp);
    	vector <Dui>::iterator new_end = unique(dui.begin(),dui.end(),equ);
    	dui.erase(new_end,dui.end());
    	//cout<<dui.size()<<endl;
    	//for(int i=0;i<dui.size();i++) cout<<dui[i].f<<" "<<dui[i].d<<" "<<dui[i].l<<endl;
    	for(int i=1;i<=m;i++) {
    		int uc=c[i],flag=0;
    		int pin1=0,pin2=dui.size()-1,mx=-1e+8;
    		for(;pin2>=0;--pin2) {
    			while(dui[pin1].f+dui[pin2].f<=uc) { mx=max(mx,dui[pin1].f-dui[pin1].d); pin1++; }
    			if(pin1>pin2) break;
    			//cout<<"pin1 = "<<pin1<<" , pin2 = "<<pin2<<" , mx = "<<mx<<endl;
    			if(pin1 && mx+dui[pin2].f-dui[pin2].d>=uc-D) {flag=1; break;}
    		}
    		cout<<flag<<endl;
    	}
    }
    
  • 相关阅读:
    Nginx 提示host not found in upstream 错误解决方法
    使用Vmware CLI 6.5控制虚拟机,并做快照
    在 Windows服务器中启用/禁用SMBv1、SMBv2和SMBv3的方法
    使用python调用wps v9转换office文件到pdf
    Tomcat延迟启动
    配置frp
    PowerDesigner逆向生成MYSQL数据库表结构总结
    windows下载安装MariaDB10.2.17 绿色版
    Mosquitto --topic
    Jmeter也能IP欺骗!
  • 原文地址:https://www.cnblogs.com/mollnn/p/12324388.html
Copyright © 2020-2023  润新知