gym102219

看到同学吃鸡了就vp康康。

被两道dp搞死了,两个没什么人过的题都没看,估计也不会。

那么为什么别人AK了呢。。。

手速还是凑合的。。。音游狗(错乱)

E就是个背包记录一下方案,暴力比较字典序即可。

 1 #include <bits/stdc++.h>
 2 #define pii pair<int,int>
 3 #define mk(a,b) make_pair(a,b)
 4 #define rep(jiantongyingtxdy) for(int i=1;i<=jiantongyingtxdy;i++)
 5 using namespace std;
 6 typedef long long ll;
 7 const int N = 3e5+5;
 8 int t,n;int a[105],dp[4396];
 9 vector<int> pre[4396];
10 int main(){
11     ios::sync_with_stdio(false);
12     while (cin>>t){
13         if(t==0)return 0;
14         memset(dp,0, sizeof(dp));
15         memset(pre,0, sizeof(pre));
16         cin>>n;
17         for(int i=1;i<=n;i++)cin>>a[i];
18         for(int i=1;i<=n;i++){
19             for(int j=t;j>=a[i];j--){
20                 if(dp[j]<dp[j-a[i]]+a[i]){
21                     dp[j]=dp[j-a[i]]+a[i];
22                     pre[j]=pre[j-a[i]];
23                     pre[j].push_back(i);
24                 }else if(dp[j]==dp[j-a[i]]+a[i]){//比较pre[j-a[i]] 和pre[j]
25                     int f=1;
26                     for(int k=0;k<min(pre[j].size(),pre[j-a[i]].size());k++){
27                         if(pre[j][k]<pre[j-a[i]][k]){
28                             f=0;
29                             break;
30                         }else if(pre[j][k]>pre[j-a[i]][k]){
31                             f=2;
32                             break;
33                         }
34                     }
35                     if(f==2){
36                         pre[j]=pre[j-a[i]];
37                         pre[j].push_back(i);
38                     }
39                 }
40             }
41         }
42 //        for(int i=10;i>=1;i--){
43 //            for(auto x:pre[i]){
44 //                cout<<x<<' ';
45 //            }
46 //            cout<<endl;
47 //        }
48         int ans = *max_element(dp+1,dp+1+t);
49         for(auto x:pre[ans]){
50             cout<<a[x]<<' ';
51         }
52         cout<<ans<<endl;
53 //        int ppp=ans;
54 //        for(int i=n;i>=1;i--){
55 //            if(dp[ans]==dp[ans-a[i]]+a[i]){
56 //                cout<<a[i]<<' ';
57 //                ans-=a[i];
58 //            }
59 //        }
60 //        cout<<ppp<<endl;
61     }
62 }
View Code

F 我们看到e很小,考虑状压,好像没睡午觉脑子很混乱,两行代码改来改去好久。。

#include <bits/stdc++.h>
#define pii pair<int,int>
#define mk(a,b) make_pair(a,b)
#define rep(jiantongyingtxdy) for(int i=1;i<=jiantongyingtxdy;i++)
using namespace std;
typedef long long ll;
const int N = 3e5+5;
const ll MOD = 1e9+7;
int n,e,k;
ll dp[2005][4396];
set<pii>st;
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>e>>k;int x,y;
    while (k--){
        cin>>x>>y;
        st.insert(mk(x,y));
    }
    dp[0][0]=1;
    int p = 2*e+1,mod=1<<p;
    for(int i=1;i<=n;i++){
        for(int j=0;j<mod;j++){//i-1
            for(int k=0;k<p;k++){//拿第i+k-e个
                if(i+k-e>n||i+k-e<=0)continue;
                if(st.count(mk(i,i+k-e)))continue;
                int b = j>>1;//i
                if(b&(1<<k))continue;
                dp[i][b|(1<<k)]+=dp[i-1][j];
                dp[i][b|(1<<k)]%=MOD;
            }
        }
    }
    ll ans=0;
    for(int i=0;i<mod;i++){
        ans+=dp[n][i];
        ans%=MOD;
    }
    cout<<ans<<endl;
}
View Code

然后就挂机打cf了。。。好气啊E题再给我10秒钟我就改完了。。搜了个单调队列的板子MLE了、、、然后没优化完就gg了。。。早知道不看F了。。。。

话说闵可夫斯基和 这几个性质我好像也都知道,,怎么就完全不会呢。。。

是个人都紫了。我还是退役吧。CGR4肯定又要掉100多。(

posted @ 2019-07-18 01:21  MXang  阅读(345)  评论(0编辑  收藏  举报