NOIP 模拟 14
1.CSP 模拟 02.CSP 模拟 13.CSP 模拟 24.CSP 模拟 35.CSP 模拟 46.CSP 模拟 57.CSP 模拟 68.CSP 模拟 79.CSP 模拟 810.CSP 模拟 911.CSP 模拟 1012.CSP 模拟 2413.CSP 模拟 2514.CSP 模拟 2615.CSP 模拟 2716.CSP 模拟 2817.CSP 模拟 2918.CSP 模拟 3019.CSP 模拟 3120.CSP 模拟 3221.CSP 模拟 3322.CSP 模拟 3423.CSP 模拟 3524.CSP 模拟 3625.CSP 模拟 3726.CSP 模拟 3827.CSP 模拟 3928.CSP 模拟 4029.CSP 模拟 4130.CSP 模拟 4231.CSP 模拟 4332.CSP 模拟 4433.CSP 模拟 4534.CSP 模拟 4635.CSP 模拟 4736.CSP 模拟 4837.CSP 模拟 4938.CSP 模拟 5039.CSP 模拟 5140.CSP 模拟 5241.CSP 模拟 5342.CSP 模拟 5443.NOIP 模拟 144.NOIP 模拟 245.NOIP 模拟 346.NOIP 模拟 447.NOIP 模拟 548.NOIP 模拟 649.NOIP 模拟 750.NOIP 模拟 851.NOIP2024(欢乐)加赛 352.NOIP 模拟 953.NOIP 模拟 1054.NOIP 模拟 1155.NOIP 模拟 1256.NOIP 模拟 13
57.NOIP 模拟 14
58.NOIP 模拟 1559.NOIP 模拟 1660.NOIP 模拟 17A 草莓
直接贪。
B 三色
发现是有限制的动态规划问题,
#include<bits/stdc++.h> #define int long long #define fi first #define se second #define pii std::pair<int,int> #define eb emplace_back #define pb push_back typedef long long ll; typedef unsigned long long ull; std::mt19937 myrand(std::chrono::high_resolution_clock::now().time_since_epoch().count()); inline int R(int n){return myrand()%n+1;} inline int read(){char ch=getchar();int x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);return x*f;} const int N=5e3+10,mod=1e9+7,inf=1e9,ny=500000004; inline void Min(int &x,int y){if(x>y)x=y;} inline void Max(int &x,int y){if(x<y)x=y;} inline void W(int &x,int y){x=(x+y)%mod;} inline bool check(int l,int i,int r){return i>=l&&i<r;} int n,m,s[N],t[N]; std::vector<pii> v[N]; std::vector<int> f,p,q,A[N],B[N];// f存的是值,A,B 存的是相应行列的值的下标,s 就是上文所说。 inline void insert(int x,int y,int v){ if(!v)return ; int b=f.size();f.eb(v),p.eb(x),q.eb(y); A[x].eb(b),B[y].eb(b);W(s[x],v),W(s[y],v); }// insert 相当于 f[x][y]=v signed main(){ freopen("color.in","r",stdin);freopen("color.out","w",stdout); std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0); int T=read();while(T--){ n=read(),m=read(); for(int i=1;i<=m;++i){int l=read(),r=read(),x=read();v[r].pb({l,x});} insert(0,0,1); for(int i=0;i<=n;++i){ int la=0,lb=0,ra=i,rb=i; for(auto it:v[i]){ int p=it.fi,x=it.se; if(x==3)Max(la,p),Max(lb,p); if(x==2)Max(la,p),Min(rb,p-1); if(x==1)Min(ra,p-1),Min(rb,p-1); } for(int j=0;j<=i;++j){ if(j>=la&&j<=ra)continue; for(int x:A[j])W(s[p[x]],-f[x]),W(s[q[x]],-f[x]),f[x]=0; A[j].clear();// 如果不满足限制,更新信息 } for(int j=0;j<=i;++j){ if(j>=lb&&j<=rb)continue; for(int x:B[j])W(s[p[x]],-f[x]),W(s[q[x]],-f[x]),f[x]=0; B[j].clear(); } if(i==n)break; for(int j=0;j<=i;++j)t[j]=s[j]; for(int j=0;j<=i;++j)insert(i,j,t[j]);//转移新的一行 }int ans=0; for(int i=0;i<=n;++i)W(ans,s[i]),s[i]=0,A[i].clear(),B[i].clear(),v[i].clear(); f.clear(),p.clear(),q.clear(); std::cout<<(ans*ny%mod+mod)%mod<<'\n'; } }
C 博弈
只有三个值,首先考虑都不相等的情况,在图上就是三个点。当两点关于一点对称时:
先手必胜,直接移到同一个位置即可,然后不对称的时候,可以移动
对于两个数相同的情况,设差为 lowbit
在偶数位置上的时候先手必胜。
然后正难则反,对于 lowbit
,这个本质上就是异或,直接在 trie
树上找就行了,这里的 trie
树要从低位插。
D 后缀数组
不会。
总结
没啥好说的,睡觉场,不过没接触过有限制的 DP 转移,没想到直接不转移就行了,然后博弈论打出表来居然不觉得互不相同就能必胜,太唐了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具