19-11-11-|
前言不多说。
就3天了,不如……
|
24
|
Miemeng | 100
00:00:02
|
60
00:00:03
|
20
00:00:04
|
180
00:00:04
|
序:
——如何抢绿框?
好,既然有人催我写,我就……写下。
考试开始先打开三个题,然后下面有一个上传文件(其实提交框也挺好就是比较费心)
然后二话不说先把考试文件夹里的三个文件目录搞进去(先创建一个空的)
然后最后覆盖好就行了……
然后最后看一下时间剩$10s$的时候先冷静一下,然后在预先准备好的三个页面里摁 end 。
然后时间一到(最好先在比赛页刷新以保证正常提交)
在第一个页面摁提交,然后 Ctrl + Tab 跳下一个,然后重复这个操作,
如果足够冷静(我不够)就可以一秒内交三个代码辣,可以看我以前(很早)的赛事榜我一直一两秒交代码,
就像写了脚本一样!
ZJ:
$\mathsf{UOJ}$的$404$真好用
倒计时了……
于是有点紧张。
不管了。
开题。
T1最大或??或?于是觉得是贪心,码了码,挂个对拍,发现有点伪,又重构了一下,挺好。
T2,$\mathsf{dpsb}$直面死亡$\mathsf{dp}$,丢了一个背包上去。挂了一个对拍,非常兴奋(得60分真××兴奋)
T3联合权值??
看半天才看懂题,觉得可能可以使用 bitset ,但是只码了暴力。
检查了文件名,调试语句等等,
最后抢了一个绿框。
TJ:
T1:
尽量使用与$B$位数相反的数。
先使用一个最大的但比$B$小的$2^x-1$试一下(解决了$A \leq 2^x-1$的全部)
然后枚举$B$的某一位,并在后面贪心的填$1$
我打的很丑所以复杂度是$\Theta(\log^2 N)$的。
//maxor
#include <iostream>
#include <cstring>
#include <cstdio>
#define LL long long
using namespace std;
LL lowbit(LL x){
return x&(-x);
}
int main(){
#ifndef LOCAL
freopen("maxor.in" ,"r",stdin);
freopen("maxor.out","w",stdout);
#endif
ios_base::sync_with_stdio(false);
int T;
LL a,b;
cin>>T;
while(T--){
cin>>a>>b;
LL p=1,d=0;
if(lowbit(b+1)==b+1){
cout<<b<<endl;
goto nxt;
}
p=1;
while(p<=b)
p<<=1; p--;
if((p>>1)<=b && (p>>1)>=a){
cout<<((p>>1)|b)<<endl;
goto nxt;
}
for(LL i=60;i>=0;i--){
LL k=1ll<<i;
if(k&b){
d|=k;
LL l=d;
// cout<<d<<endl;
for(LL j=i-1;j>=0;j--){
LL t=1ll<<j;
if(!(t&b)){
if((l|t)<=b){
l|=t;
// cout<<l<<endl;
}
}
}
for(LL j=i-1;j>=0;j--){
LL t=1ll<<j;
if(t&b){
if((l|t)<=b){
l|=t;
// cout<<l<<endl;
}
}
}
if(l<=b && l>=a){
cout<<(l|b)<<endl;
goto nxt;
}
}
}
nxt:;
}
}
T2:
考试的是dp
看到$N \leq 40$就是$Meet\ in\ the\ Middle$没错了
于是我们将前面的一半和后面的一半处理出来,
然后排序。
二分答案。
check的时候就直接枚举第一个序列,在第二个上跑单调指针就可以了。
我用了 vector ,所以很慢,也不是很好处理,开两个数组其实更好。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#define N 44
#define M 1111111
#define LL long long
#define LF double
using namespace std;
int pn,arr[M];
LL kth;
LF lim;
vector<LL> fr,ba;
LL getval(LL id){
LL nans=0;
int j=(int)ba.size();
// cout<<ba.size()<<endl;
for(int i=0;i<(int)fr.size();i++){
// cout<<i<<" "<<j<<endl;
// cout<<fr[i]<<" "<<ba[j-1]<<endl;
while(j>0 && fr[i]+ba[j-1]>=id)j--;
// cout<<i<<"="<<j<<endl;
// cout<<"Del"<<ba.size()-j<<endl;
nans+=(int)ba.size()-j;
}
// cout<<id<<" "<<nans<<endl;
return nans;
}
int main(){
#ifndef LOCAL
freopen("answer.in" ,"r",stdin);
freopen("answer.out","w",stdout);
#endif
fr.reserve(1<<20);
ba.reserve(1<<20);
LF p=1;
ios_base::sync_with_stdio(false);
cin>>pn>>lim;
for(int i=1;i<=pn;i++){
cin>>arr[i];
p*=2;
}
kth=p-ceil(p*lim)+1;
// cout<<"Kth:"<<kth<<endl;
int lm=pn/2,rm=pn-lm;
// cout<<lm<<" "<<rm<<endl;
for(int s=0;s<1<<lm;s++){
LL va=0;
for(int i=1;i<=lm;i++){
int j=1<<(i-1);
if(s&j)va+=arr[i];
}
fr.push_back(va);
}
for(int s=0;s<1<<rm;s++){
LL va=0;
for(int i=1;i<=rm;i++){
int j=1<<(i-1);
if(s&j)va+=arr[i+lm];
}
ba.push_back(va);
}
sort(fr.begin(),fr.end());
sort(ba.begin(),ba.end());
// cout<<"Fr";for(auto i:fr)cout<<i<<" ";cout<<endl;
// cout<<"Ba";for(auto i:ba)cout<<i<<" ";cout<<endl;
// cout<<getval(2)<<endl;
// return 0;
LL l=0,r=40004000;
while(l<r){
// cout<<l<<" "<<r<<endl;
LL mid=(l+r+1)/2;
if(getval(mid)>=kth)
l=mid;
else
r=mid-1;
}
cout<<l<<endl;
}
T3
贪心思想的dp
先咕掉。

浙公网安备 33010602011771号