TJ - [CF1313D] Happy New Year
[CF1313D] Happy New Year
难度:2500
一,题目:
题目大意:
给你一个长度为
题目会保证若将所有操作都进行后,每个元素最大为
数据范围:
读入格式:
第一行
接下来的
样例输入:
3 5 3 1 3 2 4 3 5
样例输出:
4
二,solution:
先把题意转化一下:
我们可以把
看到这个
不妨设
但是,这个集合
我们设
加入:
for(int j=0;j<k;j++){ if(vis[j]==0){ now=j;//now表示当前处理到的线段对应的二进制位 vis[j]=id;//标记一下,id break; } }
退出:
for(int j=0;j<k;j++){ if(-id==vis[j]){ vis[j]=0;//清空 now=j;//now表示当前处理到的线段对应的二进制位 break; } }
但是
需要优化
我们发现,操作的个数是
不妨把每个操作抽象为两个二元组扫描线
这样子,最多会有
我们在把这些扫描线排序后,很明显,在相邻的两条扫描线中间的元素被覆盖的情况是可以用同一个二进制数表示的。
设
好了,接下来正儿八经的推式子:
设
若这个扫描线为线段的左端点,则:
若这个扫描线为线段的右端点,则:
初始化时,其他
好了,最后注意一下,将扫描线进行排序时,同一个点上,代表右端点的扫描线因该在左端点的扫描线前。
另外,这道题其实可以用将第
代码:
#include<bits/stdc++.h> #define ll long long #define m_p make_pair using namespace std; const int N=1e5+5,K=8; int n,m,k; int f[N*2][(1<<K)];//到第i条线时,用了的线的集合为j,最多高兴的孩子的数量 vector<pair<int,int> > a; int vis[K]; inline int ask(int x){//x二进制下是否有奇数个一。 int sum=0; while(x){ if(x&1) sum++; x>>=1; } return (sum&1); } int main(){ scanf("%d%d%d",&n,&m,&k); int l,r; for(int i=1;i<=n;i++){ scanf("%d%d",&l,&r); a.push_back(m_p(l,i)); a.push_back(m_p(r+1,-i));//处理为两条扫描线 } sort(a.begin(),a.end());//进行排序 //初始化: memset(f,0xcf,sizeof(f)); f[0][0]=0; for(int i=1;i<=n*2;i++){ int id=a[i-1].second; int len= (a[i-1].first==a[n*2-1].first) ? 0 : a[i].first-a[i-1].first;//注意,最后一个点的扫描线代表的区间长度为0 int now;//当前的扫描线在对应的二进制位 if(id<0){//右端点 for(int j=0;j<k;j++){ if(-id==vis[j]){ vis[j]=0; now=j; break; } } for(int j=0;j<(1<<k);j++){ if((j>>now)&1) f[i][j]=0xcfcfcfcf; else f[i][j]=max(f[i-1][j],f[i-1][j^(1<<now)])+len*ask(j); } } else{//左端点 for(int j=0;j<k;j++){ if(vis[j]==0){ now=j; vis[j]=id; break; } } for(int j=0;j<(1<<k);j++){ if((j>>now)&1) f[i][j]=f[i-1][j^(1<<now)]+len*ask(j); else f[i][j]=f[i-1][j]+len*ask(j); } } } cout<<f[n*2][0];//最后一个扫描线一定是代表右端点,则他一定不会被任何一条线覆盖。 return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)