首页 > 其他分享 >[QOJ 6355] 5

[QOJ 6355] 5

时间:2024-09-07 23:26:44浏览次数:4  
标签:6355 return int vector getchar QOJ dp define

发现至少有 \(\frac{S}{5}\) 个 \(1\),所以考虑维护 \((k,T-k)\) 的对数,然后二进制拆分+维护区间连续段背包 dp 即可。

点击查看代码
#include<bits/stdc++.h>
#define fir first
#define sec second
#define int long long
#define lowbit(x) x&(-x)
#define mkp(a,b) make_pair(a,b)
using namespace std;
typedef pair<int,int> pir;
inline int read(){
	int x=0,f=1; char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-1; c=getchar();}
	while(isdigit(c)){x=x*10+(c^48); c=getchar();}
	return x*f;
}
const int inf=1e18,N=2e5+5;
int n,S;
int a[N],cnt[N],op,ans;
vector<pir> dp[N*2];
inline int P(int x){return x+n;}
inline void merge(vector<pir> &x,int L,int R){
    if(x.empty()){x.push_back(mkp(L,R));return ;}
    vector<pir> y; y.clear();
    for(auto [l,r]:x){
        if(r<L||R<l){y.push_back(mkp(l,r));continue;}
        L=min(L,l),R=max(R,r);
    }
    y.push_back(mkp(L,R));
    swap(x,y);
}
inline void upd(int val,int siz){
    if(val>0){
        for(int i=S;i>=-op;i--){
            if(dp[P(i)].empty()) continue;
            for(auto [l,r]:dp[P(i)])
            merge(dp[P(i+val)],l+siz,r+siz);
        }   
    }
    else{
         for(int i=-op;i<=S;i++){
            if(dp[P(i)].empty()) continue;
            for(auto [l,r]:dp[P(i)])
            merge(dp[P(i+val)],l+siz,r+siz);
        }
    }
}
signed main(){
    n=read(),S=read();
    for(int i=1;i<=n;i++) a[i]=read(),cnt[a[i]]++;
    dp[P(0)].push_back(mkp(0,cnt[1]));
    op=cnt[0];
    for(int i=0;i<=S;i++){
        if(!cnt[i]||i==1) continue;
        for(int w=1;w<=cnt[i];w<<=1){
            int val=i*w-w;
            cnt[i]-=w;
            upd(val,w);
        }
        if(cnt[i]) upd(cnt[i]*i-cnt[i],cnt[i]);
    }
    for(int i=-op;i<=S;i++){
        for(auto [l,r]:dp[P(i)]) ans+=(r-l+1);
    }
    cout<<ans<<'\n';
}

标签:6355,return,int,vector,getchar,QOJ,dp,define
From: https://www.cnblogs.com/Cyan0826/p/18402317

相关文章

  • Qoj 9111 Zayin ans String / ABC 356 E
    Qoj9111ZayinansString/ABC356E谨以此帖记录一个有意思的Trick题意给了一个长度为\(n\)的目标串\(s\)和\(m\)个模式串每个模式串有一个价值\(v\)要求从\(s\)中选出一个子序列\(t\),定义\(t\)的价值为他的所有子串的价值和(若该子串没出现在模式串中,那么......
  • QOJ #9222. Price Combo
    题面传送门假设只有一维,那么肯定是最奇数大的买,第偶数大的不买,以此类推。但是现在有两维,如果只对一维做的话,另一维的顺序是不固定的,不好处理。我们考虑发掘一点性质,假设对于两个物品\((a_i,b_i),(a_j,b_j)\),如果满足\(a_i\leqa_j,b_i\geqa_j\),则肯定不会\(i\)用\(b\)买......
  • QOJ5089
    关于fwt的直接计算式:or:\(fwt(a)_i=\sum_{j\subseteqi}a_j\)and:\(fwt(a)_i=\sum_{i\subseteqj}a_j\)xor:\(fwt(a)_i=\sum_{j}(-1)^{|i\capj|}a_j\)关于ifwt的直接计算式:or和xor就是子集反演(容斥)xor发现就是每次都会多乘一个\(\frac{1}{2}\):\(ifwt(a)_i=\frac{......
  • qoj8546题解补充
    题解中第二种解法并没有具体解释是如何归纳的(害笔者想了两天两夜),这里给一个证明。考虑答案为(n,n)时,只需要全取max即可,接下来我们从n往n-1归纳,接下来所有位置初始都是取max的情况1:a中的n和b中的n在同一个位置上,我们只需在这个位置上取min即可归纳到n-1,那么接下来我们钦定不会......
  • QOJ #8673. 最短路径
    题面传送门一年前,折戟沉沙,后面忘了。首先我们考虑折半搜索去做这个题。对于\(x\),在正向的图上跑Dijkstra,对于\(y\),在反图上跑Dijkstra。当两边搜到同一个点的时候,所有的最短路都可以表示成:\(x\tox'\toy'\toy\),其中\(x'\)是\(x\)已经扩展过的点,\(y'\)是\(y\)已经扩......
  • QOJ6504 Flower‘s Land 2 题解
    QOJ6504Flower'sLand2题解题目链接:QOJ6504Flower'sLand2题意:给定一个只包含\(0,1,2\)的序列,\(T\)次询问,询问有两种:区间所有数加\(1\)然后模\(3\)求一段区间能否通过每次删掉相邻两个相同的数删完(如\(1,0,0,2,2,1\)就满足条件)题解:考虑用什么方法来维护区间......
  • QOJ5090 妙妙题
    将白色看作\(0\),黑色看作\(1\),并将所有人等距离排在圆上,若知道所有人颜色的异或和,就可以根据自己看见的颜色集合判断自己的颜色,且将圆等切为两半一定有少的一边的人数\(\ge\lfloor\frac{n-1}{2}\rfloor\),但若圆两边的黑点关于切线翻转对称(如下图),则会出现看到颜色相同的两人......
  • QOJ7899 Say Hello to the Future
    考虑先求出原序列的方案数设\(f_i\)表示\(1\simi\)被划分为若干区间的方案数,若一段区间合法当且仅当\(r-l+1\ge\max\{a_{l\simr}\}\),可以发现数据结构难以维护且由于不是最优性问题,考虑\(\texttt{cdq}\)分治优化对于每个分治中心\(m\),令\(mxL_i=\max\{a_{i\si......
  • solution - qoj8794
    (Un)labeledgraphs题解orzjiangly通信题。不禁让人想到。对于这道题目,考虑要还原原来的点的编号,而题目条件里有一个。还是非常明显,发现我们可以搞出一排新的点让它们构成一条新的链。然后第\(i\)个点往原图中编号为\(u\)的点连边,满足\(u\&2^{i-1}\)。现在我们需要......
  • qoj8225 最小值之和 题解
    题目链接点击打开链接题目解法很牛的题啊从\(f\)序列的最小值切入,考虑把\(f_i:=f_i-f_{min}\),会对\(f'\)造成什么影响?发现会使\(f'\)中的每个数都减去\((n-1)f_{min}\),且会把原问题分成\([1,min]\)和\([min+1,r]\)这两个完全相同的子问题于是考虑区间\(dp\),令......