博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2017北京国庆刷题Day7 afternoon
阅读量:4983 次
发布时间:2019-06-12

本文共 3732 字,大约阅读时间需要 12 分钟。

期望得分:100+30+100=230

实际得分:60+30+100=190

排序去重

固定右端点,左端点单调不减

考场上用了二分,没去重,60

#include
#include
#include
using namespace std;#define N 100001void read(int &x){ x=0;char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }}struct node{ int a,b; bool operator < (node q) const { if(a!=q.a) return a
n) last++; mx=max(mx,l-last+1); } printf("%d\n",n-mx);}
View Code

 

记录所有子集的最后出现位置

对于每个ai,枚举ai的子集,若最后出现位置<i-bi,ans++

枚举子集复杂度:

for(int s=1;s<(1<<n);s++)

  for(int i=s;i;i=(i-1)&s)

这两个循环的复杂度为3^n

因为对于n个二进制位,要么属于s不属于i,要么属于s属于i,要么不属于s

#include
#include
#define N 100001using namespace std;void read(int &x){ x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }}int pos[N];int main(){ freopen("test.in","r",stdin); freopen("test.out","w",stdout); int n,a,b,ans; read(n); for(int i=1;i<=n;i++) { ans=0; read(a); read(b); for(int j=a;j;j=(j-1)&a) { if(pos[j]
View Code

 

套路,tarjan+拓扑排序/单源最短路

#include
#include
#include
#include
#define N 500001using namespace std;int n,m,S;int val[N];int front[N],to[N],nxt[N],tot,from[N];int dfn[N],low[N],st[N],top;bool ins[N];int id[N],cnt,sum[N];int nxt2[N],front2[N],to2[N],tot2;int q[N];int in[N],dp[N];void read(int &x){ x=0;char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }}void add(int u,int v){ if(u==v) return; for(int i=front[u];i;i=nxt[i]) if(to[i]==v) continue; to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; from[tot]=u;}void init(){ read(n);read(m); int u,v; for(int i=1;i<=m;i++) { read(u); read(v); add(u,v); } for(int i=1;i<=n;i++) read(val[i]); read(S);}void tarjan(int x){ dfn[x]=low[x]=++tot; st[++top]=x; ins[x]=true; for(int i=front[x];i;i=nxt[i]) if(!dfn[to[i]]) tarjan(to[i]),low[x]=min(low[x],low[to[i]]); else if(ins[to[i]]) low[x]=min(low[x],dfn[to[i]]); if(low[x]==dfn[x]) { id[x]=++cnt; sum[cnt]+=val[x]; while(top && st[top]!=x) { id[st[top]]=cnt; sum[cnt]+=val[st[top]]; ins[st[top--]]=false; } ins[st[top--]]=false; }}void add2(int u,int v){ to2[++tot2]=v; nxt2[tot2]=front2[u]; front2[u]=tot2; in[v]++;}void rebuild(){ for(int i=1;i<=m;i++) if(id[from[i]]!=id[to[i]]) add2(id[from[i]],id[to[i]]);}void pre(){ memset(ins,false,sizeof(ins)); int h=0,t=1; q[++h]=id[S]; ins[id[S]]=true; int now; while(h<=t) { now=q[h++]; for(int i=front2[now];i;i=nxt2[i]) if(!ins[to2[i]]) ins[to2[i]]=true,q[++t]=to2[i]; } for(int i=1;i<=cnt;i++) if(!ins[i]) for(int j=front2[i];j;j=nxt2[j]) in[to2[j]]--; }void topsort(){ st[top=1]=id[S]; dp[id[S]]=sum[id[S]]; int now; while(top) { now=st[top--]; for(int i=front2[now];i;i=nxt2[i]) { dp[to2[i]]=max(dp[to2[i]],dp[now]+sum[to2[i]]); in[to2[i]]--; if(!in[to2[i]]) st[++top]=to2[i]; } }}void answer(){ int ans=0,k,x; read(k); for(int i=1;i<=k;i++) { read(x); ans=max(ans,dp[id[x]]); } printf("%d\n",ans);}int main(){ freopen("save.in","r",stdin); freopen("save.out","w",stdout); init(); tot=0; for(int i=1;i<=n;i++) if(!dfn[i]) top=0,tarjan(i); rebuild(); pre(); topsort(); answer();}
View Code

 

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/7635503.html

你可能感兴趣的文章
第三节:使用Log4net和过滤器记录异常信息,返回异常给前端
查看>>
fedora的选择
查看>>
AlphaPose论文笔记《RMPE: Regional Multi-person Pose Estimation》
查看>>
模糊查询和聚合函数
查看>>
[批处理]批量将文件名更名为其上级目录名
查看>>
如何查找ORACLE中的跟踪文件
查看>>
SQL Server将一列的多行内容拼接成一行
查看>>
Spring Controller RequestMapping
查看>>
socket
查看>>
小程序 跳转问题 (来源见注明)
查看>>
JBPM4入门——9.自动节点单线执行
查看>>
//停止关联的进程
查看>>
SQL 生成公曆和農曆對照數據,公曆查找農曆和農曆查找公曆函數
查看>>
为何场效应管要用UGD与UGS(off)来比较判断夹断情况?
查看>>
.pem证书转xml格式字符串(.net)
查看>>
js构建ui的统一异常处理方案(二)
查看>>
三线程连续打印ABC
查看>>
ECharts
查看>>
初识网络爬虫
查看>>
git push 时不用每次都输入密码的方法
查看>>