QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#54364 | #1773. Breaking Bars | KING_UT | TL | 269ms | 16400kb | C++20 | 3.7kb | 2022-10-08 02:11:37 | 2022-10-08 02:11:40 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
//#define int ll
using uint=unsigned;
using ull=unsigned long long;
#define gnr(i,a,b)for(int i=int(b)-1;i>=int(a);i--)
#define per(i,b) gnr(i,0,b)
#define rng(i, a, b) for(int i=(int)a;i<(int)b;i++)
#define rep(i,n) rng(i,0,n)
template<class t>using vc=vector<t>;
template<class t>using vvc=vc<vc<t>>;
using vi=vc<int>;
#define a first
#define b second
#define mp make_pair
using vi=vc<int>;
#define pb push_back
#define eb emplace_back
template<class t,class u>bool chmax(t &a,u b){
if(a <b){a=b;return true;}
else return false;
}
template<class t,class u>bool chmin(t &a,u b){
if(a>b){a=b;return true;}
else return false;
}
#define bg begin()
#define ed end()
#define all(x) x.bg,x.ed
#define si(x) int(x.size())
template<class t>void mkuni(vc<t>&vs){
sort(all(vs));
vs.erase(unique(all(vs)),vs.ed);
}
template<class t>int lwb(const vc<t>&vs,t a){
return lower_bound(all(vs),a)-vs.bg;
}
bool inc(int a,int b,int c){return a<=b&&b<=c;}
const int inf=INT_MAX/2-100;
using pi=pair<int,int>;
int getid(int h,int w){
if(h<w)swap(h,w);
return h*(h-1)/2+w-1;
}
const int smax=6;
const int S=smax*(smax+1)/2;
vc<pi> ls[S];
int readid(){
string s;cin>>s;
int res=getid(s[0]-'0',s[2]-'0');
return res;
}
using T=tuple<int,ull,int>;
void reduce(vc<T>&vs){
sort(all(vs));
int s=0;
for(auto [bit,cnt,val]:vs){
if(s==0||get<0>(vs[s-1])!=bit||get<1>(vs[s-1])!=cnt)
vs[s++]=T(bit,cnt,val);
}
vs.resize(s);
}
ull mask(int i){
return (ull(1)<<i)-1;
}
const int cmax=6;
void increment(ull&v,int i){
int cur=(v>>(i*3))&7;
int nx=min(cur+1,cmax);
int dif=cur^nx;
v^=ull(dif)<<(i*3);
}
void slv(){
rng(h,1,smax+1)rng(w,1,h+1){
int idx=getid(h,w);
//vert
rng(i,1,h){
int x=getid(i,w);
int y=getid(h-i,w);
ls[idx].pb(minmax(x,y));
}
//hori
rng(i,1,w){
int x=getid(h,i);
int y=getid(h,w-i);
ls[idx].pb(minmax(x,y));
}
mkuni(ls[idx]);
}
int n,t;cin>>n>>t;
vi rw(S);
rep(i,n)rw[readid()]++;
vc<bool> ok(1<<S);
{
vi f(S);
rng(h,1,smax+1)rng(w,1,h+1)f[getid(h,w)]=h*w;
int tot=0;
rep(i,S)tot+=f[i]*rw[i];
int cur=0;
rep(bit,1<<S){
if(tot-cur>=2*t)ok[bit]=true;
rep(i,S)if(bit&1<<i){
cur-=f[i];
}else{
cur+=f[i];
break;
}
}
}
vi easy(1<<S,inf);
rep(bit,1<<S){
if(ok[bit])easy[bit]=0;
else{
rep(i,S)if(bit&1<<i){
for(auto [x,y]:ls[i]){
chmin(easy[bit],easy[bit^1<<i^1<<x^1<<y]+1);
}
}
}
}
int ans=inf;
int inibit=0;
ull inicnt=0;
rep(i,S){
inicnt+=ull(min(rw[i],cmax))<<(i*3);
if(rw[i]%2)inibit+=1<<i;
}
vc<T> dp[2][cmax+1];
auto push=[&](int tar,int i,int bit,ull cnt,int val){
if(ok[bit]){
chmin(ans,val);
return;
}
chmin(ans,val+easy[bit]);
if(i==-1||val+1>=ans)return;
dp[tar][(cnt>>(i*3))&7].eb(bit,cnt&mask(i*3),val);
};
auto push2=[&](int tar,int i,int c,int bit,ull cnt,int val){
if(ok[bit]){
chmin(ans,val);
return;
}
chmin(ans,val+easy[bit]);
if(i==-1||val+1>=ans)return;
dp[tar][c].eb(bit,cnt&mask(i*3),val);
};
int cur=0;
push(cur,S-1,inibit,inicnt,0);
per(i,S){
int nx=cur^1;
rep(c,cmax+1)dp[nx][c].clear();
per(c,cmax+1){
reduce(dp[cur][c]);
for(auto [bit,cnt,val]:dp[cur][c]){
assert(cnt<(ull(1)<<(i*3)));
}
if(i>0){
for(auto [bit,cnt,val]:dp[cur][c]){
assert(!ok[bit]);
push(nx,i-1,bit,cnt,val);
}
}
if(c>0){
for(auto [bit,cnt,val]:dp[cur][c]){
for(auto [x,y]:ls[i]){
int nxbit=bit^1<<i^1<<x^1<<y;
ull nxcnt=cnt;
increment(nxcnt,x);
increment(nxcnt,y);
push2(cur,i,c-1,nxbit,nxcnt,val+1);
}
}
}
}
cur=nx;
}
cout<<ans<<endl;
}
signed main(){
cin.tie(0);
ios::sync_with_stdio(false);
cout<<fixed<<setprecision(10);
slv();
}
详细
Test #1:
score: 100
Accepted
time: 241ms
memory: 11908kb
input:
16 118 5x6 3x5 4x5 6x3 6x1 1x1 4x5 4x5 2x3 1x2 5x3 5x3 6x2 3x6 5x6 4x2
output:
4
result:
ok single line: '4'
Test #2:
score: 0
Accepted
time: 238ms
memory: 11648kb
input:
6 30 2x3 3x3 1x5 2x5 3x5 3x5
output:
2
result:
ok single line: '2'
Test #3:
score: 0
Accepted
time: 241ms
memory: 11644kb
input:
3 2 1x1 1x1 1x2
output:
1
result:
ok single line: '1'
Test #4:
score: 0
Accepted
time: 238ms
memory: 11568kb
input:
4 25 2x3 3x3 2x5 5x5
output:
2
result:
ok single line: '2'
Test #5:
score: 0
Accepted
time: 242ms
memory: 11592kb
input:
5 10 1x1 1x1 1x1 1x1 4x4
output:
1
result:
ok single line: '1'
Test #6:
score: 0
Accepted
time: 241ms
memory: 11640kb
input:
6 34 1x1 1x2 2x3 3x3 5x5 5x5
output:
2
result:
ok single line: '2'
Test #7:
score: 0
Accepted
time: 262ms
memory: 15388kb
input:
15 70 1x1 1x2 1x3 1x4 1x5 2x2 2x3 2x4 2x5 3x3 3x4 3x5 4x4 4x5 5x5
output:
7
result:
ok single line: '7'
Test #8:
score: 0
Accepted
time: 241ms
memory: 11680kb
input:
11 40 1x1 1x2 1x3 2x3 2x4 4x5 2x2 2x2 1x4 2x4 4x5
output:
3
result:
ok single line: '3'
Test #9:
score: 0
Accepted
time: 246ms
memory: 12952kb
input:
20 74 4x3 5x1 4x2 3x3 1x2 2x1 4x2 1x5 1x1 1x4 1x1 5x5 1x4 4x5 3x2 3x5 1x2 3x4 1x1 2x3
output:
6
result:
ok single line: '6'
Test #10:
score: 0
Accepted
time: 246ms
memory: 13328kb
input:
20 104 4x2 2x3 4x5 5x1 1x3 4x3 1x2 1x1 5x2 5x4 5x5 4x1 5x5 3x5 4x2 3x1 3x1 5x4 2x1 4x4
output:
6
result:
ok single line: '6'
Test #11:
score: 0
Accepted
time: 237ms
memory: 12072kb
input:
13 44 5x4 3x2 3x2 4x1 4x4 1x2 1x5 1x2 1x1 3x5 1x2 1x3 3x2
output:
5
result:
ok single line: '5'
Test #12:
score: 0
Accepted
time: 241ms
memory: 11644kb
input:
5 21 1x3 1x2 5x4 4x4 1x1
output:
3
result:
ok single line: '3'
Test #13:
score: 0
Accepted
time: 248ms
memory: 12888kb
input:
18 77 5x4 4x2 5x5 1x4 3x1 4x3 2x3 1x1 3x4 5x2 5x3 2x2 2x1 2x1 1x2 5x3 3x3 1x4
output:
6
result:
ok single line: '6'
Test #14:
score: 0
Accepted
time: 239ms
memory: 11896kb
input:
9 30 5x2 5x3 1x4 1x4 2x3 1x2 3x3 2x3 4x1
output:
5
result:
ok single line: '5'
Test #15:
score: 0
Accepted
time: 237ms
memory: 11568kb
input:
8 37 2x4 1x3 5x4 5x5 2x4 1x4 1x2 1x4
output:
2
result:
ok single line: '2'
Test #16:
score: 0
Accepted
time: 267ms
memory: 16044kb
input:
19 103 1x5 5x2 2x2 5x4 1x5 1x1 5x5 2x2 2x5 5x4 3x4 3x2 4x4 5x4 5x3 2x2 2x4 4x3 3x3
output:
7
result:
ok single line: '7'
Test #17:
score: 0
Accepted
time: 269ms
memory: 16400kb
input:
19 75 2x1 1x1 5x5 2x4 1x3 2x3 2x2 2x3 4x5 4x3 3x1 4x1 4x2 4x4 5x1 1x4 1x5 5x3 3x1
output:
7
result:
ok single line: '7'
Test #18:
score: 0
Accepted
time: 245ms
memory: 11640kb
input:
20 81 2x3 2x5 5x3 2x1 3x1 5x2 4x5 2x1 1x5 5x2 2x5 1x5 3x2 1x5 1x2 4x2 4x2 5x4 3x2 3x3
output:
2
result:
ok single line: '2'
Test #19:
score: -100
Time Limit Exceeded
input:
47 297 3x5 3x2 1x5 5x6 5x5 5x5 4x2 5x4 4x1 6x2 6x6 5x3 1x2 2x6 6x2 3x3 2x2 2x2 1x4 2x5 5x3 4x4 6x3 3x6 5x4 3x6 3x1 6x1 3x1 1x2 3x4 1x6 6x6 5x3 1x1 5x5 2x1 1x4 5x1 5x6 2x1 4x6 2x2 6x6 2x3 6x1 3x1