NOIP模拟54
我觉得,不改变也很好。
前言
这题太难了,场上竟然无人切题。。(听说别的学校切题的人不少。。
T1 选择
解题思路
范围比较小,并且每个边的度也比较小,因此考虑 树形DP+状压 。
大概就是对于每一个节点可以从它的子树连接到外面的路径显然只有一条。
他每两个儿子节点的子树中可以通过它连接的也是只有一条,
因此我们记录每一个子树中没有用过的节点,每次按上述方法匹配两个子结点的子树相连的路径。
同时也要统计子树中没有用过的节点到现在 DP 到的子树根节点是否有一条路径。
对于每一棵子树分别记录贡献就好了,对于子树内的 DP 转移可以通过枚举子集来实现。
code
#include<bits/stdc++.h> #define int long long #define ull unsigned long long #define f() cout<<"Failed"<<endl using namespace std; inline int read() { int y;scanf("%lld",&y);return y; int x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f; } const int N=1e3+10; int n,ans,m,f [(1<<10)+10]; bool vis ; vector<int> v ,emp ; void add_edge(int x,int y){v[x].push_back(y);} void dfs(int x,int fa) { for(int i=0;i<v[x].size();i++) if(v[x][i]!=fa) dfs(v[x][i],x); for(int i=0;i<v[x].size();i++) { int to1=v[x][i];if(to1==fa) continue; for(int j=0;j<emp[to1].size();j++) for(int p=i+1;p<v[x].size();p++) { int to2=v[x];if(to2==fa) continue; for(int q=0;q<emp[to2].size();q++) if(vis[emp[to1][j]][emp[to2][q]]) { f[x][(1<<i)|(1<<p)]=1; break; } } } for(int i=0;i<v[x].size();i++) for(int j=0;j<emp[v[x][i]].size();j++) if(vis[x][emp[v[x][i]][j]]) f[x][1<<i]=1; int U=(1<<v[x].size())-1; for(int sta=1;sta<=U;sta++) for(int i=sta;i;i=(i-1)&sta) f[x][sta]=max(f[x][sta],f[x][i]+f[x][i^sta]); ans+=f[x][U]; for(int i=0;i<v[x].size();i++) if(f[x][U]==f[x][U^(1<<i)]) for(int j=0;j<emp[v[x][i]].size();j++) emp[x].push_back(emp[v[x][i]][j]); emp[x].push_back(x); } signed main() { freopen("select.in","r",stdin); freopen("select.out","w",stdout); n=read(); for(int i=1,x,y;i<n;i++) x=read(),y=read(),add_edge(x,y),add_edge(y,x); m=read(); for(int i=1,x,y;i<=m;i++) x=read(),y=read(),vis[x][y]=vis[y][x]=true; dfs(1,0); printf("%lld",ans); return 0; }
T2 表格
解题思路
[p]code
#include<bits/stdc++.h> #define int long long #define ull unsigned long long #define f() cout<<"Failed"<<endl using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f; } const int mod=1e9+7; int n,m,ans,l,r; struct Node{int x,y;}f[10],g[10],h[10]; int power(int x,int y){x=x%mod; y=y%(mod-1);int temp=1;while(y){if(y&1) temp=temp*x%mod;x=x*x%mod; y>>=1;}return temp;} int F(int x){return (n-x)*(x-1)%mod;} int G(int x){return (m-x)*(x-1)%mod;} void init_f(){f[0]=(Node){2,F(2)};for(int i=1;i<4;i++) f[i]=(Node){i+2,(f[i-1].y+F(i+2))%mod};} void init_g(){g[0]=(Node){2,G(2)};for(int i=1;i<4;i++) g[i]=(Node){i+2,(g[i-1].y+G(i+2))%mod};} int Gi(int x) { int rec=0; x=x%mod; for(int i=0,sum=g[i].y;i<4;i++,sum=g[i].y) { for(int j=0;j<4;j++) if(i!=j) sum=sum*power(g[i].x-g[j].x+mod,mod-2)%mod*(x-g[j].x+mod)%mod; rec=(rec+sum)%mod; } return rec; } void init_h(int x){h[0]=(Node){2,F(2)*Gi(x-2)%mod};for(int i=1;i<7;i++) h[i]=(Node){i+2,(h[i-1].y+F(i+2)*Gi(x-i-2))%mod};} int Fi(int x) { int rec=0; x=x%mod; for(int i=0,sum=f[i].y;i<4;i++,sum=f[i].y) { for(int j=0;j<4;j++) if(i!=j) sum=sum*power(f[i].x-f[j].x+mod,mod-2)%mod*(x-f[j].x+mod)%mod; rec=(rec+sum)%mod; } return rec; } int Hi(int x) { int rec=0; x=x%mod; for(int i=0,sum=h[i].y;i<7;i++,sum=h[i].y) { for(int j=0;j<7;j++) if(i!=j) sum=sum*power(h[i].x-h[j].x+mod,mod-2)%mod*(x-h[j].x+mod)%mod; rec=(rec+sum)%mod; } return rec; } int solve(int lim) { ans=0; init_h(lim/2); if(min(lim/2-m,n-1)-2>=0) ans=Fi(min(lim/2-m,n-1))*Gi(m-1)%mod; if(max(2ll,min(lim/2-m,n-1)+1)<=min(n-1,lim/2)) ans=(ans+Hi(min(n-1,lim/2))-Hi(max(2ll,min(lim/2-m,n-1)+1)-1)+mod)%mod; return 6*ans%mod; } signed main() { freopen("table.in","r",stdin); freopen("table.out","w",stdout); n=read(); m=read(); l=read(); r=read(); init_f(); init_g(); printf("%lld",(solve(r)-solve(l-1)+mod)%mod); return 0; }
T3 黑白
大坑未补
T4 打怪
解题思路
CDQ 维护斜率
每只怪需要被攻击的时间是 c_i=\lfloor\dfrac{d_i-1}{b}\rfloor+1
如果没有秒杀操作的话显然是按照 \dfrac{c_i}{a_i} 从小到大进行攻击。
对于秒杀操作的话,如果只秒杀一只怪伤害值就会减少:
那么我们就可以对于一只已经确定要秒杀的怪 i 而言, 再秒杀 j 比秒杀 k 更优的条件是: $$e_i+e_j-c_j\times a_i>e_k+e_i-c_k\times a_i,(j,k<i,c_j>c_k)$$ 也就是 $\dfrac{e_j-e_k}{c_)j-c_k}<a_i$ 斜率优化,CDQ处理,左区间按照 c 排序,右区间按照 a 排序,因为要去纵截距也就是 e 最大,因此维护一个上凸包。 ## code ```cpp #include<bits/stdc++.h> #define int long long #define ull unsigned long long #define f() cout<<"Failed"<<endl using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f; } const int N=3e5+10,INF=1e18; int n,b,ans=INF,prec,sufa
,sta
,sum; struct Node{int a,c,d,e;bool friend operator < (Node x,Node y){return x.c*y.a<y.c*x.a;}}s
; bool comp1(Node x,Node y){return x.a>y.a;} bool comp2(Node x,Node y){return x.c<y.c;} double xl(Node x,Node y){return (1.0*x.e-1.0*y.e)/(1.0*x.c-1.0*y.c);} void CDQ(int l,int r) { if(l==r) return ; int mid=(l+r)>>1,top=0; CDQ(l,mid); CDQ(mid+1,r); sort(s+l,s+mid+1,comp2); sort(s+mid+1,s+r+1,comp1); for(int i=l;i<=mid;i++) { while(top>1&&(s[sta[top]].e-s[i].e)*(s[sta[top-1]].c-s[sta[top]].c)>=(s[sta[top-1]].e-s[sta[top]].e)*(s[sta[top]].c-s[i].c)) top--; sta[++top]=i; } for(int i=mid+1,j=1;i<=r;i++) { while(j<top&&xl(s[sta[j+1]],s[sta[j]])>=s[i].a) j++; ans=min(ans,sum-(s[i].e+s[sta[j]].e-s[sta[j]].c*s[i].a)); } } signed main() { freopen("fittest.in","r",stdin); freopen("fittest.out","w",stdout); n=read(); b=read(); for(int i=1;i<=n;i++)s[i].a=read(),s[i].d=read(),s[i].c=(s[i].d-1)/b+1; sort(s+1,s+n+1); for(int i=1;i<=n;i++) prec[i]=prec[i-1]+s[i].c; for(int i=n;i>=1;i--) sufa[i]=sufa[i+1]+s[i].a; for(int i=1;i<=n;i++) sum+=(prec[i]-1)*s[i].a; for(int i=1;i<=n;i++) s[i].e=s[i].a*prec[i-1]+s[i].a*(s[i].c-1)+s[i].c*sufa[i+1]; CDQ(1,n); printf("%lld",ans); return 0; } ```
- NOIP2016年普及组模拟考试(9.3) 1.笨笨玩游戏
- JZOJ5384. 【NOIP2017提高A组模拟9.23】四维世界 组合数学
- |洛谷|NOIP2011|模拟|P1003 铺地毯
- noip2014 无线网路发射器选址 (模拟)
- 【JZOJ4763】【NOIP2016提高A组模拟9.7】旷野大计算
- 【NOIP2013模拟联考14】图形变换(transform)
- 2016.09.03【初中部 NOIP提高组 】模拟赛C
- 【NOIP2015 11.3模拟】总结
- 【NOIP2016提高A组模拟9.9】运输妹子
- 9.27 数据结构noip模拟——不正常团伙
- 16.9.10 C:3059. 【NOIP2012模拟10.26】雕塑
- 【NOIP2016提高A组模拟9.15】Math
- 【NOIP模拟】数列编辑器
- jzoj5394 【NOIP2017提高A组模拟10.5】Ping
- noip2011 玛雅游戏 大模拟
- 【NOIP模拟】Map
- 洛谷 1311 [NOIP2011] 选择客栈 模拟
- 【NOIP模拟】矩阵
- JZOJ5398. 【NOIP2017提高A组模拟10.7】Adore
- 【NOIP2013模拟】四叶草魔杖